From 9b29edaaa1f8278f3b05c849fb0ea93cc7191ef0 Mon Sep 17 00:00:00 2001 From: genxium Date: Tue, 22 Nov 2022 16:19:04 +0800 Subject: [PATCH 1/6] Added resources for WaterGhost animation. --- .../SoldierWaterGhost.dbproj | Bin 0 -> 87743 bytes .../library/SoldierWaterGhost.json | 1 + .../library/SoldierWaterGhost.png | Bin 0 -> 10874 bytes .../resources/animation/SolderWaterGhost.meta | 7 + .../SoldierWaterGhost_ske.json | 1 + .../SoldierWaterGhost_ske.json.meta | 6 + .../SoldierWaterGhost_tex.json | 1 + .../SoldierWaterGhost_tex.json.meta | 7 + .../SoldierWaterGhost_tex.png | Bin 0 -> 6976 bytes .../SoldierWaterGhost_tex.png.meta | 34 +++++ .../prefabs/ControlledCharacter.prefab | 126 +++++++++++++++++- frontend/assets/scenes/offline_map_1.fire | 2 +- frontend/assets/scripts/OfflineMap.js | 18 ++- 13 files changed, 193 insertions(+), 10 deletions(-) create mode 100644 dragonBonesAnimProjects/SoldierWaterGhost.dbproj create mode 100644 dragonBonesAnimProjects/library/SoldierWaterGhost.json create mode 100644 dragonBonesAnimProjects/library/SoldierWaterGhost.png create mode 100644 frontend/assets/resources/animation/SolderWaterGhost.meta create mode 100644 frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json create mode 100644 frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json.meta create mode 100644 frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json create mode 100644 frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json.meta create mode 100644 frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.png create mode 100644 frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.png.meta diff --git a/dragonBonesAnimProjects/SoldierWaterGhost.dbproj b/dragonBonesAnimProjects/SoldierWaterGhost.dbproj new file mode 100644 index 0000000000000000000000000000000000000000..b2b4ad30529ef6dab4388e2c409e371a5f5fb40d GIT binary patch literal 87743 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�mEl%{bE!cpoISMzJ=o^Ba!=msK~nnGY| z{2av6?!Kk~Q=g>7$W<{0@TcvN6;<(&#%2Pr~@_vVzsntI4w{~YVWN~B{w zWES_T#`Kbobz#jFpAtVuc@j0>Bt1U)B)CBszw*nV$M@#9<&)r{iD64wM+8qIOtHsC zO4{!ylkjvcs9)chn5w-4`X)d`IH&n4AS#44*(GFtO$KIszx_I=!_ztcGPb;{ry-#& zWhJ$|Tb3cTdH4^;mUnD|z>J75U(=VMycx(g-d%zkbxdB;a-+o zrZF?2k~Y^BVbJm4$u4ag_A=w{kL=R0OBv*2qUa>6Xo4;VE@qGg^NLvIkkjFXkt&Lo z86>~Cf{$=2PR(@v$yk)#ZR(XhD;m~AoT${-imERC6Z5qh5UxB97vg{9KdumYDpiw zjs?s?l21aP@S1h$6M(UX%O`QmypB0UqtB4tw$AHlsv@LWJ_#R~FKWYYP|)#UM+u%p zeIJdb9 zFXE7i&i8G6rVO>HXBq2``XttTrn;kYEQRuIhI%N~jcK~BzUUUaH75K+UA9qbH3UD4 z^7~~8sOJ2at(4!36F3qXC%EkZcOppND0$3f38)EIVj_WiRkzV4KW zi6ZWs+`UsZ-@w-d zJX(oHp}cGVXb}H*YS;(*{>Bo4JRb2IL!U+9 z&FXKXOz(a789*gXbhYCJ2P6H)|Ljpk&%}RdTm2lXd-nZ}Q~UFcq0i!Q@?->#n-oqa zMG7bX*`pR4{t!f%8TgMJz<_HVWRjGoHX9W8=OCUV7e7Y%V3UO^R#A7@TuT@qms@(( zByu}hcUb>Jaa~WuApkAKg|=%S07S$^Nr%%oi%d$lqA~onD<&{ToH%tMrF< zfk5MmgclY?J<3f4jA;rPXw`3w_>F)g^vVxJ{Km?MdD=qwMiFwA9yM7^L`ZmAhc<(Y zi&)?H@m@ZrLa|!)8=o+weZd1@BmzNVdflx?16590~}+z|(u zJ2Rh;dGt0<<-cR!s#IkYaj#maIjgjZfEC;4w<~R;^~VaEVDW^g=XeAjTYq7DGC~64 zsAi+@$yjbszg`aCi0aob3M}fVB<@L*dz9+OK`#)2W*gOy(ROac8SBTGaj5k2hvymi z*W3Dr`q4e~IpQkrCmL5=BCWidOEj+W0-s!q8Yik>r=xI%zGO>c!o@t?tA1^ZO@aZ~ z6Hl+BU?>Tr41Iw*KRc;+a+{e&zo~a3D%)$(CN==-=?rqvRD7+Wr;{9OA%XgBRItRD zBNZ$oUgq&iZi|^w`r$(W^g%3IA|2mh!o^s6yDrK>e7RaGSUgg}lFpZpa;BKn2pNoT z#8>%lbHQSzvSzuVbc-Mak9eUNGA+?2flnTrOLFnG)IJvpG%%mbXaQCDBgQd@(ufzv zy&$00L%hg*e)kb0A6hmfm?7n%o+qaGMbctpFHyJFlwq~Zf;Rn<}SI^)R6%yy~DEU5}xWt*+=Ugmi2CQ?#E;w%}`xK zJ#%VQKDu(z0EIw=?xS12Anu*gM>k(axchgqkEV&Zp01N;%V7O zGbv$U^Usk(*(m#HeU;!!A6m{X*+7!r$HML!pK6>j1 z*lPH{%DDadMjEbC+Qcg6t|;U7k{|pPM$K2tHogqHE?JE^LpaF0Rl z|IUH^?;P0wyg9Hn5$3>rBYJQZ#Do(Rt%iOLRdxb%4djxds3Exb(QwE>@S zH^TNQoKK^aY$tf411jeXL5 z$IyF7W{HOrr2QRtd{x+K9F-uXWD-*;ZX!;L4f-ca$(lW=#7)jL8GFniGdMUY_(g#mX(g4@iZ3NT2o{hg|GYkiBDmUXJMAP}I9lPlC| z!NYjd-c_ar`=6z4dCIh4`*Lh%e@B%TtXXEl@&Vu>v2^3KASMqN)kV;~n}*Z{UX9nQ zd#8&#?&1Vol@`>zMH$~pbz1N(qP;28f;UXGsZf~~tX%+nfCHmcX+dk{chOJGmQzJ8 z=Z8&VHkOa?W!+yaqPMZLehn~NVgRpfHM;jKQVE!I9tgIX$^h~I7^xh$1U#IBiz zi>OD-HldFTZhje!sRnHV#;8DcHVKxm5)Jk4T;xZC%#u!+^h0_F5|EJ6h9(gJ59)=U z#JO^b)E@ObFD0YP7o1lx@+YFDfdZFM4~Y?mwvPy)xLC1Dp!g)Az>~Uxl5oZCi2?;B zkS3^AN)(jg&j>7@$Y3fgI#0zqO>g0fEjFozJ6mk0h-2&0phJv4G{H^dNP`aUq0fpd zuU-&}ezBoSuNLbxeez#?L;m38KQtT1>t)~+`)Wh8aUOU8)W%8|z=%Lvq*Yvv-=GPc zT8@1Ag4Ck;Tv}B=UcTpkNRh9476L&nFByrP!-|-!%0$j0j%gJ6WQDeT)>EL!7d3^; zQvxHT$QS*h07eX+!WfKVrfjl}=C^sKERU6hs5>vtl=)gy1Tdm;jL<8WHWfAy;`Yb; zxL0n+qW`iq`^52G7l(2q;?_ja z=76trdY4F|G}A5^*jTWa9@e0B*N%23@dFD(_o|N&9cSC_Sy@l=Y@Rq5r1+!Q1W44<}s6{(+4}! z%x+K~2O%u?dDwYY?3)b_fnu1jo~=DQkHcJt2DSSN&E04=E%PN+oAxYoCDgcft?;WC z@c_A3wTLHarOC3wwOudzIe7qT->vLdfH?})euXdvdDwCb;*P-VQmrisld(UYJsy5z z7gD)N2wt)AXmLmgUcJ)eq|5XkytD@E>)^Ie!M<`ZfHSn^mV6G(cg)Uo&d?lly?G10 zUGr?(a_iCgcJ(42AZYb}5f4ne{@wdwjQav$5f7ku{dn8qi+F&y9fCHmf_N1q;N{Xk z;Vz>t_;@fToz#BL>N-uD;%`CDbR;`J5m5f4!8MM@y~Ve(9|p9Q{~zs#$?osk5)kz7 z-`b^q?1!0h#S_xJIUCv+0R1$*X9&9_-=o=@SD~ztWdA*oW1h4-z@l*_cg>Xoy-j^Y zbDZJTi;#fh)DPomy)_LM1-}jB zNwYI|K=Bh=_UJUf0~Z+>?C-&nhtkvy;I=U*hlQ4hVaMeu`1sH&h*t1l(kh7jd-*o4 z(LTws!<{-GDjiU0%TyH^ah**xUMUxzx;WbRYZc1@^wF?Ajf&*}Iv&0D3TEy<#=@9j~ZrI+LNPh8b8Rpk$Kx zaZMic$vKVM!s=4So=)Iq?G%(6C6_urxh6?$|Pt zACM1PSGM1~kn#z+!q*S_&^MsRTJjPYc~1ggWDppH)W@70x8H_BMM-2iH=SVj(=&JP z_9R^Nx)R`a+?brI-E`2B=5rbDrm{ClV34z+%I&mQm%uJ@U>JHjZ;%cprTo#&Ye^u2 zQvTp?B%w9jfHB<>x7|e|D+K#VMOk3>DAM>RPEGvE=OT<&RL}lIXh5eqZ(x=_LIa6G)CYFV zA%ndlnnc^g#BCF}j%yy92HDWf6cBt#qd3%+qt!HuHOx%j1wu89IIoc0vVmnTsfHOg zqnIYC6g5nqpyCv>I1+j{WX?32L|_K!x^9}TGcrKqsz*?oPUzjR4JT+=8|C7IZCAW} z_UtJ#!~<(_ZurABpLr(s?kPMDA>&NEU!ke&M@TSTu4q3YT40kg7=3rjEJtX@AdyiF zz~!KkuUq;Eia61eF z;`)Gf#b=0GmqE0GQiMg@f-5ST>)a%kBfm#oK)gB{C$rDUP#v=@s><%6z0LR#GRwl7 zC%SE;$XzzMZD~SP>Rhk>6P1)cCfa=$GpQdRK}1o4nJk(N)yrlW90;g`4n6KXHeVigtZKcDgc#&I1pB0M?DMs+6R$%K zC$PK_NeLT&9=QQse-wWsCRAW?kugwgewN#H#Jp)*Fc!x?kI}1@+B`#w zgf>r=2j${7jy1g6kc^k1E0QjEMJPV16~3Dnw}XW3!VLKi>Fcv5Frq7m0A1lb166>- z*JrUpTm1+8^!N~cDYWf3D72wpy-_F)$`?x#+%Jiws)D}|UCP+OYjQEWh#;QI`OFa^ z98(-f*J_G{4qn~TpHNGZUad3*5*W|@TE;Qc1uY&C#|*_Zki@r0lK6PtA^&33nzqsz zHQ4oetEoI!F83&O9i-~{#Kw|)6uLInbe{2)vs%4JQNoQldAtXRGpvUbcxL>V-uJ zN3wF9IE!Ry&gZ@rLDYfC7XSctDwc>eK2Fq4(Xg?${&2&ASw?h0Rkjd1Bnx;O12vH9xFaX zXu*c2CvI4=Ud-@1F~yKau*9LS%w-9aQNXgCaoTcbyYAi0qe$_*g0q2c=HFhK`a`NSKF$GxRS4T2gg8izM zg@KKJwf<$^JwS7F31q7o0=F}yTq0-%Ls}rhw;qTvu&7RK*NLTWs2PM>782om=}V#v zwBFP+0_?TA2pIwF(nzE@Zxtrvl_YeL!~sQj2RjxeaC)+nuCAli4wi3N8VQ)ns7HhFDMf({jP9D#V%6l2!$&;J+l>HnXXi? z`;cec#Y|ViwJb*=z*u2h1&USb88~V#Z54>UqgPnd?xeJ{RQSV`V3jG9A{jzwF*){I zEQ3QWN#3y}GdBLASCLcSDj;%KLg`(<@>NGmUkvtD(;L2k6%}&Jn`7;e*^LTWJ)Obc zu!m{NK>$5f*q}?#Zfc051uLw)rhQA`r{D=dc?x7v&^Y^L5RpPsRE})n!+71LQozb`Yh~`0{S931#w|Sk(%b*ubQu@ zYQZ3)ILY~{PNJ<|MUhVhf5g`gqS{JMnsw3K^+yOmP^DyXZ)M_?_hSA@3WLBzRx3JMY{4Rb0h2^DgqfL%)d$ zrTZ@9LD%06D^o!=hTxB=mm;=s$MUWQjziyJtvW*-ionnlya{AOFb|^&_{nj75oo6W zGYL*9YrYvIL6j+%H9QYfwS>Ers`29S)e^|%?BE1835m6vFL`RStu#D8d9G` zGgx6$X{xXJ=&_2Bp4CySwvBryd%byWIr;mbJpf^DujWiV4Sj{hu5x(PQ1<}=cDj$C z;LwkbXWxsvS5@jJGX+cWb zBAeEns;xHfs`Dk)oA%VX5*l2lX8&GyC^z9WO1%zU+h8^|`*!NtcJNezOQt&2Wee@j z<>og1in0f2xBJxV&<`0-71U56nO8Nl^WaCUvL4mj19C@d2Y8cEM=Fa;5g030H;ucN zdGnUo+I85EF{{&F&~xu!(-;gBXo3rUiHlvPWqw;PEZ7TNk?$DqN--|K2)(!a{GyBG0%=&9Ou~q(fp{Zk^O% zCPQTtyBhtrX8(3wgNmc*B|mJip5}B{SzR;j&ZXwIDx0=8wSB#LSEDbf$+SmLS1=pG zAl{YWu~iCSm(IlqwMzHGd;H&4>HoV{X@-n-z!kj) z4Fx$v78Ke-8=3W4q?WNPVl704n89f?6T z*p15z*NtTc)fC>%L)D2?;0-I|UK8~@TFP{SJUEzOR|M?qoXzKzQEOeUbcPDG)+c)B z@;AyEjIKgg)=5AkW-y_?f|mw!+TD`Gm~9v(Sni-by#HZYynfrhGyktysh}2HZ4W$1?WRSd!PFuUSPp zZdA=t(-`_``g-p)?26d4C$Yb0xCr!3`sk;XU!@rX8RF4-+Y6XRFF`!|*)QMY0BN^x z230DMQnAax6LmloMV{zvVf9bkOqj_?UwN9kB2tAPGfh~66!$W<#nu=>xB-=eD7|A4 zE>D<{kShFP4I&6vs#EBoeI6v*LEQm7g|POyQsPQyWN*Gtp)Li>im+f=^$K2v^_XJF zTf>rD-u%%RkPh4?CV_1RXds)Qf#iUTyMaWjY|X{}R@SeQ$+-oUY2V#5czlFtl|vS? zxHi!$B~EknvcL5z6UH@QS+jNwwa-PN4_oXaq}qlm^Q+hLJ*jpgurZaoQIJu^m2Vk5eE!X#5s^qhDi}ibmIE^ zdyzn`a%7|uDex_Bfp9JQ2)11}4y6)F(n<+#4HGa?j2)iT@pA8kk z_h<{Lj27tLcj_ltTYZGaB#&3h-L2JzQpAo0i`?Ck=E`e|MH<8;-d}4(VOvUgpn!0I zVI@QXUP35rwkWg~Z0j4UxojC=S1JJNEs(j#kYW5C8ME>tx4;))1Di}vKli#3vywN! zzHTT3U2v*l8(?Kljq|CMIBrAkF}f7guP;8lo&eCGa{HS=RlAvN(}0h8E*&U!XH|$NkqLp%!xCugNnk4jxA_Jh4WMoUZlU<)t zpZ9AL1(YvL4!48L&(ZiBUYJmNhl~wu{$p|7?SmSo+}dJbQQNu0g1dwL`aV{12~y^= zX9SVExH4hPU)skyT-?VR@8MT(o~nu(&5ygNmX zqP@E}Qwgh;IzOV^pCc&br+0qX$jQrviSP0B0F4VajuI#WlID#t5918Y!x+W)IM0a~ znvz=z1dw-FE@wmJb7bt%B&>pHd|VLU%Ml>4$cySS#3pEi0cS#64Qql*`B&qYc@Hr+ zK{34pVF6?Q6(#Ksex9g(m&w6Mq`ioQBP>OPw7^beiK;0$biZS-d^_}wZBthh3abhy ztvM{5Zwx2qx_L}+2u|xGV|Kk^_8|?v@mh9rY`Q>>lVEtcQSuOPks)+ACV@LrgbvGU zBTonsd4Q8UQbuxItWs^HU#`|tQ$LsrDLFUMi=Rn6Lo6RO=U-K`riA2-!rz zUVv}c7~osXhOTOT4EajAiL{QO@^Jwtm*86|H;EZ7^lQc3q`x>hW(q=M99a68fAxWr z53AsHJ#y8Qja8FnU^A^ic@+;@=0>?=vayx5{g2{2%u>TV4A!*(WJezQlKfZ8Y*8|^ zK>bp93wEf-SbB-D& z4I8)7!RG=sOzJSeq_lutJq4l$pMn3?Z}1rgR#ZS^U*PjTCHSnJPVYbX3{w4bbMj}{ zv}&tsw!N*&?5wu6uTNEj&tCPZ9#w+R5l&SJKEvhvyTIq%AoyIO2A}hk;4`RStH5XX z63@70+992!&2i|MC&H;3CzePDNqwsA21p-PXFxX8kNLC{+;r)NR>OSvCb-DxwxMb| zA7rp!^5?3-XOjVZ#_hYQ{|$3sYDmA|b6^1Jm)ts}-zGx(`rJu}txOH+Z&O10AW*Nm zX}1LFt53Dx({)g90}WzkPJWp;ZocUGI*YHjTsQngLyU3y{QJOLcH&~Q}~ zq{E8gDi|o}cC}n7&}$gz&9RxRRhr3EwV4=u6ttvSZ6ly>SL_8+bWs22Yp+tAuPj(j3@U$P}<*1*Ui>c&1A{zWXtx7)z4Z0fL0xW*EUb z4z1GDkWT0*1-3+-JK1SSz_U03Z*_|_!D&J%GDRpBiyCqTUH+aQvAQ%LkH5StJ zi63EpZ{qf52#@ySW}zqE7HJT#8?eVz!XC}FR$i;hpi;K5LsjJQr8HTXSk0hPPK3pz z?wAD)2-TfuM&ocu)8S`Ry)B7!4hY2c>S9FCeuGr|sNR?3Uz53(nC<4oL1Li4QG-bl8)wF?&ibxEfgdB&dzCl?2N-ikPvSuQRI$l?8uROw{v#su7`f}*O03?T4aW+{qbeETxB*d)r% zzzKqSSzIwOpC=k-x02)P#BHA?_aavN8ueksZJ)lo7q$_;%JLQsKR$#5ia4U|)w?y| zM0+xFoZ!EJ*AX1?10ei;YxoF5HZrKf+bNKe!4k@v5O{sa%1mJ)b?8+1aF`h7d~wv zUA|=ru>B3DK=f&g7#xy|KLQD5U1;{9#Sr;`oD$x36P4|?=yaj$R*QjR-srDT*Ucep z4^NKG5%AR}nx(WpL>(#^-rABH^nd0$wyEgE+eDh<#g`$O{LJq|m@K z-0$FCz=O;OFeWvd$39Kl1u3Z+Iu?ftAAHYB@eZYDWOz&3-ey)gYgR<@_SQ<30w5GpXgM=g+suev zl-yFyiUjgQ=sS9=#t>^j4*0r0z(n51DhGVvxWTZ{-BVTDighN*1Xkmc6E}TmHIovz zDq~|@8&JxCvDgFKWaxoq8hc=}-9ITz8MQ2-vGsjKgOJpvhJPJrk;;;Y2GN>_44=ESE*xsBCF+BZU{jQL5N7f7^y%kH7R3gT@|{a3V;ch`~sYN;!u*%|{|COK|054ST@X~w^!ms?DEp(Frz zcj<3XxwnAx!ZAGMO?jcTi|uxY(57xF}4voT5-qaf)|YR#mc4MMm|#! z34K()$cnFYMWvbky5&8+3qY$=Fqf-7V^pJ`AXoU5lZUTE*X7Tv8c|m7r0nH%@q{^J zLYv5Y#S?r~o;H`ShLN@SC$KyX&Ul`;ar>#J>If{EKl>f|A@u3crBMbm%qhS!k_Twj6J72GW=2>gSX8zA6bK6hp5+YY zk9r1U=musfqB{&&E0WXL1Y{Sj`>RY~b`ho!x9So}X38lB(WNq@CzE@ul2eQ{crHz= znaK&I{17bu5;qd>(8Y&U*wE17OyZC)pU%CjK0$0!85`0sUsVdyrBG+97aL*)hpLi9 zF0O?UnFd3K42Vjf8FF=M@6sr9-9&+xCejyy`YBEaPY@(VWsXRqFrU_x#mcH=UsB(_ zVLXeZlYLc{2z_^XL1PxlZe){vHBX}9s@X=iO#EyQNmA(c#hT(2VPx2E#+S*7l6^%# zPRir!DZ-@bDgwyavedM^0a7eYUr>aJE99R|5k?wXZCUdmL1GkPM(9J)Mhs?6-C7h6 z{W(RLJDz5=(Qz2-Aq+?^U!bJo~=MKx!sz^hIa z=2&aT&U*nyA{X&EmssEhQt2D-B=^`fCX##H41)Bb@k(i%tYp6RiI`6;8qEdX*huCZ zNEfu>o5n;Sdr9m6B%CR@N)S_iSkVg1n>;=LDz~pSP!6*ZwU#M|;-Wfp?UTe_+fV3l z^u0V@X&i@WiWAuIv5&$e!t|u!#+1KtBt!a?^2dFh!Bk55Wx8iNEXd9S@-q+sGjIPo zEv(Npu(2#LCg%Hc%Ks09=$08nX3Q+k9x3IowDHPh3YoATJf!fg4V*m^hZ7n(WCl}y z99x$|=6alf9{m+PWa8?wx9rBEzjcv7duy5~D2_?9%?&E}A4aRGlc&!kvOdpX7!D)+CYxAvd)7McSwHpfS;Hd5ZP6Inf=*k4lNI z%*Rw>FyXs5ZL7b-J1(gf-TXZ51s|uVMWsC~2|Tn)iLSI;tadEy%e;5^17w&rZXPmG z80HxKU-3^+EgDGqG7Xs=g*lx`dd0dVIbf(^w7zQ?*7eD}{bfOyOk8Ba#g8M__AnuC z#*}~fBP0rViB4j~LkO?~6pWG-(!%#>Jfzf4*t@35`&8vRpcxBEJpYC-x*J0 zSQh&)I*HilxECOv1o+i+Hea!vPq64@^ITRDkdt|uz_HXUUw3`qA z30u}qqLNasr1b^tH59}Ek{yuzdT zeD<0?ErvWR3CJG$7@)&5zq*OtOhZFimXN#UxYfk6X)k+lAJ$ zTyKvT>h0)K#2y>IFt&M`^TpfY74Sl7|6@}oEpe;h+fl5qTrjB7`(*Rg6J0+R*Bb|@ z65YT!4u-P%a+MiKV`UuKe7VY8rmysn&6lgpfzt@(-zuB0E-^Z<4+g@VLj1#jl+9PK zGAnp|L^5B{+lChIfDPMeW-(~KILy%)0myc=6vD17D5SV;kt}4j5*d24u4zd{SyPcP z!VqLxP-DFEN#4dtMOn=>p(vAvwqAW{<{rrIYLPR#UgX8eC z05GO(sG*dTdBuR@{3~QkeA9Ax-38sWh-tcS^WTKM57JGmT$xWpm<0O`@bbv5@ut-U zNThQX-L!$F!lqT}rZoqCMfob-w760|4xuc9ejhmpa6$rVc7q-=O4!1POai_R4Fyt9 zd&Pw$5tozuHb2Da9lgh(CL9&lq8e9G{3gA}YC9KY#;mr+D-aw43BvLmDXVSC z64tYA9>@uJht_T{(RHI{XVw@P*$PQRV=kAf8DXrrMZKF$%uaGJqK=zoSXr+cm(^u- zwXr3=d;o7A;S&=66<;d|el|X-%enwfFu0Q)TnFgqB$6h{xm04z_7ocmJhPj7bCO`o z$^Nn7w;5XTz=nU{+_E^!x$fA3lSe}1yKmXF4$yD`t(4uGV?UG7KtUe(a@Ny8LYv|! zhldC;;gIY_=LHdYW=_T|&$u$pF-JQz-e%Wz0L)W|s ztq`aI^OdNhRxp68sJft`XIkHrr1KO)3lMg}?Fh-u-~xmsXj`1pQj=V{xM2nG37rZV zTHk;HKePfRY<&RZ3|rr@3Ie{Qs3OSCya`buBsUYbzF}?n(+lexHbEH} z5>QHWo`xL~q4f=`A@_~6z5xi{5ox>4a5#}@yZgh>p0@5VZTBtFFvDoO2YI?q%PB=1 zAkD68Jq2lkv`*M%k~2OKr6F~7=pxxPp1D46E+TGJ+$P??Ef=0yP)K>qgDVzMuN&Uk1#_>7$u+3g7|Wt zDHDZJUX3V>GDTRX5S4&1L*Q9Twj@lnZq7Cuu;#KRO<1xe30MwWQby9vlx(%+GU8@r zA;whjf<`L(TOJc=5He$S)oawrprSvxIu>`$*mRB?+p14446?cXq?E%gfNumj+%FkAO3fBTPR$Mx{@7uFKNK^>SpvXrbLCnS@CW&>?&xtVPOoK-K+opl167t`LrQ6e+dxL+Z-ZVUwvART5;-l0ukWUInW z>9E|UX5wpey@htMaW)imFgp3N`2jTYndo3bJ2!OE$?9C5J{LqM*BV48Q3VA=b4^%e z_!B5i&lGsbAyIimC?^QB^WLTLM2>rjs*|X1)e;Iz7bb@l_aVXv@)m}&83hjn=HLW$ zqQ3Zvcuy>MAMymk5v*_S?LI`O zuplFMAM$j$Wdq>|C3WB`@ExMOu*X|8WcfVmc*;%`7JlK(*}7?kVWDZh)ld(0d0i$LY`ZbpY`T$8ax+)c+)ZAb-1zWewh1pX^b+qN$W=Ot zn#rR6{Ul+Jr*sl6bH$F-1jf>+BULJhzxZ0mi>nP>x(KX6Nn7oirt}Kj^kVM1XPUv^ zsPs%L81+$krkN}}Ep7u^5y3NQ)erDeYrY*>f*84U5&@0nO4%m-yvWsf5}P04h8NLU zn!ExbSDG@ae?Xiv$~r|U21y#~2{?pI*fkR-{lI~uYQ`x_9xzb!HaDO;fjt>bvsp4g z83JY%u#THSNyuEcpp%5@MCpgs5u_g^-Kac~r%?R>Q^E)m3p~;J2LRa5Q+hX1Oz&c! z#|it)72F_vlt?dbO7A8J>0M~|Kx71Inh`+~g{LJ1NrFE%KiLa^=+Kk+hwjGjAieDI zVR(l;NHGuBbJuqdP-v_3>r0vq%`ZcqC?hTA62ZAM~?pGljf`zF{j~U2SZTx1B zIVh1ku_}*w$9H*ZM&U76zoPT3usqd0W}U%fW`OGek2&-bN+i!dNgngI;Iswg6Fc-+ ziy2Hh2`CxziPl=;lh>>AiNGWva^?@l!AbBF{8{aG&L>*d^$w7Q2XtV((2$U#Xj2Nyv2pD1?;-ArB6ehRFMvJfWSyWT zm@nEy8thrbdC{IsTD^EJ-!MrP%vYuLxRWBhIW38ioHjfrLxEVR6Cw>z&oU}7AE4>vVfU287xZ{IdQrzAp zbOktW+CjkO@_n=6<3nSzDV%K|_tvU$rUa$j@&q-`q(<+&YV`-Jmb@POT#XQ@H&= zbP1p6cEKjO{_BVU#G?|iR_lm>&spd*SNd(s{0U{=j&jeq#oD0-no>suirD`i9g*4n zLUd_0-f8d5ThS5ms83a`BNE|M{|D)azzBRlZW0EpQ>6%B*Lk77}Qyy^E10& zEf7f>T+$IitTqKwjI&gDBBXz$$D(ILp+&)S!AD106uhhtq`9gOq`A5eq&d(B(!8w? zq<+ZQyV$fCLGKvnH7xXbD093gUZW5F=u#ci)(bKTDD60M+dEia}g5ETgTNn(( zfS^f{fS`O42#T88D=A%6l`D|;vcznAaIHw%Bhj{-zo2YeMow39IgiMxt-!c^BJ2pK zsg6)Nkj_WgT)mC<#L7p=V13IQ1E_N?RjeQwih9V4^_fNC2)Fj<2*sIx2}|=!M>wCS zvZ!DgFqt^mo<tkM^-j+jnWVYq%9ML$9VzMRC$aR@TJDC-E^XfxPeNLIDRM+C!^(e!VueB7VOse<)xeekZImLM%34FETNEI0A=od- zp`_hU1K0e3#z&}h8$6N46A*a-cR_$Lmu_K_0Z?T0c*7+F!2D1$phShFRZ0GL%HZ@y62FEtQ0E8G+hpNb{*lE@>S3~o-DizAaDn7%cK6IxF$5R4D=k?CMZ6J?`_ugSM&I~gJBA2r#_cy zC1mUWtL@6eqP)(%kQlYSVghMv(o|v^HAzitTw<#=gl(7^oQ3(m+1Oz~*;i!|S%zU1 z*%ud7qDE;n;D%tu7+}Iks0LDo)_dD0ou;?V&28>|+B9jp-9Gm{=X^7qGv7yU`aHM) z_DK=G^PY2l=Y4-mA=}v^g}Da1_wRC$C%Bu+Efgk?>FSN_FCi3WF=5uT{d+;NWJWSs z%aQA7CB1 zJMjJ3v7IEgiAiYfUs|{yO{X3szQba^Z`I>OXiB!iHz@HjGZ?R1O*d18^2OMMEzGqP zHtE<%NPGXB!Yr156~qaD&1qJ&8qN;OZT z=R<2C`xaq2JQZ2_6@-v|pTr_e#-?O>1Z7j=^EIMGkYGn9(!mTrCZke}zZkynnip~Q zc_+qSD_2q?U&iv+S4LhGgeUq_%BF-lF(0J)zWy61zAt@ZDg*Qc4wIdBkHmzEcUr&> zBFx1*ZTZ*9pN)4KgG6oLByj|UQjGx`Ni}KJ|<$qkIyfkb>vVGUFEW6 zu~<$YM~FRJsO%@^{92Vj>lL;V@;E-f7&VWd1}_Ik)I3j9X2185?4T&5H9MMdL* zc(x`m#!OjZAwoc@nyC7eNY>bzs6o6AV**>4Nw8s16a>xLLdhI}S9Ro(L36e`M4YXC zc(Q1$THS-+R^-_%!%mJ-;%9T+W`d*1(yk+Xa`DyV7fxSI!Vpxvv@2I%$6=y`v-Rv^ zQWPH)vODm&vtX0pFZh=^+Rr4b82_&#{ zD>W-;bgTi1lr+C(6D7@0rEi5(k7Fg(34AN~g_4TCBVrABnaKhD+NClkzzPA*aR+t@ z*7NOQ*pq~%UJ+A3-wqsDU%*nYgp4Jd;9DStF>9YkH*%WPi5XZW<(DR4%q|!4CS_Qg z0>(VK8R;_Z?1>51;E1)^vA_}Wur}2~kyAkf9in+!3YxKUMt2a8TnA)mX70X|L{yNg z>3f2N!4SOQzDS%2<!BJiSjQQUD#_Bl-@u0PvM5 zeQ!5EL5wRTs!)0>)I8sg#Z?kp!P|=mY}tX2*&Im3Xs8?I;bY=tp@^kfgof(oW2V6# zawf|;v}iJ-wn(GdYi?r!a^}21Y3G^iq9r(MDP96F}TbV{guQYM=TGeV3+8$u~0Y7JTpi7pd*xyBr!3s%m-d3Vp@cKB{fnB zjqq5}GF$ z30(n9Tw;JPlF4TM1-(v$rKR0QnE#_BXA7y%nW&_dOGL#)|BE!)E1!`IT97z&!T)P7 z8X`nUTLuXJUxn&*Uog`4iu*ZBo+RW; z0-D3ASrgOGd1yWP8wqGuL&*FCKe;FYnm5qa;Jo0mA$B)-jI0oO4+Vi|1a!b9&YWi` z`t^f4V(%(`5BUjUkK{e{eJbmZp$V?sPG&mz0$U;zNXH@~dNd0QEC|b)`YIm6%fa@e z)8JnOBhuPKi`x(M-z4d%m=E9{^pcrQ%~2`mals|5cb0hH#)m@zkQO2i+eR{t2I2_C z$}~veV9Vj7<;bXr9a0hfcIVN0Z~%PsV|I%Y2l>{X;g{g8a0S71kApnwlN(d24?Kjq z{Ir97lgK3u67qoFFMDW?^tMTvtf#D4n2}`5*Qhe_f0^n>Gk03E(0U?e@>m|WS`?Rw zbv0Ec54=Q~V6bniwIpqdl*w1A(F}`o{D{7ml*tz2ZXoftT2C>uA9|X+0>s9^9nTN} zKe^p^EOxt}5?W6f=d2XaBfg~f&}j$De~KE$X>VdU?DG`4k;Ob@g!lm8lhGeY1MoWf zCLqt}hEJtVOuwqnz?)&TKmxCt0%mu}{U%5Np7n-J-(uw1IT*#C<07gIVGMbem{;irxw!=4g$g%A|c4 z1&8<1VvgqLk>UExZwMR?S_}?97>VsbaE_;}J_=8f_KM5IKZu6Ik>K~JX`7V*fx(1+ zjmxAZj5G%&u-q0J4(}G|>LUMDe`5$HIN;Y@tCn)dW8mGBzL?j+Xw+RXqAOD}i>*{-c_Nv`_J&CL zkF(fr=9qT3UAx(D^{@u6o5F@6m=wC{@Wy?c$kriY1u92#6*#B)X*sZAJSj3Ls}!FT zfHb5;I@@ z6F6G#_-CO&s4W3%8lVYQittbRo66 z*P1K?lG1#ze3JUA|6kJl6L5ifr1^pv4f6S~|(@n!7 zG}MqrU3jZyKp+y3M)soQUNH?7Jr=((xflGIR9|SjkAsDWN7H}In`xO0C~a1bB)7=T zxn3NDmI?QxCoRt_G^&ICI9{PqEi@b6D>SMbSYl{e1AWX9Q0w0Vw-FCdwDWU#qD|hv zePSrsflS1NfNJK@=kP=i)BDlOk>L2}@I(jT<1FS#&&PjAZ8>xU1-Gwu(pV74lh%10Fw-=hX@quXY*MR1|Wt9%$K0M7#=zcnr}0cj6e(IiooxM zdugg*wG2;Kn8%`D(FQzP#_-N3Q!x8NnJ%nTXwxdx^%=(9&Sm=+tnl1DQPi{2s=c(j za8ZZ}TEwKFZ~r$@cupeQpCDvaKNa>Gz^W{dKe+&!+isvC`+M|2^`Zz3p|jA-pPV%o zD4`xwHTf_L0Ld+WZ_};1h*h?22>TK@!H&#e^k2P=KOuvV{VE^EQce5`t@%WKeh1#$ z?&lW#jUdz#Y;Xvn4Tc;4$AD1utf_d~lQ*{@uY?;0jMzk-<`mz$O$)};wRwWanaJ22Su9Z90!T--E4+=(35Bks`looZh$wUmS~pPh zKv-Hp0qQ*T1Torq4fSLzUkJuFl2vZ3^Vttdy$Xhhi zQ3tdyG>juw?I(&jJZqvqp%FYucH+nNs)M)*SBS8$+j$&~*hDf$N%orXMmCWC7yCvQ zj_p|D$SE!+m|P=YpGgzE6-wl%MOruXFmPsjhE#~a%rx|DI9u#_CvNC<1QX9^F@d># zBg#A3F^3y^?hp~&(4&nQ48f?FI5mpKhXCTBr!Qojn2Z)BgcJ*HY{FA{I+p7ot}$&NR9w~+|Ckc!V;=Q$?b4h zk$&{sChP~}Jv;*th|Em#NQ;N9-rb51ij}AY7iZ10Qq9eMxhng&67sar5tt7h$ zbFKN70v-?9QALXkNHWL>7u`dw(ikS5R9--5^tV6v<6TJWl1>B7Gn>0;@IW*716U@kDG3InnUPZU>S%Vw$y>C@M=X2*gwpKpGaD6{beCg~c3oa2~? z!w@&I2Z0(pXVhazrol8D=0i7cUii?a&aIRmay*S{twEIIt1X0T1=9j+nHEneVOlfl zu6xKBuNTRR(TO>ow75=Z2}vk`%h6+&L-WZ~e4eEuiE6$^aTS@tC2kIeN7z9jA(&W) zqCLbbwd_44?AmlfIAV7#rrDVK3UKtI7kU)TIm#DogFNUF9ahGa#sdP4i=yN8iqIpH z3nKgAFiI=pAHP6ytPzG(2s0V5zX{BT$ZF#^GImt)!JJd6OQ-SJQf!VUdFj-rpya)s zsPD^OI?B$jzhO;3$u#DnHJ58Xx5#!^`rjuT8FOmZJVC)5?Up`x7|6OSa|fvByFVp6@i#2+6u^d3F_WWeHSEtX;LFe z!A$O059-W&u}O&$!?J3>5DoaIGjA(QOELwzt%#9N;EWvlnB}QZ`k{^(Qy9cm&zfYK znJ8@ifXw6~(8%cbkKr%Tps7ck=4^>C5k#z!2!b&XrxytXvwZ+7gD`^W3&k$Lks<_R zv?^(ec`zPa=81QQoW6$~sUpWQ8Bc_59t+#V&|LEYFe05Y>O!Eq;!Ia@E;Rr*gjb`$ zo0PiU&xla1J{$@Y900ZSxhl>J23->=hDUS2*dcfew_?aDiV_h z$8Wv%)`ij2Zwz0a7@WAbJ8SClzzxTMqwB)uoBg`%{)u~o=kH(YpBSqj9~d6zY%hUP zWRQYulsn+{%L6Qk863Lx`kgzfL{|pLT5{k^#Bsj8SN}8Z`46tTa+IATuAluf=k%-g za;|pxuRs1nU01KOM$SzbdB3#V&rFR6Y~gM2v*t_qiE_U61+^+{OM;?2wZ&0uOf(>C zN_#N?-A0wcrBw#>YSth6MPRqR3_f%-eCPs&VV*ZuJuF!LxXKK!q6p_9Mdv24%zR3t z&NbI&n_a+6HKFCG*KxB&fO86sIDNMzu(~9F>Ho|gP;q8Kcj61duf=Re-|^_>a)e35>l zENZ5NZ`}%Bbz2fba?P)&nI>SkAxHSW9`Hn#0$C&nPnGFHW}zkTDuv%(4==E}Lgj3A z*ldlmOAQGH;D=nHyqv0HU=gNc(Twr$@qlgIlVAHUHVp?Tb4gMTqVO+KtWz*B)=HPyhDp;7ktRQkJHbYelXXmovSABA9~O<5uSFB&aclV!J~41W7eSRpO%*ZS0XX8N|7-_n*_sI*P>E?NZ_d1@0`ihH;MK9KD`0?fN2_aAV zRO!_e*}JP}@=bv!)_)xMb4BH3m2BCWweuT)y|aSUm+8^8#P_Giw|=OdDK>c5{TcM_ zb1hngCl0{*RRVt_X9{fm=tTG7KP{cCkS#l%)tUCh?yIh1Q(%|n)og$BD^r!QJK~iA zCyk%HKlH7?=qGE!rfgb!Ems!;0UJRf;pNe%(8tM;#Ul@wd;o5_Ml}3i)|?do$ER;} zxb_z!EE_AAvI+;!vM^C22MJBL+wk;xg+i+jw%kXFS z2IiF13M%(?&PZ}!!eEUc4?OyfsuFyZ7_(W>EpGh+{S-3>B)2OXr+8g{Y4{z*& zt4ID$$^-1HGHY#NXoWYv_fS*XHP_jD1{a3JbZu6U}D=*sTJxe zis;VN8MMY5x2Hy8(ZrxYwI4Qe-1!^h*WVnQ!2eU+(6#HA^hu*PZe5+29kjLD)6EG3 zZ=M+(qW0s1UnL|Cv>%U;qp9xi(SGc|gu)d5?%t0X-H1m2C2h=wp^?`|=TwCmKO7vH zdfgBoZ@+faZXdZZaAE8%xvD&RvLi0CR+AA`64_a%%0N)DO=Uy}OqKqWqd0ZCn_NxC zsvwOTAs7@Bnm~}%L?PeO^FHD{9B?*A)b@XXJnO4w3i#$-J3@?nf6>u1z#VQYkoD+fB?9?$%qV|ohRj; zPB^1&Q^nB!C{e)M-E`^&!p52^<9yH9FsIp-rwr&X#S9mFCA#n-M;+53%0i|(b;j8) z#a>std2d!^^1Xqv!Qsl9c&<`bmQ-jSh*#tzoMSUZp~7rWZF0gT-A!L}LIfSuy|vec zOcbAiy6?O;ha!o#x$FMm|Dc9T3P0aq$e8NZrOft3#x!b@?_az&X5Uv67g>xKt-DN> zNfr&eaaHM$Q;UZ2gwIOEzu)_1z!L!@M=;?C@Wj&LtJuj=z!NQc!Q;$Tr%0GTWKd5X z;gzL4e|KtR?45#=TvGv;t|;YOGIh!56ZT?r?YT;o;qt||ycUg9QxJm(1Gr%MY=#YG;#t9_(QmBp;~Os~_Xah|qk!*y~H?lcJZoyj*QOj`l2U_1c>FMFp> z?wLFq9zEM5HlCwfKyN!)oH>Ea05B zg-b`Sn<#|3F9&Fiv9E&DPxgdsX1ip@nP&6eLbK~=lCduQKxn@HOgxv1;7V&+IKlvJ z5$#?-OVR!(>?~nISnkpR@Sixh31PVlaX22teSu|@r!G2I^>D66G3RPms<9(9TVJ6( z5f_<>u5xQ^GV15p%=5?R0O+;}4+GqBo6iG;Tn-4i0?tA+$RQj@OuOgmBaJhM^oCrs zt1s7*BP%oHn4og<(2>@Pjfx!Y(LG*2OX*G*w3l&9&-&vm5NEZ*zx^+m+etojM6HF8 zRZ(GbP?#1{m`RXYF?yx4Hp$qcEKACYJeMag2+7xjm+OAnUQ2DBz5n9S+m{{H7wjWf z-WXRKpqPqY8@gk!9Xoeq^wOw)#>@jUPYjjCUn@FPe2~+q2CWC`x;Z{kb>q(Uiz9Gk zUFk(u{hVQV?DFW)9SFtXua6AcuZ_edW;os&yf8d4 js>^EI;J=Exa%*__+O;vWMyXG@a%+5a=-ttMy#9XysG}Uw literal 0 HcmV?d00001 diff --git a/dragonBonesAnimProjects/library/SoldierWaterGhost.json b/dragonBonesAnimProjects/library/SoldierWaterGhost.json new file mode 100644 index 0000000..7d856cd --- /dev/null +++ b/dragonBonesAnimProjects/library/SoldierWaterGhost.json @@ -0,0 +1 @@ +{"SubTexture":[{"width":23,"y":44,"height":22,"name":"biu","x":53},{"width":9,"y":68,"height":14,"name":"rightArm","x":76},{"y":35,"frameX":-1,"frameY":0,"width":27,"frameWidth":29,"height":32,"name":"yinmoqe00","frameHeight":32,"x":89},{"width":34,"y":1,"height":41,"name":"body","x":53},{"width":9,"y":44,"height":13,"name":"rightShoulder","x":78},{"y":50,"frameX":0,"frameY":0,"width":19,"frameWidth":19,"height":18,"name":"rightFrontArm","frameHeight":18,"x":23},{"width":14,"y":70,"height":14,"name":"rightHand","x":23},{"y":68,"frameX":0,"frameY":0,"width":12,"frameWidth":12,"height":12,"name":"leftArm","frameHeight":12,"x":62},{"width":13,"y":73,"height":12,"name":"leftShoulder","x":1},{"width":20,"y":50,"height":21,"name":"leftFrontArm","x":1},{"width":33,"y":1,"height":32,"name":"head","x":89},{"width":50,"y":1,"height":47,"name":"head2","x":1},{"width":16,"y":68,"height":14,"name":"leftHand","x":44},{"y":59,"frameX":-1,"frameY":-2,"width":4,"frameWidth":8,"height":4,"name":"huomiao01","frameHeight":8,"x":78}],"width":128,"height":128,"name":"SoldierWaterGhost","imagePath":"SoldierWaterGhost_tex.png"} \ No newline at end of file diff --git a/dragonBonesAnimProjects/library/SoldierWaterGhost.png b/dragonBonesAnimProjects/library/SoldierWaterGhost.png new file mode 100644 index 0000000000000000000000000000000000000000..adbd7b50784cf0b238a21b508c1bfd0794e4ebc3 GIT binary patch literal 10874 zcmc&)Wmg?dvpqP$-GaLX3oZvIxVuAehu|FCAwY0<3-0d0-QC^Y{XNh96Zb<+ubG}T z)74$IYj;(LE6V>sMj$`{0078Rl48o>*6%-ohXr4Ifkva?=8J=*)-M165%WKR0HkH$ z0RW@`DKTMH_m%TZFObUp`)78s+)Vv3m0T6wlsZD;w=n6J5$C^HXi7>&@+K-u(>yMA z@-SRnTtwW(25-FUs0{jwV(5-xVeom}ut>DwjGpNxmIFW0ZmbsC-17!RH5yW9i=l!@-v3pSJ3ylWuxr)eWD z^#cbji?5fifo+F-dnOT)k@yb_Opc#KtcMlfyoex`aa4yFSUqm`awY|y&s%WxwhgCE zn&8gAE_Mm_`gW?aISPNdPPMS7FC1P7*zVm7q9rkWzx~Amdir|jDe%uW8$)0RC5~p3 z>I8x5Xx594iOFp4=5O^O;X{%N;pZgYH6MhZkP>~O0A$Y+>rY8RRMIKzy>JsG^TqV0 z+Vi;*G&CFjIlmk!vfb8aZaq6~PT=}Jk2k5ieZMxeEvK$CT&vRVbM2FvZ`ud z!9AVPWNKn;?(f<9PS#8#b=$Km$u-`lZVA25yDSKNkMl+G%br%B3o+OrGWj%}{zajPm-i{F1e zqSXjUrlqH+ayuGldra#?k;-GD`psJixCv9LcSzKg( z59)TvQ7Tc?`{3?%+Vyfif%D}h_KV^}4ak>TNzExX375&35-y6Z&5@SXQlz@zH9D9; zcJ|l=<`XiGwLZi}Iqmy};8*V_2z1(mmkuU}hEAPSi`*vYh9k(I z9y)T|o%}-b-$c?Hi}Vz$#h0QUXatLfDyu999l72e3E~KNF>Ab^AUEGN{lV_!k z?8tI_f1O2#FOo|inDQC^JvM5%q$BSLmKtw9e54Rk@zc6mJa!8f9vNTO%B&FyoBkQO%5)u(T#jQBML=31BFWn z%xtOSS-09vJL73w<{K+5e6PogpPNmSw{5tcu-3?$*1T|my^tt~i+Y)GMTIl4?Jvu{ z|A}l08@#~)I&CN8all;4AK8&&NrP1wX|?$;za=Q-i&b8{nw(!R7SxxkLpt`6EaL?) zxbU255djMLeXmf`Q2PSJJ@ZiSIgN(yoFLYZMB;a$lUCNoLg2~ zg%xZ0KI|N*bvi!~1KQ{%{qJGF7aWL!r~_un{d;KqyA`bqD{3JKf9#)MDpc)llo^=J zwmLO7?GgaB>dcUNN-*3;Mn({fK0P~tVTjG^Ow{rjlFv2yggj2rfV$-L?LFZ$j6*U`4xmC=4hLoN_I3A@tz?ZSuY7rmEir3636w8?$S$O$| z^T3q5?O-~@q07a_H6&neYHGxSN6Rc2B7r%1wcWeiWKZJRk>%~x*>i45!Ne(lpaaZb zX|Tpkj$#E+apJeDI#DMb;0SpkY~;9Trnrli#W$eztSPEH7zfX91J#6 z^O6R7Icjkk8Nc+az7L~E)HzzISVuYq*T6hreoJF%i7p5hN6;?k&*eg zwzmG6+WK`bksrIWW4zqnxtp^acS&FDzU+xJsqUhuJM+>0>PN29p-X&PzZ5qOotjyNyQovsN-G17( z{pB8RZe9jq^xK5t=8rDqx2Eb0t7?6jR?Z{{%P(W?k}{P=i9LaEaIr1jQ)o+e@iYqH zmDzD^6M@fPwi!6KOZ+?>k-5Q(D-^9zj!P=I@S$5`XVy4sy0X5mm4QXeN3yqMm4=DJ zLG17EC**hklaz$R&jiL*q9r-#g2QQ7uTPtR4hgXWfoj)d{|il`ywh&EJvr|E^0)d&kj^tGhypn|XtSs`#O0ImBTpX@raKw4k9=%M(frkLjrO9WtgS$*u(Vow9lj3g+;?|Be1?jh#N@r(j&n_flUw`*Lhs^U7ur2Z+3rn0hR0Q zH-X@_3_YL>&e=*FK|&{$uP{8nh%ZmUnKv4gy1^F2hVps?nV|ehFxx~BTE38`-gx7G z-2jE14cFyXfd&Nu6bHoS|UY_&Bz$Lwt`w-<`KpgA`xP0dmEffm2K9wlUG+$HfNJcWDX{$ zEkx2Fsa`7hY~<6%=c7#oPY}@}!*9No7Fo={n1x8)o!Ig#+nUG}n3P2VRuh7)HqL%Y zE8|Y?TLm&BjPzf-r*PDt0nG11-&9lH2rWm+DAYK{kru2)SNLc+gr%9~WVBx1IAmMd zv-yfp1LJ*#>fdw_w8l;OdA%@Hs@lFXmbJJ_b2?hVG$i3@J$L?DkG&D)26X3)QJzJs zGjhUNnX+5KBxtD3nB2y5nmVhZ2}{Y#qma9F{)?%SWvqK&`L4@TBetaIgMwCoLEcO2K?@bJlM`wuBMsq;_(G!c`7*7M{MaovLCN7ha zvR2>Dyvt@qJKq}9L|yD8?jyu&4AmEH?V4PB-4Y#M+U`;Co3W^4_YQv`wp!6N;QQKM)(w~)&?fg!X{ zPS#MidCAOCN3Am?(0;%BxCxoKTKkrAme|>tp)8DMd!+AH@X~bF#CTSljnB|fGzg{( zkEbnmENyIzRlD$D&Dw^}?Q?*7wRZ=EbS}f^mqi<%gfGH%g~aXXe4Qt`MO* zVij0Z)|is>l-E;TiFwmICg3R|(>muZm_tyN&K)iHOA~;8KpG*vathc<$6=cp6(#mP zkgrN#mOkIMEr{_J`xu_l_#BGZhkJek>sgAA9d+bNn(;)>c#DcQmB3E!drv$=dcFe-|K- z&9lhf;aJvbVWH7?{UKa?f%#r&&GW<=RAxDc0>8r^(P9EA8O?dZswjNLDj;qNG5 z=ZX(#@>!ui@LJto#iV8$lR|{>uj0lU!mTIZptzmGJEmB^FD8(#5e zLJDuHF}|l>Mua(-sJ&6yscF-O3R3}v>XP;$Hm9|KCPJ}_ibh&Gl1U}$a#tqt*RmQ} zIwGW|bZ5!75oum8!_fb;KF<#Qi;0Twsglty4!x%ajxo6jQv1DH2JQ5IXXO$$E61N} zx)Kr}9APfm=o}w1ebltCRfk`dqFH5Hy>BbN`h(h)GtykwdtzWyyA zHD@lI(h)@^U{>^jvAgxDE-$hjO{AovmaJS%9whO|h~rvxI+&6XQ1&5(!(%gn$E241 zQ|hUIldjt6zgT-v4g3Vm56%dsli30)TNRnmh?pPCVV(RoBoi+Gfl-5?u0x!Ou62!E z2L-FN|x`fni0w>%TI4dF|>Sth45I2M@yKg7Eecg?gWkAf3y2|Z}xV;K8-l4 z{fnjeu?LL9l1qDAe=y%joEeP|mtEmTVKnddVb^??<3rDzchZa#T?|js*Hcg=`&(VF zM3|H)q@?a{8pE7mEM{oo(7Yxrpqm`cuv5DH_&RO98PV2n(4{_5N_wFzi3ep@*L7s9 z^^K(Xw;CC>tnp2$8I#T<%}Zh5tz2+PZ~EU#`<-zN-i9HM4OUk=tzqTGDh=3Z648B} z64om36FPok)amJI*)|I}>xXDF?FpK>(khzuYgXS)mLNEp=&7rX7yX!(j-6R($8&+> zyRWR`%70hM5=%Pz8%v|UJ{17{sdNQc94BKafO&%N1Oe$K zr~yjXWe)WEMdV~2epw-(;6}p(vo_moaw2i6T~GZZ>su8p5siu9cv~dymB+`eW_x94 z?^#)ErOf{89+*NAgYIpWYvcAO1+!nhUiMLMxFi$iD8VWw=_}}tMpM{=oC~0TsbD^C zw3IC_bX6W%UKjs_o2s%XU$dlInt-;TNL!1eV|-GC+=EI)m1>7>J{YRd7v&-CdhC#2 z;ZAv?JkD~)Gz;s11ql6@rMOu!TOdS0g|6!ewx^c`sTd*XEZW&R_`lP_XfU5$DH!P1 ze;aDpaKBvn^V8?yNIM8(x8-=`YNV>vdPjjGEl6!vZC$x@*zRy3kNm-QePsJ)_U3T5 zSiZ)55-97+2O9{^WrXz@!Y`i?5G=J=DH#j?N<4=ap8LVn)-eJQ7`=UYTJ$o7Y8sHQ+Gep6}imA zvt@;X?}{_0XUhv#Ca1MEqMgQIz>wvSl!MpD+YNu5E;X3Y`Mx|teBAXkZp22 z?H{F)?Vg_bmn#YvKHK+eZReo5e+)*OO7uRL!lKM7O^FT$43hMPeyc10o)9Cs^@-NL zr)0&ArBaMio<1(DVIyGE);+lotLXZ^s@&AznwZ0|>U3}x&8E3(u<=y!AKjKvA7#^a zjAXLduglC72*xejH76;A6eZ4{MZm(|wddyNH9MaM22?s!OAa_dH{fJ!eQl@b{)U!0 z@bG;3{lK3@O7}0)h+`Xx6M$}wkLrUnQL9PTY-XURuhYr5X&1zuS~EjWT>kin zv>9?Qa~8$yRix!iVE$ zJN_WvByskyxOF=wNPQi=FYTVz2Z^T$k@BsPdmvD7dBQ1aW}=Z$K;$lCM+w-Gisr=_ zIZAIpZVA$Cf9h>=-IBV%c#zjmJ3KWz*u}_>@Re2xT6uDlhQCH-bX%-gHNW(@90=ofETep;{ zg>;}ybryFX>RBy!xgS0rIIT{{85t{})aaYmmHyefC1k{>-}{r&v65L7*ov1Cm(9{L zwEE`lAu~d3&z(T4v6naBw+Ui@luMEdNm~(!i;HVkEab$N`rr89v)RoMntFdgtaTUY z&1(6o@ljiCB9xwr_`LRIC%wG-wOg9qFMd+DnRq(5AingyH^KSq66qdhr!{VTjRkF! z0tf7$KY6~4+xcTR9lYfvkSKq#$wuy@p~_dLb8K0=@r&UbJQ?=>h*X@JIk&fj)kC5) zxAE3g24(KaljCn#C~zKWjg2*1hx#DCSOJCiqM@9}3ELX11WVz6Gt?KaLmA{z-qBhO zHnJL@sm@zFbP}QjMxY`vE0F>I&`3OxRye0Vk4*9zu-e2E2ymJZ1qi(a&|k;x7y~;+ zWxD)>!w7~;gF|{1KX9i4TFwjzy{!?eI^L)j7utvNZ=2#ue|=Bz{hm6gC1{w=?$n4Y zpcaYQRPC7TUq(HKR`Ogl3W4i=fFaJp-WwuKC-8Pex(0+)e?MCr{NPkFk*_G~y%hBV zOvb|DHSkNfd#(h%}-?y=f+^pK}t& z;VRyiL2lLJRqU*mg&@=MVKT<6}S?;;qQYPkN?S^3)!kPlOWO*HEPDow2Lv9zm_|Oh9b4XUHjABTe=mE(zM6(pF3HD!S*s6XutZSdPXkA zTnYIDXEzuzC7`-7-B=Zm?R!VuNa7BC&5CKNf!-vS@0VO}7n$QXtTJ6s46Ke{{;JaV zE%1j*IfIwJN`ofpXYu7Fs##V$=$(+$hqF@Lc1p} z`B(|QfmpEFi0S>dQzNy%;2(J7apez}f`1R(lRvt0Ymz4#enJm)f4sHVY%}_bjl!{% zZh2>Bap~)wp;KJs+^^O3So>Fm{$m9Ypo0v|BbEl2S|T~ttD zXlZ49cQk#}%5rcQmZF@Lo7SkBDpfF$#pHcSAPz-fBr~nrcIo$uk0GZvr0yK+9|x zS?MR%$<9aXa4zv5*Y~McP-?HxfXW4ROYBmC7{n-Q`}|co{n3YLy+~!@viQ=U9A}!% z(Ti-CI}KxPXnBe76z2cL1?`i?CNE}QAc8EYK?eV@Vr}L`B;U&u$YhGD*#S zsSH@g!x+g+I;RGpt<36?$Cl3)=6BHvNKoy~#k#i$tO&h-TO}=ae1kT949TI{q45wN zaW@|2Y30fri7VF2`WqP0XAlUfAnH^fJCVIMCFWuv6N|iXcO4~rn|?Mp1a|3;MWkCk znH{>xKciMip>fb-t7L=Xjx2m>+rcqgL;;|fW_QZ{Npg6ZtKA9WiK386i7(Et&-2HR z{E^|39#r7pZ!jLq8{`KoL=!O+p|i2CR6QTZ#}e_~{@Yd`(d}O4DE5I2?ei8y9GnM) ziW?RibJD`Di*~E8c&E<|voC72#9zMd7Q>IuRNheuLUhQ@$G)2%Cu*`;e91>g79Mnj zeid(eXJ6p|(QO_+9KzBH_BTgMyfo&Qk2VCn+dT?ReXw#JM*P&?3|T;Quh^PYHu?(+ zEqJPnRj1L6o~{1u=4p5mGKK5RZt)6R!X*9sPu6gJY{+mxx~$nr0#tQrbRqNkhrzcH z8@T{<1CKe#Xe^txhyL>Kr8mTnByVg@KuncBk+H?0Yf1|V*=DZNkHtHc7N@94ncqCR z-A^JwLexjtzg=I%t=;dEcg4$}xp8x_FLbj2jEYZfj;!7XA8q>(KJXZShaQkSoevSm z2=+4pC+~IxJLmz-?00=%*;j39Zz3ZjjjXv+pEO9WgI#14X{P#EBMn!{oftYpf=J-# zx|j=R+od)B(42r#G5)`58B;p-f6|ftbX#Yf(@G+T>5@MX*&4vFq``94UP0IiHjteR zZDhx6ro00=x_#X^(sA5!k2*o{17rCL30NufktUemD0W?p@(TO7j}y7&Z0eOz<@O)E zw8+q!`W*<3JmD`V`SN_fUl^f}5MU!r^mmvaf>Kpb?<}Yz>{ggX6TYpSp#SE>e?Rio zbkj(4c%PxKVSZirRzFj*S}TrB;W$B;MzKfYaTV=RtNj6XLzfdXDvZB}ih4wKS?-YV z`ZB|YELZWRFnSxIRgoI_MA*uZNs&TE1!bqFP^eo1ZmQ17(&y3Gp=zD0WKr%!n*S)0 zS2b(fq*eQhoMyee7k9BO`hQt*5Ydz5>|IGvUl=S^+}btkQKg)@BB-c1dTQ{0$&hqv zM1WWQz+JtJZ*lV4rAtrDt_FnmzTY-1dOGW!mwEXo2|A9E(^q-> zk60VPmmp`Tpa_AeV;D8*u`PJxgQ9zK(>=4pM2K7=4!%YjI-I(~))VbXLY-A4O6=Y^7M7)OXlVCI{zes4k>EN&i2ZA!XbpAp ztjPPRRJ3u87h<+#c@@(sU`MytT=-{vK6rDPF|T88npS}su39bYV)~9Xn=Nr#Ntj8$ z@Oi5cH({IQ z_TaugF^^4AYmApMFhtzLU)r>F?55~DV5hoeo%||VS9vym^_C^9qaAt?)-Dp{zWKbX$!Pm1NXfaW&Zkawd@pGDAn5oW zp#P1b*Mj}#p>Fc(craTzC2gcS^}Cdm!eQ_8tr9}0-_>_>-)qN2Zcb7q?s@3xX~DQj zB3f|XO6>ZpoyL6$OvtIK?&j4H0| zP=^gRGZZXpw>z1`-guHoOi3jD*1dJhSVK=0)Bb8V<=Cjt)H9Qw@PDz&-um;sCHmEW zfzSG&!l>nkWvkrA!JHKs)?@$69==xNpf&P6wH_}TvCaPiYvm!;Fpz`;^nF;)*#&|w z1v<6cn{|Berq6V@2e?Z6PMMR2OqFdIZ@X58vg{vV``>TX=DsAaGJkax<6exgXNH2{ zw|!$1OoV_q>#WTac762Uddk+ZJDv^CGlID4!`7Hyn)%m#{nKPWC|+nEOp_}{5l1Bb zIerxIJg6ikMe?aveW`tN034k@`F5swyNUYQOO5+yaY809o}ES*G)Wp7UQ{TRnDno% zUsRLAgA$|-Im&5n4&_pfBS(Edgdp836F&7~oi8z$Ks=q3R9}LC={3E0Oz`#L##I6$ zngHEriAZk6VniiLZgACZCt-f9RqKSLzSigO%(ma3<54kI4yH<-mM7m?<^K-(uqEH$ zOLHy`iT};YW>zS-nkd*Q2rrA!=F1FcXWl};{CqMcj~a|d6vP8O2~FWMJi7CPc=#UL zH|sCrl#Hi#jaC(uZX@nkLgm&W11d=sK$jNun;>uA0$`1yviH>Gp`A3&Zdh!jF|ftM z7$I4V2-}ARa1|WbErn`sec$?~8+&J@=tg_R)+%uN1I#2|V9UY+YHvC2Kr`+EA>-D( z0$mq0w_icKyl<+v&Fn+%cs4h8ys1Ge z2mYse6}vr=5k!^>gwepN5_B;QyMg$)dQydrA-?a}0T6lm z(a8|y4Pv@1*crGk1B2=2K7`2|35MV`gT?R{-!aShw21iV3AA-`%(z5O6vYx@Yneq4 zYs38~AE&`%VKZrUu6zI-3B8~y|0zEQfQaFiJ)YSUyeA?4V}SDM-pmvd(MaSVx5;!G zbxw9?K1S#PYb~QrjZK0kOJYF)JHEG@dCkVvR^u?L3A{)1Y);9Rqf6=A!+i`*@xW_` zY%}`ok42ELKzBkR%5~hG5C6lB3P2c>7$Ps*E1HYg>vtV~Vc>pHHUK4!{9DACj` zPQD%#b=AxPgc?6B$4r`pQ5Hq{SB}nE2MWRAe7#s1AIQ{oEM8?^ZRBtFn+yQx=O>w& z*Xuc&>>yeotu6!BohuVRDV^Z0vDEYaY0f;Ef8P9Z2OJPC*k7z`2P*N8Hc)YKGSWbm9s5N zI;*s}l^xw)R*#iFI)CfT(tx(cNq0VLB2D_2@2tVKAf$?K&UO^j%2f*S2fZ;G%yEfn zz|q43RtL7oY?Ctm->`Fsn(z?OL1>hFr|aP~0r*thP}wwrMMRy9?|>y8o#ieY{Qh5W z)}K!am-X8J-GNW!h~D4(m70^~)T~rFM>W+bBNn6ymE{kfb!|_v_B2`j9XrTZy+JS& zDMQrOnK+Jf0@vc9Q8XlPi91}PHh>MgU34Pv?YiJVfbm)^DfaCfQ?#gy%O29#-^Y^J zB{elq1F#tuHfMUQ7XOfxqTl`ft~x(~^Ao-n>{Q2aYs5jm{S9cn&`N|H=7 zM>&OLc~6%Z0Kk9W6o{al+1UwGp)aXht!Y^oe2V2k2Z-%`mWzp}kwW@~i2=}J;Q{0r x5JF<)fG|mD0D3rplpOpD<^NMB2yX8a3Pg#Z)#2@_13pX&kP?>{s}wN|_#Yu%FLM9@ literal 0 HcmV?d00001 diff --git a/frontend/assets/resources/animation/SolderWaterGhost.meta b/frontend/assets/resources/animation/SolderWaterGhost.meta new file mode 100644 index 0000000..42c71e4 --- /dev/null +++ b/frontend/assets/resources/animation/SolderWaterGhost.meta @@ -0,0 +1,7 @@ +{ + "ver": "1.0.1", + "uuid": "8f2f76c7-649c-414a-80be-b2daef4ed580", + "isSubpackage": false, + "subpackageName": "", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json new file mode 100644 index 0000000..d70c3a4 --- /dev/null +++ b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json @@ -0,0 +1 @@ +{"frameRate":60,"name":"SoldierWaterGhost","version":"5.5","compatibleVersion":"5.5","armature":[{"type":"Armature","frameRate":60,"name":"SoldierWaterGhost","aabb":{"x":-34.2,"y":-91.74,"width":77.68,"height":94.31},"bone":[{"name":"root"},{"inheritScale":false,"length":13,"name":"leftShoulder","parent":"root","transform":{"x":-11.2185,"y":-56.7863,"skX":156.8918,"skY":156.8918}},{"inheritScale":false,"name":"backLight","parent":"root","transform":{"x":0.2,"y":-46.0924,"scX":3,"scY":3}},{"inheritScale":false,"length":17,"name":"rightArm","parent":"root","transform":{"x":13.5908,"y":-53.6036,"skX":46.9769,"skY":46.9769}},{"inheritScale":false,"name":"effect4","parent":"root","transform":{"x":12.64,"y":-42.7787,"skX":-9.349,"skY":-9.349}},{"inheritScale":false,"name":"effect7","parent":"root"},{"inheritScale":false,"name":"effect3","parent":"root","transform":{"x":11.5,"y":-54.7347}},{"inheritScale":false,"length":17,"name":"leg","parent":"root","transform":{"x":-0.9105,"y":-2.8201,"skX":-85.7242,"skY":-85.7242}},{"inheritScale":false,"length":22,"name":"body","parent":"root","transform":{"x":2.0039,"y":-24.7902,"skX":-82.2714,"skY":-82.2714}},{"inheritScale":false,"length":12,"name":"rightShoulder","parent":"root","transform":{"x":18.2082,"y":-52.6804,"skX":22.0857,"skY":22.0857}},{"inheritScale":false,"length":11,"name":"head","parent":"root","transform":{"x":8.206,"y":-62.581,"skX":-83.4757,"skY":-83.4757}},{"inheritScale":false,"length":10,"name":"leftArm","parent":"root","transform":{"x":-13.0118,"y":-53.6185,"skX":122.5397,"skY":122.5397}},{"inheritScale":false,"name":"effect2","parent":"root","transform":{"x":-10.0286,"y":-56.4408,"skX":-79.3059,"skY":-79.3059}},{"inheritScale":false,"name":"effect5","parent":"root","transform":{"x":-30.0572,"y":-33.1972,"skX":-72.4737,"skY":-72.4737}},{"inheritScale":false,"name":"effect6","parent":"root","transform":{"x":26.5689,"y":-30.0747}},{"inheritScale":false,"name":"rightFrontArm","parent":"rightArm","transform":{"x":17.6467,"y":1.3208,"skX":10.7237,"skY":10.7237}},{"inheritScale":false,"name":"leftFrontArm","parent":"leftArm","transform":{"x":14.7447,"y":3.5738,"skX":-39.1583,"skY":-39.1583}},{"inheritScale":false,"name":"rightHand","parent":"rightFrontArm","transform":{"x":10.7292,"y":-5.7822,"skX":21.9835,"skY":21.9835}},{"inheritScale":false,"name":"leftHand","parent":"leftFrontArm","transform":{"x":14.7808,"y":2.8582,"skX":-25.7356,"skY":-25.7356}}],"slot":[{"name":"backLight","parent":"backLight"},{"name":"rightArm","parent":"rightArm"},{"name":"leg","parent":"leg"},{"name":"body","parent":"body"},{"name":"rightShoulder","parent":"rightShoulder"},{"name":"rightFrontArm","parent":"rightFrontArm"},{"name":"rightHand","parent":"rightHand"},{"name":"leftArm","parent":"leftArm"},{"name":"leftShoulder","parent":"leftShoulder"},{"name":"leftFrontArm","parent":"leftFrontArm"},{"name":"head","parent":"head"},{"name":"leftHand","parent":"leftHand"},{"name":"effect2","parent":"effect2"},{"name":"effect3","parent":"effect3"},{"name":"effect4","parent":"effect4"},{"name":"effect5","parent":"effect5"},{"name":"effect6","parent":"effect6"},{"displayIndex":-1,"name":"effect7","parent":"effect7"}],"skin":[{"slot":[{"name":"leg","display":[{"name":"yinmoqe00","transform":{"x":10.63,"y":-0.15,"skX":85.72,"skY":85.72}}]},{"name":"head","display":[{"name":"yinmo01","transform":{"x":13.01,"y":-2.08,"skX":82.3,"skY":82.3,"scX":1.5,"scY":1.5},"path":"head"},{"name":"head2","transform":{"x":13.28,"y":-2.44,"skX":83.48,"skY":83.48}}]},{"name":"leftFrontArm","display":[{"name":"yinmo06","transform":{"x":6.29,"y":0.98,"skX":-76.83,"skY":-76.83},"path":"leftFrontArm"}]},{"name":"body","display":[{"name":"yinmo02","transform":{"x":12.81,"y":-2.38,"skX":82.27,"skY":82.27},"path":"body"}]},{"name":"leftShoulder","display":[{"name":"yinmo03","transform":{"x":4.79,"y":-0.12,"skX":-154.62,"skY":-154.62},"path":"leftShoulder"}]},{"name":"backLight","display":[{"name":"biu"}]},{"name":"effect5","display":[{"name":"huomiao01"}]},{"name":"rightArm","display":[{"name":"yinmo08","transform":{"x":9.07,"y":-0.39,"skX":-54.4,"skY":-54.4},"path":"rightArm"}]},{"name":"rightShoulder","display":[{"name":"yinmo04","transform":{"x":3.42,"y":-0.82,"skX":-28.61,"skY":-28.61},"path":"rightShoulder"}]},{"name":"effect6","display":[{"name":"huomiao01"}]},{"name":"rightFrontArm","display":[{"name":"yinmo09","transform":{"x":3.74,"y":-1.19,"skX":-60.14,"skY":-60.14},"path":"rightFrontArm"}]},{"name":"rightHand","display":[{"name":"yinmo10","transform":{"x":5.38,"y":-0.23,"skX":-63.84,"skY":-63.84},"path":"rightHand"}]},{"name":"effect4","display":[{"name":"huomiao01"}]},{"name":"effect2","display":[{"name":"huomiao01"}]},{"name":"leftArm","display":[{"name":"yinmo05","transform":{"x":6.91,"y":0.09,"skX":-112.43,"skY":-112.43},"path":"leftArm"}]},{"name":"effect3","display":[{"name":"huomiao01"}]},{"name":"leftHand","display":[{"name":"yinmo07","transform":{"x":4.09,"y":-0.34,"skX":-66.8,"skY":-66.8},"path":"leftHand"}]}]}],"animation":[{"duration":60,"playTimes":0,"name":"Walking","bone":[{"name":"effect5","translateFrame":[{"duration":12,"tweenEasing":0,"x":44.16,"y":14.08},{"duration":12,"tweenEasing":0,"x":44.16,"y":14.08},{"duration":15,"tweenEasing":0,"x":31.04,"y":15.36},{"duration":15,"tweenEasing":0,"x":22.08,"y":-0.64},{"duration":6,"x":-10.24,"y":-23.36}],"rotateFrame":[{"duration":24,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":21,"rotate":7.3}]},{"name":"effect4","translateFrame":[{"duration":6,"tweenEasing":0,"x":7.36,"y":-2.48},{"duration":9,"tweenEasing":0,"x":7.36,"y":-2.48},{"duration":15,"tweenEasing":0,"x":-2,"y":-15.76},{"duration":12,"tweenEasing":0,"x":-14.48,"y":-20.48},{"duration":12,"tweenEasing":0,"x":-14.64,"y":-36.8},{"duration":6,"x":-40.56,"y":-53.04}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":-49.96},{"duration":15,"tweenEasing":0,"rotate":-49.96},{"duration":12,"tweenEasing":0,"rotate":-84.92},{"duration":12,"tweenEasing":0,"rotate":-11.77},{"duration":6,"rotate":-28.57}]},{"name":"effect3","translateFrame":[{"duration":6,"tweenEasing":0,"x":-14.8,"y":25.6},{"duration":12,"tweenEasing":0,"x":-14.8,"y":25.6},{"duration":18,"tweenEasing":0,"x":-29.2,"y":17.6},{"duration":12,"tweenEasing":0,"x":-38,"y":9.2},{"duration":9,"tweenEasing":0,"x":-56.4,"y":4.4},{"duration":3,"x":-68.8,"y":4}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":18,"tweenEasing":0,"rotate":-59.23},{"duration":12,"tweenEasing":0,"rotate":-36.85},{"duration":9,"tweenEasing":0,"rotate":-66.48},{"duration":3,"rotate":-111.5}]},{"name":"effect2","translateFrame":[{"duration":3,"tweenEasing":0,"x":10.56,"y":11.2},{"duration":12,"tweenEasing":0,"x":10.56,"y":11.2},{"duration":15,"tweenEasing":0,"x":-1.6,"y":1.6},{"duration":18,"tweenEasing":0,"x":-19.84,"y":3.2},{"duration":9,"tweenEasing":0,"x":-29.76,"y":-6.72},{"duration":3,"x":-39.68,"y":-24}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":18,"tweenEasing":0,"rotate":-61.22},{"duration":9,"tweenEasing":0,"rotate":0.48},{"duration":3,"rotate":27.59}]},{"name":"leftHand","rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"rotate":11.3},{"duration":15,"tweenEasing":0,"rotate":15.68},{"duration":15,"tweenEasing":0,"rotate":-5.06},{"duration":0}]},{"name":"leftFrontArm","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":0.15,"y":1.19},{"duration":15,"tweenEasing":0,"x":0.46,"y":-1.06},{"duration":15,"tweenEasing":0,"x":-0.33,"y":-2.07},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":-4.65},{"duration":15,"tweenEasing":0,"rotate":12.03},{"duration":15,"tweenEasing":0,"rotate":23.96},{"duration":15,"tweenEasing":0,"rotate":16.54},{"duration":0,"rotate":-4.65}]},{"name":"leftShoulder","translateFrame":[{"duration":15,"tweenEasing":0,"x":5.76},{"duration":15,"tweenEasing":0,"x":5.14,"y":1.94},{"duration":15,"tweenEasing":0,"x":8.29,"y":-0.16},{"duration":15,"tweenEasing":0,"x":7.36,"y":2.19},{"duration":0,"x":5.76}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":20.1},{"duration":15,"tweenEasing":0,"rotate":-5.43},{"duration":15,"tweenEasing":0,"rotate":10.13},{"duration":15,"tweenEasing":0,"rotate":-2.7},{"duration":0,"rotate":20.1}]},{"name":"leftArm","translateFrame":[{"duration":15,"tweenEasing":0,"x":3.84,"y":-0.96},{"duration":15,"tweenEasing":0,"x":7.18,"y":1.44},{"duration":15,"tweenEasing":0,"x":13.26,"y":3.09},{"duration":15,"tweenEasing":0,"x":11.89,"y":3.87},{"duration":0,"x":3.84,"y":-0.96}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":26.91},{"duration":15,"tweenEasing":0,"rotate":-35.34},{"duration":15,"tweenEasing":0,"rotate":-70.51},{"duration":15,"tweenEasing":0,"rotate":-30.69},{"duration":0,"rotate":26.91}]},{"name":"head","translateFrame":[{"duration":15,"tweenEasing":0,"x":5.44,"y":1.28},{"duration":15,"tweenEasing":0,"x":4.96,"y":4.88},{"duration":15,"tweenEasing":0,"x":7.29,"y":0.64},{"duration":15,"tweenEasing":0,"x":7.59,"y":5.42},{"duration":0,"x":5.44,"y":1.28}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":0.59},{"duration":15,"tweenEasing":0,"rotate":0.59},{"duration":15,"tweenEasing":0,"rotate":-0.72},{"duration":15,"tweenEasing":0,"rotate":-0.72},{"duration":0,"rotate":0.59}]},{"name":"rightShoulder","translateFrame":[{"duration":15,"tweenEasing":0,"x":3.41,"y":1.17},{"duration":15,"tweenEasing":0,"x":1.71,"y":2.68},{"duration":15,"tweenEasing":0,"x":3.89,"y":0.18},{"duration":15,"tweenEasing":0,"x":5.61,"y":3.87},{"duration":0,"x":3.41,"y":1.17}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":10.12},{"duration":15,"tweenEasing":0,"rotate":-14.23},{"duration":15,"tweenEasing":0,"rotate":5.57},{"duration":15,"tweenEasing":0,"rotate":-13.84},{"duration":0,"rotate":10.12}]},{"name":"body","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"y":2.72},{"duration":15,"tweenEasing":0,"x":0.96,"y":-0.18},{"duration":15,"tweenEasing":0,"x":1.42,"y":3.34},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":11.24},{"duration":15,"tweenEasing":0,"rotate":13},{"duration":15,"tweenEasing":0,"rotate":16.36},{"duration":15,"tweenEasing":0,"rotate":14.15},{"duration":0,"rotate":11.24}]},{"name":"leg","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":-0.96},{"duration":6,"tweenEasing":0,"x":-0.8},{"duration":6,"tweenEasing":0,"x":-0.96},{"duration":6,"tweenEasing":0,"x":-0.96},{"duration":12,"tweenEasing":0,"x":0.64},{"duration":6,"tweenEasing":0,"x":0.64},{"duration":6,"tweenEasing":0,"x":-0.32},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":1.02},{"duration":24,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":-0.52},{"duration":6}],"scaleFrame":[{"duration":6,"tweenEasing":0,"y":0.9},{"duration":6,"tweenEasing":0,"y":0.8},{"duration":6,"tweenEasing":0,"y":1.1},{"duration":6,"tweenEasing":0,"y":0.8},{"duration":12,"tweenEasing":0,"y":0.9},{"duration":6,"tweenEasing":0,"y":0.9},{"duration":6,"tweenEasing":0,"y":0.8},{"duration":12,"y":0.9}]},{"name":"rightHand","translateFrame":[{"duration":60,"x":-1.95,"y":-1.15}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":-8},{"duration":15,"tweenEasing":0,"rotate":-1.89},{"duration":15,"tweenEasing":0,"rotate":11.7},{"duration":15,"tweenEasing":0,"rotate":0.14},{"duration":0,"rotate":-8}]},{"name":"rightFrontArm","translateFrame":[{"duration":15,"tweenEasing":0,"x":-0.19,"y":-1.7},{"duration":15,"tweenEasing":0,"x":0.81,"y":-2.06},{"duration":15,"tweenEasing":0,"x":0.11,"y":-0.1},{"duration":3,"tweenEasing":0,"x":0.11,"y":-0.1},{"duration":6,"tweenEasing":0,"x":-0.08,"y":-2.55},{"duration":6,"tweenEasing":0,"y":-2.64},{"duration":0,"x":-0.19,"y":-1.7}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":-43.73},{"duration":15,"tweenEasing":0,"rotate":-66.02},{"duration":15,"tweenEasing":0,"rotate":-6.47},{"duration":3,"tweenEasing":0,"rotate":-62.6},{"duration":6,"tweenEasing":0,"rotate":-58.82},{"duration":6,"tweenEasing":0,"rotate":-51.28},{"duration":0,"rotate":-43.73}]},{"name":"rightArm","translateFrame":[{"duration":15,"tweenEasing":0,"x":4.32,"y":4.08},{"duration":15,"tweenEasing":0,"x":4.96,"y":2.34},{"duration":15,"tweenEasing":0,"x":-8.37,"y":-4.26},{"duration":15,"tweenEasing":0,"x":4.21,"y":3.38},{"duration":0,"x":4.32,"y":4.08}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":11.28},{"duration":15,"tweenEasing":0,"rotate":63.1},{"duration":15,"tweenEasing":0,"rotate":74.64},{"duration":15,"tweenEasing":0,"rotate":55.11},{"duration":0,"rotate":11.28}]}],"slot":[{"name":"effect5","displayFrame":[{"duration":12,"value":-1},{"duration":45},{"duration":3,"value":-1}],"colorFrame":[{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":6,"value":{"aM":0}}]},{"name":"effect4","displayFrame":[{"duration":6,"value":-1},{"duration":51},{"duration":3,"value":-1}],"colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":27,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":6,"value":{"aM":0}}]},{"name":"effect3","displayFrame":[{"duration":6,"value":-1},{"duration":54},{"duration":0,"value":-1}],"colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":30,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":3,"value":{"aM":0}}]},{"name":"effect2","displayFrame":[{"duration":60},{"duration":0,"value":-1}],"colorFrame":[{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":33,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":3,"value":{"aM":0}}]},{"name":"backLight","displayFrame":[{"duration":60,"value":-1}]},{"name":"effect6","displayFrame":[{"duration":60,"value":-1}]}]},{"duration":174,"name":"Atk2","bone":[{"name":"effect5","translateFrame":[{"duration":18,"tweenEasing":0,"x":33.4,"y":-11},{"duration":12,"tweenEasing":0,"x":33.4,"y":-11},{"duration":12,"tweenEasing":0,"x":26.6,"y":-37.6},{"duration":12,"tweenEasing":0,"x":29.6,"y":-47},{"duration":24,"tweenEasing":0,"x":22.4,"y":-63.2},{"duration":12,"tweenEasing":0,"x":33.4,"y":-11},{"duration":12,"tweenEasing":0,"x":26.6,"y":-37.6},{"duration":12,"tweenEasing":0,"x":29.6,"y":-47},{"duration":24,"tweenEasing":0,"x":22.4,"y":-63.2},{"duration":12,"tweenEasing":0,"x":33.4,"y":-11},{"duration":12,"tweenEasing":0,"x":26.6,"y":-37.6},{"duration":9,"tweenEasing":0,"x":29.6,"y":-47},{"duration":3,"x":22.4,"y":-63.2}],"rotateFrame":[{"duration":18,"tweenEasing":0,"rotate":33.54},{"duration":12,"tweenEasing":0,"rotate":33.54},{"duration":12,"tweenEasing":0,"rotate":56.49},{"duration":12,"tweenEasing":0,"rotate":11.57},{"duration":24,"tweenEasing":0,"rotate":61.88},{"duration":12,"tweenEasing":0,"rotate":33.54},{"duration":12,"tweenEasing":0,"rotate":56.49},{"duration":12,"tweenEasing":0,"rotate":11.57},{"duration":24,"tweenEasing":0,"rotate":61.88},{"duration":12,"tweenEasing":0,"rotate":33.54},{"duration":12,"tweenEasing":0,"rotate":56.49},{"duration":9,"tweenEasing":0,"rotate":11.57},{"duration":3,"rotate":61.88}]},{"name":"effect4","translateFrame":[{"duration":12,"tweenEasing":0,"x":6.86,"y":9.83},{"duration":12,"tweenEasing":0,"x":6.86,"y":9.83},{"duration":15,"tweenEasing":0,"x":8.69,"y":-11.2},{"duration":12,"tweenEasing":0,"x":-3.89,"y":-32.46},{"duration":21,"tweenEasing":0,"x":5.03,"y":-47.77},{"duration":12,"tweenEasing":0,"x":6.86,"y":9.83},{"duration":15,"tweenEasing":0,"x":8.69,"y":-11.2},{"duration":12,"tweenEasing":0,"x":-3.89,"y":-32.46},{"duration":21,"tweenEasing":0,"x":5.03,"y":-47.77},{"duration":12,"tweenEasing":0,"x":6.86,"y":9.83},{"duration":12,"tweenEasing":0,"x":8.69,"y":-11.2},{"duration":12,"tweenEasing":0,"x":-3.89,"y":-32.46},{"duration":6,"x":5.03,"y":-47.77}],"rotateFrame":[{"duration":12,"tweenEasing":0,"rotate":-12.09},{"duration":12,"tweenEasing":0,"rotate":-12.09},{"duration":15,"tweenEasing":0,"rotate":-56.61},{"duration":12,"tweenEasing":0,"rotate":-44.01},{"duration":21,"tweenEasing":0,"rotate":-53.65},{"duration":12,"tweenEasing":0,"rotate":-12.09},{"duration":15,"tweenEasing":0,"rotate":-56.61},{"duration":12,"tweenEasing":0,"rotate":-44.01},{"duration":21,"tweenEasing":0,"rotate":-53.65},{"duration":12,"tweenEasing":0,"rotate":-12.09},{"duration":12,"tweenEasing":0,"rotate":-56.61},{"duration":12,"tweenEasing":0,"rotate":-44.01},{"duration":6,"rotate":-53.65}]},{"name":"effect3","translateFrame":[{"duration":9,"tweenEasing":0,"y":15.09},{"duration":15,"tweenEasing":0,"y":15.09},{"duration":15,"tweenEasing":0,"x":-12.57,"y":-18.51},{"duration":12,"tweenEasing":0,"x":-24.23,"y":-35.89},{"duration":18,"tweenEasing":0,"x":-37.94,"y":-42.74},{"duration":15,"tweenEasing":0,"y":15.09},{"duration":15,"tweenEasing":0,"x":-12.57,"y":-18.51},{"duration":12,"tweenEasing":0,"x":-24.23,"y":-35.89},{"duration":18,"tweenEasing":0,"x":-37.94,"y":-42.74},{"duration":15,"tweenEasing":0,"y":15.09},{"duration":12,"tweenEasing":0,"x":-12.57,"y":-18.51},{"duration":12,"tweenEasing":0,"x":-24.23,"y":-35.89},{"duration":6,"x":-37.94,"y":-42.74}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":-42.15},{"duration":15,"tweenEasing":0,"rotate":-42.15},{"duration":12,"tweenEasing":0,"rotate":-77.72},{"duration":18,"tweenEasing":0,"rotate":-111.08},{"duration":15,"tweenEasing":0,"rotate":-42.15},{"duration":15,"tweenEasing":0,"rotate":-42.15},{"duration":12,"tweenEasing":0,"rotate":-77.72},{"duration":18,"tweenEasing":0,"rotate":-111.08},{"duration":15,"tweenEasing":0,"rotate":-42.15},{"duration":12,"tweenEasing":0,"rotate":-42.15},{"duration":12,"tweenEasing":0,"rotate":-77.72},{"duration":6,"rotate":-111.08}]},{"name":"effect2","translateFrame":[{"duration":6,"tweenEasing":0,"x":2.51,"y":23.54},{"duration":9,"tweenEasing":0,"x":2.51,"y":23.54},{"duration":15,"tweenEasing":0,"x":-3.2,"y":-0.46},{"duration":15,"tweenEasing":0,"x":-28.57,"y":-8.23},{"duration":15,"tweenEasing":0,"x":-27.43,"y":-20.57},{"duration":15,"tweenEasing":0,"x":2.51,"y":23.54},{"duration":15,"tweenEasing":0,"x":-3.2,"y":-0.46},{"duration":15,"tweenEasing":0,"x":-28.57,"y":-8.23},{"duration":15,"tweenEasing":0,"x":-27.43,"y":-20.57},{"duration":15,"tweenEasing":0,"x":2.51,"y":23.54},{"duration":15,"tweenEasing":0,"x":-3.2,"y":-0.46},{"duration":15,"tweenEasing":0,"x":-28.57,"y":-8.23},{"duration":9,"x":-27.43,"y":-20.57}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":15,"tweenEasing":0,"rotate":44.61},{"duration":15,"tweenEasing":0,"rotate":26.09},{"duration":15,"tweenEasing":0,"rotate":57.19},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"rotate":44.61},{"duration":15,"tweenEasing":0,"rotate":26.09},{"duration":15,"tweenEasing":0,"rotate":57.19},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"rotate":44.61},{"duration":15,"tweenEasing":0,"rotate":26.09},{"duration":9,"rotate":57.19}]},{"name":"leftHand","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.1,"y":0.47},{"duration":3,"tweenEasing":0,"x":0.7,"y":0.08},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.44,"y":0.2},{"duration":12,"tweenEasing":0,"x":0.12,"y":0.59},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.1,"y":0.47},{"duration":3,"tweenEasing":0,"x":0.7,"y":0.08},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.44,"y":0.2},{"duration":12,"tweenEasing":0,"x":0.12,"y":0.59},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.1,"y":0.47},{"duration":3,"tweenEasing":0,"x":0.7,"y":0.08},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.44,"y":0.2},{"duration":12,"tweenEasing":0,"x":0.12,"y":0.59},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-7.81},{"duration":3,"tweenEasing":0,"rotate":-6.46},{"duration":15,"tweenEasing":0,"rotate":8.11},{"duration":3,"tweenEasing":0,"rotate":9.3},{"duration":3,"tweenEasing":0,"rotate":15.3},{"duration":12,"tweenEasing":0,"rotate":-14.89},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-7.81},{"duration":3,"tweenEasing":0,"rotate":-6.46},{"duration":15,"tweenEasing":0,"rotate":8.11},{"duration":3,"tweenEasing":0,"rotate":9.3},{"duration":3,"tweenEasing":0,"rotate":15.3},{"duration":12,"tweenEasing":0,"rotate":-14.89},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-7.81},{"duration":3,"tweenEasing":0,"rotate":-6.46},{"duration":15,"tweenEasing":0,"rotate":8.11},{"duration":3,"tweenEasing":0,"rotate":9.3},{"duration":3,"tweenEasing":0,"rotate":15.3},{"duration":12,"tweenEasing":0,"rotate":-14.89},{"duration":0}]},{"name":"leftFrontArm","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":2.96,"y":-1.21},{"duration":3,"tweenEasing":0,"x":0.28,"y":0.35},{"duration":15,"tweenEasing":0,"x":1.5,"y":-3.97},{"duration":3,"tweenEasing":0,"x":1.5,"y":-3.97},{"duration":3,"tweenEasing":0,"x":0.65,"y":-3},{"duration":12,"tweenEasing":0,"x":0.49,"y":-0.89},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":2.96,"y":-1.21},{"duration":3,"tweenEasing":0,"x":0.28,"y":0.35},{"duration":15,"tweenEasing":0,"x":1.5,"y":-3.97},{"duration":3,"tweenEasing":0,"x":1.5,"y":-3.97},{"duration":3,"tweenEasing":0,"x":0.65,"y":-3},{"duration":12,"tweenEasing":0,"x":0.49,"y":-0.89},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":2.96,"y":-1.21},{"duration":3,"tweenEasing":0,"x":0.28,"y":0.35},{"duration":15,"tweenEasing":0,"x":1.5,"y":-3.97},{"duration":3,"tweenEasing":0,"x":1.5,"y":-3.97},{"duration":3,"tweenEasing":0,"x":0.65,"y":-3},{"duration":12,"tweenEasing":0,"x":0.49,"y":-0.89},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":26.32},{"duration":3,"tweenEasing":0,"rotate":13.47},{"duration":15,"tweenEasing":0,"rotate":17.13},{"duration":3,"tweenEasing":0,"rotate":-10.43},{"duration":3,"tweenEasing":0,"rotate":-11.34},{"duration":12,"tweenEasing":0,"rotate":-21.72},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":26.32},{"duration":3,"tweenEasing":0,"rotate":13.47},{"duration":15,"tweenEasing":0,"rotate":17.13},{"duration":3,"tweenEasing":0,"rotate":-10.43},{"duration":3,"tweenEasing":0,"rotate":-11.34},{"duration":12,"tweenEasing":0,"rotate":-21.72},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":26.32},{"duration":3,"tweenEasing":0,"rotate":13.47},{"duration":15,"tweenEasing":0,"rotate":17.13},{"duration":3,"tweenEasing":0,"rotate":-10.43},{"duration":3,"tweenEasing":0,"rotate":-11.34},{"duration":12,"tweenEasing":0,"rotate":-21.72},{"duration":0}],"scaleFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.07,"y":1.07},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.06,"y":1.06},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.07,"y":1.07},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.06,"y":1.06},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.07,"y":1.07},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.06,"y":1.06},{"duration":0}]},{"name":"leftShoulder","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":10.32,"y":5.25},{"duration":3,"tweenEasing":0,"x":15.99,"y":2.07},{"duration":15,"tweenEasing":0,"x":-14.24,"y":3.29},{"duration":3,"tweenEasing":0,"x":-20.77,"y":-0.8},{"duration":3,"tweenEasing":0,"x":-7.4,"y":-0.01},{"duration":12,"tweenEasing":0,"x":9.35,"y":3.21},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":10.32,"y":5.25},{"duration":3,"tweenEasing":0,"x":15.99,"y":2.07},{"duration":15,"tweenEasing":0,"x":-14.24,"y":3.29},{"duration":3,"tweenEasing":0,"x":-20.77,"y":-0.8},{"duration":3,"tweenEasing":0,"x":-7.4,"y":-0.01},{"duration":12,"tweenEasing":0,"x":9.35,"y":3.21},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":10.32,"y":5.25},{"duration":3,"tweenEasing":0,"x":15.99,"y":2.07},{"duration":15,"tweenEasing":0,"x":-14.24,"y":3.29},{"duration":3,"tweenEasing":0,"x":-20.77,"y":-0.8},{"duration":3,"tweenEasing":0,"x":-7.4,"y":-0.01},{"duration":12,"tweenEasing":0,"x":9.35,"y":3.21},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":51.6},{"duration":3,"tweenEasing":0,"rotate":0.72},{"duration":15,"tweenEasing":0,"rotate":-26.65},{"duration":3,"tweenEasing":0,"rotate":-44.38},{"duration":3,"tweenEasing":0,"rotate":-6.99},{"duration":12,"tweenEasing":0,"rotate":18.04},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":51.6},{"duration":3,"tweenEasing":0,"rotate":0.72},{"duration":15,"tweenEasing":0,"rotate":-26.65},{"duration":3,"tweenEasing":0,"rotate":-44.38},{"duration":3,"tweenEasing":0,"rotate":-6.99},{"duration":12,"tweenEasing":0,"rotate":18.04},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":51.6},{"duration":3,"tweenEasing":0,"rotate":0.72},{"duration":15,"tweenEasing":0,"rotate":-26.65},{"duration":3,"tweenEasing":0,"rotate":-44.38},{"duration":3,"tweenEasing":0,"rotate":-6.99},{"duration":12,"tweenEasing":0,"rotate":18.04},{"duration":0}]},{"name":"leftArm","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":8.51,"y":-1.26},{"duration":3,"tweenEasing":0,"x":15.88,"y":0.43},{"duration":15,"tweenEasing":0,"x":-0.36,"y":1.05},{"duration":3,"tweenEasing":0,"x":-5.81,"y":-1.2},{"duration":3,"tweenEasing":0,"x":3.44,"y":2.61},{"duration":12,"tweenEasing":0,"x":9.85,"y":0.52},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":8.51,"y":-1.26},{"duration":3,"tweenEasing":0,"x":15.88,"y":0.43},{"duration":15,"tweenEasing":0,"x":-0.36,"y":1.05},{"duration":3,"tweenEasing":0,"x":-5.81,"y":-1.2},{"duration":3,"tweenEasing":0,"x":3.44,"y":2.61},{"duration":12,"tweenEasing":0,"x":9.85,"y":0.52},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":8.51,"y":-1.26},{"duration":3,"tweenEasing":0,"x":15.88,"y":0.43},{"duration":15,"tweenEasing":0,"x":-0.36,"y":1.05},{"duration":3,"tweenEasing":0,"x":-5.81,"y":-1.2},{"duration":3,"tweenEasing":0,"x":3.44,"y":2.61},{"duration":12,"tweenEasing":0,"x":9.85,"y":0.52},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":57.33},{"duration":3,"tweenEasing":0,"rotate":-11.62},{"duration":15,"tweenEasing":0,"rotate":-161.51},{"duration":3,"tweenEasing":0,"rotate":177.69},{"duration":3,"tweenEasing":0,"rotate":-129.73},{"duration":12,"tweenEasing":0,"rotate":-7.29},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":57.33},{"duration":3,"tweenEasing":0,"rotate":-11.62},{"duration":15,"tweenEasing":0,"rotate":-161.51},{"duration":3,"tweenEasing":0,"rotate":177.69},{"duration":3,"tweenEasing":0,"rotate":-129.73},{"duration":12,"tweenEasing":0,"rotate":-7.29},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":57.33},{"duration":3,"tweenEasing":0,"rotate":-11.62},{"duration":15,"tweenEasing":0,"rotate":-161.51},{"duration":3,"tweenEasing":0,"rotate":177.69},{"duration":3,"tweenEasing":0,"rotate":-129.73},{"duration":12,"tweenEasing":0,"rotate":-7.29},{"duration":0}],"scaleFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":1.1,"y":1.1},{"duration":3,"tweenEasing":0,"x":1.1},{"duration":39,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":1.1,"y":1.1},{"duration":3,"tweenEasing":0,"x":1.1},{"duration":39,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":1.1,"y":1.1},{"duration":3,"tweenEasing":0,"x":1.1},{"duration":15}]},{"name":"head","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":11.17,"y":11.95},{"duration":3,"tweenEasing":0,"x":17.87,"y":16.22},{"duration":15,"tweenEasing":0,"x":-17.67,"y":1.23},{"duration":3,"tweenEasing":0,"x":-18.56,"y":-2},{"duration":3,"tweenEasing":0,"x":-8.49,"y":-0.72},{"duration":12,"tweenEasing":0,"x":9.18,"y":7.81},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":11.17,"y":11.95},{"duration":3,"tweenEasing":0,"x":17.87,"y":16.22},{"duration":15,"tweenEasing":0,"x":-17.67,"y":1.23},{"duration":3,"tweenEasing":0,"x":-18.56,"y":-2},{"duration":3,"tweenEasing":0,"x":-8.49,"y":-0.72},{"duration":12,"tweenEasing":0,"x":9.18,"y":7.81},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":11.17,"y":11.95},{"duration":3,"tweenEasing":0,"x":17.87,"y":16.22},{"duration":15,"tweenEasing":0,"x":-17.67,"y":1.23},{"duration":3,"tweenEasing":0,"x":-18.56,"y":-2},{"duration":3,"tweenEasing":0,"x":-8.49,"y":-0.72},{"duration":12,"tweenEasing":0,"x":9.18,"y":7.81},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":5.13},{"duration":3,"tweenEasing":0,"rotate":4.91},{"duration":15,"tweenEasing":0,"rotate":-41.98},{"duration":3,"tweenEasing":0,"rotate":-28.02},{"duration":3,"tweenEasing":0,"rotate":-19.11},{"duration":12,"tweenEasing":0,"rotate":0.01},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":5.13},{"duration":3,"tweenEasing":0,"rotate":4.91},{"duration":15,"tweenEasing":0,"rotate":-41.98},{"duration":3,"tweenEasing":0,"rotate":-28.02},{"duration":3,"tweenEasing":0,"rotate":-19.11},{"duration":12,"tweenEasing":0,"rotate":0.01},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":5.13},{"duration":3,"tweenEasing":0,"rotate":4.91},{"duration":15,"tweenEasing":0,"rotate":-41.98},{"duration":3,"tweenEasing":0,"rotate":-28.02},{"duration":3,"tweenEasing":0,"rotate":-19.11},{"duration":12,"tweenEasing":0,"rotate":0.01},{"duration":0}]},{"name":"rightShoulder","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":7.13,"y":4.46},{"duration":3,"tweenEasing":0,"x":10.32,"y":7.06},{"duration":15,"tweenEasing":0,"x":-22.31,"y":-2.2},{"duration":3,"tweenEasing":0,"x":-20.91,"y":-5.68},{"duration":3,"tweenEasing":0,"x":-8.89,"y":-0.87},{"duration":12,"tweenEasing":0,"x":6.95,"y":5.43},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":7.13,"y":4.46},{"duration":3,"tweenEasing":0,"x":10.32,"y":7.06},{"duration":15,"tweenEasing":0,"x":-22.31,"y":-2.2},{"duration":3,"tweenEasing":0,"x":-20.91,"y":-5.68},{"duration":3,"tweenEasing":0,"x":-8.89,"y":-0.87},{"duration":12,"tweenEasing":0,"x":6.95,"y":5.43},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":7.13,"y":4.46},{"duration":3,"tweenEasing":0,"x":10.32,"y":7.06},{"duration":15,"tweenEasing":0,"x":-22.31,"y":-2.2},{"duration":3,"tweenEasing":0,"x":-20.91,"y":-5.68},{"duration":3,"tweenEasing":0,"x":-8.89,"y":-0.87},{"duration":12,"tweenEasing":0,"x":6.95,"y":5.43},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-41.75},{"duration":3,"tweenEasing":0,"rotate":-5.66},{"duration":15,"tweenEasing":0,"rotate":-45.17},{"duration":3,"tweenEasing":0,"rotate":-39.69},{"duration":3,"tweenEasing":0,"rotate":-53.59},{"duration":12,"tweenEasing":0,"rotate":-18.74},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-41.75},{"duration":3,"tweenEasing":0,"rotate":-5.66},{"duration":15,"tweenEasing":0,"rotate":-45.17},{"duration":3,"tweenEasing":0,"rotate":-39.69},{"duration":3,"tweenEasing":0,"rotate":-53.59},{"duration":12,"tweenEasing":0,"rotate":-18.74},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-41.75},{"duration":3,"tweenEasing":0,"rotate":-5.66},{"duration":15,"tweenEasing":0,"rotate":-45.17},{"duration":3,"tweenEasing":0,"rotate":-39.69},{"duration":3,"tweenEasing":0,"rotate":-53.59},{"duration":12,"tweenEasing":0,"rotate":-18.74},{"duration":0}]},{"name":"body","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.89,"y":3.28},{"duration":3,"tweenEasing":0,"x":0.05,"y":2.17},{"duration":9,"tweenEasing":0,"x":-2.88,"y":-1.42},{"duration":6,"tweenEasing":0,"x":-3.36,"y":-0.99},{"duration":3,"tweenEasing":0,"x":-3.68,"y":-0.7},{"duration":3,"tweenEasing":0,"x":-1.23,"y":-0.74},{"duration":12,"tweenEasing":0,"x":0.1,"y":2.23},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.89,"y":3.28},{"duration":3,"tweenEasing":0,"x":0.05,"y":2.17},{"duration":9,"tweenEasing":0,"x":-2.88,"y":-1.42},{"duration":6,"tweenEasing":0,"x":-3.36,"y":-0.99},{"duration":3,"tweenEasing":0,"x":-3.68,"y":-0.7},{"duration":3,"tweenEasing":0,"x":-1.23,"y":-0.74},{"duration":12,"tweenEasing":0,"x":0.1,"y":2.23},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.89,"y":3.28},{"duration":3,"tweenEasing":0,"x":0.05,"y":2.17},{"duration":9,"tweenEasing":0,"x":-2.88,"y":-1.42},{"duration":6,"tweenEasing":0,"x":-3.36,"y":-0.99},{"duration":3,"tweenEasing":0,"x":-3.68,"y":-0.7},{"duration":3,"tweenEasing":0,"x":-1.23,"y":-0.74},{"duration":12,"tweenEasing":0,"x":0.1,"y":2.23},{"duration":0}],"rotateFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":18.08},{"duration":3,"tweenEasing":0,"rotate":32.5},{"duration":9,"tweenEasing":0,"rotate":-28.34},{"duration":6,"tweenEasing":0,"rotate":-25.65},{"duration":3,"tweenEasing":0,"rotate":-23.86},{"duration":3,"tweenEasing":0,"rotate":-17.88},{"duration":12,"tweenEasing":0,"rotate":17.51},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":18.08},{"duration":3,"tweenEasing":0,"rotate":32.5},{"duration":9,"tweenEasing":0,"rotate":-28.34},{"duration":6,"tweenEasing":0,"rotate":-25.65},{"duration":3,"tweenEasing":0,"rotate":-23.86},{"duration":3,"tweenEasing":0,"rotate":-17.88},{"duration":12,"tweenEasing":0,"rotate":17.51},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":18.08},{"duration":3,"tweenEasing":0,"rotate":32.5},{"duration":9,"tweenEasing":0,"rotate":-28.34},{"duration":6,"tweenEasing":0,"rotate":-25.65},{"duration":3,"tweenEasing":0,"rotate":-23.86},{"duration":3,"tweenEasing":0,"rotate":-17.88},{"duration":12,"tweenEasing":0,"rotate":17.51},{"duration":0}],"scaleFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.01,"y":1.06},{"duration":3,"tweenEasing":0,"x":1.02,"y":1.09},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.02,"y":1.02},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.01,"y":1.06},{"duration":3,"tweenEasing":0,"x":1.02,"y":1.09},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.02,"y":1.02},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.01,"y":1.06},{"duration":3,"tweenEasing":0,"x":1.02,"y":1.09},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.02,"y":1.02},{"duration":0}]},{"name":"leg","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"y":0.48},{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"y":-0.64},{"duration":3,"tweenEasing":0,"y":-0.64},{"duration":27,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"y":0.48},{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"y":-0.64},{"duration":3,"tweenEasing":0,"y":-0.64},{"duration":27,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"y":0.48},{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"y":-0.64},{"duration":3,"tweenEasing":0,"y":-0.64},{"duration":15}],"scaleFrame":[{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.9,"y":1.2},{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":1.2},{"duration":3,"tweenEasing":0,"x":1.2},{"duration":27,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.9,"y":1.2},{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":1.2},{"duration":3,"tweenEasing":0,"x":1.2},{"duration":27,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.9,"y":1.2},{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":1.2},{"duration":3,"tweenEasing":0,"x":1.2},{"duration":15}]},{"name":"rightHand","translateFrame":[{"duration":15,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-1.53,"y":-0.76},{"duration":3,"tweenEasing":0,"x":-2.61,"y":-1.24},{"duration":18,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":12,"tweenEasing":0,"x":-2.41,"y":-0.33},{"duration":6,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":15,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-1.53,"y":-0.76},{"duration":3,"tweenEasing":0,"x":-2.61,"y":-1.24},{"duration":18,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":12,"tweenEasing":0,"x":-2.41,"y":-0.33},{"duration":6,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":15,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-1.53,"y":-0.76},{"duration":3,"tweenEasing":0,"x":-2.61,"y":-1.24},{"duration":18,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":12,"tweenEasing":0,"x":-2.41,"y":-0.33},{"duration":0,"x":-1.95,"y":-1.15}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":11.7},{"duration":3,"tweenEasing":0,"rotate":-31.82},{"duration":3,"tweenEasing":0,"rotate":-28.66},{"duration":15,"tweenEasing":0,"rotate":-40.03},{"duration":3,"tweenEasing":0,"rotate":-30.35},{"duration":3,"tweenEasing":0,"rotate":-57.07},{"duration":12,"tweenEasing":0,"rotate":-0.66},{"duration":6,"tweenEasing":0,"rotate":11.7},{"duration":15,"tweenEasing":0,"rotate":11.7},{"duration":3,"tweenEasing":0,"rotate":-31.82},{"duration":3,"tweenEasing":0,"rotate":-28.66},{"duration":15,"tweenEasing":0,"rotate":-40.03},{"duration":3,"tweenEasing":0,"rotate":-40.03},{"duration":3,"tweenEasing":0,"rotate":-57.07},{"duration":12,"tweenEasing":0,"rotate":-0.66},{"duration":6,"tweenEasing":0,"rotate":11.7},{"duration":15,"tweenEasing":0,"rotate":11.7},{"duration":3,"tweenEasing":0,"rotate":-31.82},{"duration":3,"tweenEasing":0,"rotate":-28.66},{"duration":15,"tweenEasing":0,"rotate":-40.03},{"duration":3,"tweenEasing":0,"rotate":-40.03},{"duration":3,"tweenEasing":0,"rotate":-57.07},{"duration":12,"tweenEasing":0,"rotate":-0.66},{"duration":0,"rotate":11.7}]},{"name":"rightFrontArm","translateFrame":[{"duration":15,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":3,"tweenEasing":0,"x":-1.2,"y":-0.16},{"duration":3,"tweenEasing":0,"x":3.12,"y":-3.07},{"duration":15,"tweenEasing":0,"x":-1.09,"y":1.77},{"duration":3,"tweenEasing":0,"x":0.54,"y":1.17},{"duration":3,"tweenEasing":0,"x":0.54,"y":1.17},{"duration":12,"tweenEasing":0,"x":1.24,"y":-3.23},{"duration":6,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":15,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":3,"tweenEasing":0,"x":-1.2,"y":-0.16},{"duration":3,"tweenEasing":0,"x":3.12,"y":-3.07},{"duration":15,"tweenEasing":0,"x":-1.09,"y":1.77},{"duration":3,"tweenEasing":0,"x":-1.09,"y":1.77},{"duration":3,"tweenEasing":0,"x":0.54,"y":1.17},{"duration":12,"tweenEasing":0,"x":1.24,"y":-3.23},{"duration":6,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":15,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":3,"tweenEasing":0,"x":-1.2,"y":-0.16},{"duration":3,"tweenEasing":0,"x":3.12,"y":-3.07},{"duration":15,"tweenEasing":0,"x":-1.09,"y":1.77},{"duration":3,"tweenEasing":0,"x":-1.09,"y":1.77},{"duration":3,"tweenEasing":0,"x":0.54,"y":1.17},{"duration":12,"tweenEasing":0,"x":1.24,"y":-3.23},{"duration":0,"x":-0.3,"y":-0.01}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":21.7},{"duration":3,"tweenEasing":0,"rotate":-53.33},{"duration":3,"tweenEasing":0,"rotate":-61.03},{"duration":15,"tweenEasing":0,"rotate":-60.6},{"duration":3,"tweenEasing":0,"rotate":-42.6},{"duration":3,"tweenEasing":0,"rotate":-28.53},{"duration":12,"tweenEasing":0,"rotate":-48.05},{"duration":6,"tweenEasing":0,"rotate":21.7},{"duration":15,"tweenEasing":0,"rotate":21.7},{"duration":3,"tweenEasing":0,"rotate":-53.33},{"duration":3,"tweenEasing":0,"rotate":-61.03},{"duration":15,"tweenEasing":0,"rotate":-60.6},{"duration":3,"tweenEasing":0,"rotate":-55.76},{"duration":3,"tweenEasing":0,"rotate":-28.53},{"duration":12,"tweenEasing":0,"rotate":-48.05},{"duration":6,"tweenEasing":0,"rotate":21.7},{"duration":15,"tweenEasing":0,"rotate":21.7},{"duration":3,"tweenEasing":0,"rotate":-53.33},{"duration":3,"tweenEasing":0,"rotate":-61.03},{"duration":15,"tweenEasing":0,"rotate":-60.6},{"duration":3,"tweenEasing":0,"rotate":-55.76},{"duration":3,"tweenEasing":0,"rotate":-28.53},{"duration":12,"tweenEasing":0,"rotate":-48.05},{"duration":0,"rotate":21.7}],"scaleFrame":[{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.07,"y":1.07},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.06,"y":1.06},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.07,"y":1.07},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.06,"y":1.06},{"duration":6,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.07,"y":1.07},{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.06,"y":1.06},{"duration":0}]},{"name":"rightArm","translateFrame":[{"duration":15,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":3,"tweenEasing":0,"x":7.03,"y":0.57},{"duration":3,"tweenEasing":0,"x":8.46,"y":4.38},{"duration":15,"tweenEasing":0,"x":-9.94,"y":-5.59},{"duration":3,"tweenEasing":0,"x":-10.56,"y":-6.78},{"duration":3,"tweenEasing":0,"x":-7.33,"y":-0.7},{"duration":12,"tweenEasing":0,"x":4.31,"y":3.25},{"duration":6,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":15,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":3,"tweenEasing":0,"x":7.03,"y":0.57},{"duration":3,"tweenEasing":0,"x":8.46,"y":4.38},{"duration":15,"tweenEasing":0,"x":-9.94,"y":-5.59},{"duration":3,"tweenEasing":0,"x":-10.56,"y":-6.78},{"duration":3,"tweenEasing":0,"x":-7.33,"y":-0.7},{"duration":12,"tweenEasing":0,"x":4.31,"y":3.25},{"duration":6,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":15,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":3,"tweenEasing":0,"x":7.03,"y":0.57},{"duration":3,"tweenEasing":0,"x":8.46,"y":4.38},{"duration":15,"tweenEasing":0,"x":-9.94,"y":-5.59},{"duration":3,"tweenEasing":0,"x":-10.56,"y":-6.78},{"duration":3,"tweenEasing":0,"x":-7.33,"y":-0.7},{"duration":12,"tweenEasing":0,"x":4.31,"y":3.25},{"duration":0,"x":1.76,"y":2.48}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":-6.67},{"duration":3,"tweenEasing":0,"rotate":108.8},{"duration":3,"tweenEasing":0,"rotate":68.96},{"duration":15,"tweenEasing":0,"rotate":-61.71},{"duration":3,"tweenEasing":0,"rotate":-119.79},{"duration":3,"tweenEasing":0,"rotate":-76.68},{"duration":12,"tweenEasing":0,"rotate":31.95},{"duration":6,"tweenEasing":0,"rotate":-6.67},{"duration":15,"tweenEasing":0,"rotate":-6.67},{"duration":3,"tweenEasing":0,"rotate":108.8},{"duration":3,"tweenEasing":0,"rotate":68.96},{"duration":15,"tweenEasing":0,"rotate":-61.71},{"duration":3,"tweenEasing":0,"rotate":-119.79},{"duration":3,"tweenEasing":0,"rotate":-76.68},{"duration":12,"tweenEasing":0,"rotate":31.95},{"duration":6,"tweenEasing":0,"rotate":-6.67},{"duration":15,"tweenEasing":0,"rotate":-6.67},{"duration":3,"tweenEasing":0,"rotate":108.8},{"duration":3,"tweenEasing":0,"rotate":68.96},{"duration":15,"tweenEasing":0,"rotate":-61.71},{"duration":3,"tweenEasing":0,"rotate":-119.79},{"duration":3,"tweenEasing":0,"rotate":-76.68},{"duration":12,"tweenEasing":0,"rotate":31.95},{"duration":0,"rotate":-6.67}],"scaleFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":1.1,"y":-1.1},{"duration":3,"tweenEasing":0,"x":1.2,"y":-1.1},{"duration":3,"tweenEasing":0,"y":-1},{"duration":36,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":1.1,"y":-1.1},{"duration":3,"tweenEasing":0,"x":1.2,"y":-1.1},{"duration":3,"tweenEasing":0,"y":-1},{"duration":36,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":1.1,"y":-1.1},{"duration":3,"tweenEasing":0,"x":1.2,"y":-1.1},{"duration":3,"tweenEasing":0,"y":-1},{"duration":12}]}],"slot":[{"name":"effect5","displayFrame":[{"duration":18,"value":-1},{"duration":156},{"duration":0,"value":-1}],"colorFrame":[{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":24,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":24,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":3,"value":{"aM":0}}]},{"name":"effect4","displayFrame":[{"duration":12,"value":-1},{"duration":159},{"duration":3,"value":-1}],"colorFrame":[{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":6,"value":{"aM":0}}]},{"name":"effect3","displayFrame":[{"duration":9,"value":-1},{"duration":162},{"duration":3,"value":-1}],"colorFrame":[{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":6,"value":{"aM":0}}]},{"name":"effect2","displayFrame":[{"duration":6,"value":-1},{"duration":162},{"duration":6,"value":-1}],"colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"rightHand","displayFrame":[{"duration":21},{"duration":18,"value":-1},{"duration":42},{"duration":18,"value":-1},{"duration":42},{"duration":18,"value":-1},{"duration":15}],"colorFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":42,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":39,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":15}]},{"name":"rightFrontArm","displayFrame":[{"duration":21},{"duration":18,"value":-1},{"duration":42},{"duration":18,"value":-1},{"duration":42},{"duration":18,"value":-1},{"duration":15}],"colorFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":42,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":39,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":15}]},{"name":"backLight","displayFrame":[{"duration":174,"value":-1}]},{"name":"effect6","displayFrame":[{"duration":174,"value":-1}]}]},{"duration":60,"name":"Atk1","bone":[{"name":"effect4","translateFrame":[{"duration":12,"tweenEasing":0,"x":-18.2,"y":13.4},{"duration":12,"tweenEasing":0,"x":-18.2,"y":13.4},{"duration":15,"tweenEasing":0,"x":-35.6,"y":3.6},{"duration":12,"tweenEasing":0,"x":-48,"y":0.8},{"duration":9,"x":-61.2}],"rotateFrame":[{"duration":12,"tweenEasing":0,"rotate":-105.08},{"duration":12,"tweenEasing":0,"rotate":-105.08},{"duration":15,"tweenEasing":0,"rotate":-96.73},{"duration":12,"tweenEasing":0,"rotate":-69.9},{"duration":9,"rotate":-94.04}]},{"name":"effect3","translateFrame":[{"duration":6,"tweenEasing":0,"x":-29.33,"y":21.33},{"duration":9,"tweenEasing":0,"x":-29.33,"y":21.33},{"duration":15,"tweenEasing":0,"x":-46.13,"y":12},{"duration":15,"tweenEasing":0,"x":-53.87,"y":18.93},{"duration":15,"x":-62.13,"y":14.67}],"rotateFrame":[{"duration":15,"tweenEasing":0,"rotate":-108.91},{"duration":15,"tweenEasing":0,"rotate":-108.91},{"duration":15,"tweenEasing":0,"rotate":-127.09},{"duration":15,"rotate":-108.09}]},{"name":"effect2","translateFrame":[{"duration":6,"tweenEasing":0,"x":-9.07,"y":26.4},{"duration":12,"tweenEasing":0,"x":-9.07,"y":26.4},{"duration":15,"tweenEasing":0,"x":-27.2,"y":5.6},{"duration":9,"tweenEasing":0,"x":-46.93,"y":-8.53},{"duration":18,"x":-54.93,"y":-10.93}],"rotateFrame":[{"duration":6,"tweenEasing":0,"rotate":31.2},{"duration":12,"tweenEasing":0,"rotate":31.2},{"duration":15,"tweenEasing":0,"rotate":-0.05},{"duration":9,"tweenEasing":0,"rotate":-26.91},{"duration":18,"rotate":-24.71}]},{"name":"leftHand","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":0.03,"y":0.14},{"duration":15,"tweenEasing":0,"x":0.03,"y":0.14},{"duration":12,"tweenEasing":0,"x":0.21,"y":0.98},{"duration":0}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-12.3},{"duration":12,"tweenEasing":0,"rotate":18.53},{"duration":15,"tweenEasing":0,"rotate":-9},{"duration":12,"tweenEasing":0,"rotate":9.5},{"duration":0}]},{"name":"leftFrontArm","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.43,"y":0.09},{"duration":12,"tweenEasing":0,"x":0.37,"y":0.24},{"duration":15,"tweenEasing":0,"x":1.38,"y":-1.56},{"duration":12,"tweenEasing":0,"x":0.39,"y":0.48},{"duration":0}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":13.83},{"duration":12,"tweenEasing":0,"rotate":25.06},{"duration":15,"tweenEasing":0,"rotate":17.69},{"duration":12,"tweenEasing":0,"rotate":12.39},{"duration":0}]},{"name":"leftShoulder","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-5.77,"y":-1.21},{"duration":12,"tweenEasing":0,"x":16.81,"y":-1.49},{"duration":15,"tweenEasing":0,"x":16.01,"y":-1.17},{"duration":12,"tweenEasing":0,"x":2.27,"y":-0.45},{"duration":0}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":40},{"duration":12,"tweenEasing":0,"rotate":-12.39},{"duration":15,"tweenEasing":0,"rotate":4.99},{"duration":12,"tweenEasing":0,"rotate":8.69},{"duration":0}]},{"name":"leftArm","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-6.85,"y":-3.89},{"duration":12,"tweenEasing":0,"x":25.9,"y":0.2},{"duration":15,"tweenEasing":0,"x":24.94,"y":0.84},{"duration":12,"tweenEasing":0,"x":2.99,"y":-4.37},{"duration":0}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":66.79},{"duration":12,"tweenEasing":0,"rotate":-95.1},{"duration":15,"tweenEasing":0,"rotate":-98.37},{"duration":12,"tweenEasing":0,"rotate":-44.89},{"duration":0}]},{"name":"head","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-8.35,"y":0.91},{"duration":12,"tweenEasing":0,"x":18.7,"y":3.66},{"duration":15,"tweenEasing":0,"x":17.58,"y":4.46},{"duration":12,"tweenEasing":0,"x":2.45,"y":1.81},{"duration":0}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":15.73},{"duration":12,"tweenEasing":0,"rotate":2.95},{"duration":15,"tweenEasing":0,"rotate":2.83},{"duration":12,"tweenEasing":0,"rotate":0.01},{"duration":0}]},{"name":"rightShoulder","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-7.25,"y":-1.47},{"duration":12,"tweenEasing":0,"x":12.57,"y":4.07},{"duration":15,"tweenEasing":0,"x":12.25,"y":4.55},{"duration":12,"tweenEasing":0,"x":0.8,"y":0.69},{"duration":0}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-11.02},{"duration":12,"tweenEasing":0,"rotate":-27.15},{"duration":15,"tweenEasing":0,"rotate":-15.36},{"duration":12,"tweenEasing":0,"rotate":3.41},{"duration":0}]},{"name":"body","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-2.93,"y":-2.03},{"duration":12,"tweenEasing":0,"x":2.55,"y":-0.18},{"duration":15,"tweenEasing":0,"x":2.87,"y":0.46},{"duration":12,"tweenEasing":0,"y":0.8},{"duration":0}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-11.15},{"duration":12,"tweenEasing":0,"rotate":29.43},{"duration":15,"tweenEasing":0,"rotate":30.7},{"duration":12,"tweenEasing":0,"rotate":1.09},{"duration":0}],"scaleFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.01,"y":1.01},{"duration":12,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":1.03,"y":1.03},{"duration":0}]},{"name":"leg","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":24,"tweenEasing":0,"y":-0.05},{"duration":6,"tweenEasing":0,"y":-0.05},{"duration":6,"tweenEasing":0,"y":-0.32},{"duration":3,"tweenEasing":0,"y":-0.32},{"duration":0}],"scaleFrame":[{"duration":12,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.1,"y":1.3},{"duration":6,"tweenEasing":0,"x":1.01,"y":1.1},{"duration":6,"tweenEasing":0,"x":1.01,"y":1.1},{"duration":12,"tweenEasing":0,"x":1.01,"y":0.9},{"duration":6,"tweenEasing":0,"x":1.01,"y":0.9},{"duration":6,"tweenEasing":0,"x":1.1,"y":1.1},{"duration":3,"tweenEasing":0,"x":1.1,"y":1.1},{"duration":0}]},{"name":"rightHand","translateFrame":[{"duration":18,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-2.1,"y":-0.4},{"duration":12,"tweenEasing":0,"x":-1.95,"y":-0.39},{"duration":15,"tweenEasing":0,"x":-1.95,"y":-0.39},{"duration":12,"tweenEasing":0,"x":-1.08,"y":-0.33},{"duration":0,"x":-1.95,"y":-1.15}],"rotateFrame":[{"duration":18,"tweenEasing":0,"rotate":11.7},{"duration":3,"tweenEasing":0,"rotate":-34.26},{"duration":12,"tweenEasing":0,"rotate":-8.09},{"duration":15,"tweenEasing":0,"rotate":-36.51},{"duration":12,"tweenEasing":0,"rotate":-12.04},{"duration":0,"rotate":11.7}]},{"name":"rightFrontArm","translateFrame":[{"duration":18,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":3,"tweenEasing":0,"x":-1.4,"y":0.36},{"duration":12,"tweenEasing":0,"x":-0.68,"y":0.24},{"duration":15,"tweenEasing":0,"x":-0.88,"y":0.14},{"duration":12,"tweenEasing":0,"x":0.62,"y":0.51},{"duration":0,"x":-0.3,"y":-0.01}],"rotateFrame":[{"duration":18,"tweenEasing":0,"rotate":21.7},{"duration":3,"tweenEasing":0,"rotate":-36.51},{"duration":12,"tweenEasing":0,"rotate":-41.51},{"duration":15,"tweenEasing":0,"rotate":-50.9},{"duration":12,"tweenEasing":0,"rotate":-42.18},{"duration":0,"rotate":21.7}]},{"name":"rightArm","translateFrame":[{"duration":18,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":3,"tweenEasing":0,"x":-5.92,"y":-0.64},{"duration":12,"tweenEasing":0,"x":2.79,"y":7.74},{"duration":15,"tweenEasing":0,"x":2.95,"y":8.38},{"duration":12,"tweenEasing":0,"x":-7.65,"y":-6.15},{"duration":0,"x":1.76,"y":2.48}],"rotateFrame":[{"duration":18,"tweenEasing":0,"rotate":-6.67},{"duration":3,"tweenEasing":0,"rotate":8.81},{"duration":12,"tweenEasing":0,"rotate":7.26},{"duration":15,"tweenEasing":0,"rotate":15.7},{"duration":12,"tweenEasing":0,"rotate":25.83},{"duration":0,"rotate":-6.67}]}],"slot":[{"name":"effect4","displayFrame":[{"duration":12,"value":-1},{"duration":42},{"duration":6,"value":-1}],"colorFrame":[{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"effect3","displayFrame":[{"duration":6,"value":-1},{"duration":42},{"duration":12,"value":-1}],"colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":15,"value":{"aM":0}}]},{"name":"effect2","displayFrame":[{"duration":6,"value":-1},{"duration":39},{"duration":15,"value":-1}],"colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":18,"value":{"aM":0}}]},{"name":"backLight","displayFrame":[{"duration":60,"value":-1}]},{"name":"effect5","displayFrame":[{"duration":60,"value":-1}]},{"name":"effect6","displayFrame":[{"duration":60,"value":-1}]}]},{"duration":18,"name":"Atked1","bone":[{"name":"effect6","translateFrame":[{"duration":6,"tweenEasing":0,"x":-5.03,"y":3.43},{"duration":3,"tweenEasing":0,"x":-1.32,"y":-0.45},{"duration":6,"tweenEasing":0,"x":6.49,"y":-2.74},{"duration":3,"x":9.6,"y":-12.57}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"rotate":-20.99}]},{"name":"effect4","translateFrame":[{"duration":3,"tweenEasing":0,"x":-9,"y":7.6},{"duration":3,"tweenEasing":0,"x":-9,"y":7.6},{"duration":3,"tweenEasing":0,"x":-20.26,"y":-2.26},{"duration":9,"tweenEasing":0,"x":-23.68,"y":-12.6},{"duration":0,"x":-48,"y":-32.6}],"rotateFrame":[{"duration":3,"tweenEasing":0,"rotate":-9.48},{"duration":3,"tweenEasing":0,"rotate":-9.48},{"duration":3,"tweenEasing":0,"rotate":-12.21},{"duration":9,"rotate":-14.93}]},{"name":"effect3","translateFrame":[{"duration":6,"tweenEasing":0,"x":-7.36,"y":10.88},{"duration":3,"tweenEasing":0,"x":-1.52,"y":-14.48},{"duration":6,"tweenEasing":0,"x":3.68,"y":-18.72},{"duration":3,"x":13.12,"y":-27.2}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-20.49},{"duration":6,"tweenEasing":0,"rotate":-21.44},{"duration":3,"rotate":-23.34}]},{"name":"effect2","translateFrame":[{"duration":6,"tweenEasing":0,"x":5.44,"y":1.92},{"duration":3,"tweenEasing":0,"x":-12.08,"y":-14.48},{"duration":9,"tweenEasing":0,"x":-13.46,"y":-17.74},{"duration":0,"x":-18.88,"y":-27.52}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":55.47},{"duration":9,"tweenEasing":0,"rotate":51.89},{"duration":0,"rotate":41.14}]},{"name":"leftHand","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":0.01,"y":-0.45},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-26.56},{"duration":9,"tweenEasing":0,"rotate":-11.41},{"duration":0}]},{"name":"leftFrontArm","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":0.37,"y":0.2},{"duration":9,"tweenEasing":0,"x":0.37,"y":0.2},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":6.05},{"duration":9,"tweenEasing":0,"rotate":-2.27},{"duration":0}]},{"name":"leftShoulder","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-6.31,"y":4.6},{"duration":9,"tweenEasing":0,"x":-7.03,"y":3.4},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":22.93},{"duration":9,"tweenEasing":0,"rotate":-13.8},{"duration":0}]},{"name":"leftArm","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-6.32,"y":2.11},{"duration":9,"tweenEasing":0,"x":-4.59,"y":0.88},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-15.21},{"duration":9,"tweenEasing":0,"rotate":-28.28},{"duration":0}]},{"name":"head","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-5.95,"y":5.81},{"duration":9,"tweenEasing":0,"x":-4.61,"y":1.44},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":20.08},{"duration":9,"tweenEasing":0,"rotate":-25.26},{"duration":0}]},{"name":"rightShoulder","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-6.05,"y":0.53},{"duration":9,"tweenEasing":0,"x":-5.11,"y":-0.59},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-17.61},{"duration":9,"tweenEasing":0,"rotate":-22.45},{"duration":0}]},{"name":"body","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-4.19,"y":2.37},{"duration":9,"tweenEasing":0,"x":0.8,"y":1.76},{"duration":0}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":-5.23},{"duration":9,"tweenEasing":0,"rotate":-13.28},{"duration":0}],"scaleFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":1.01,"y":1.01},{"duration":9,"tweenEasing":0,"x":1.01,"y":1.01},{"duration":0}]},{"name":"leg","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-3.28,"y":0.24},{"duration":9,"tweenEasing":0,"x":0.64,"y":-0.08},{"duration":0}]},{"name":"rightHand","translateFrame":[{"duration":6,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":3,"tweenEasing":0,"x":-2.1,"y":-0.4},{"duration":9,"tweenEasing":0,"x":-2.1,"y":-0.4},{"duration":0,"x":-1.95,"y":-1.15}],"rotateFrame":[{"duration":6,"tweenEasing":0,"rotate":11.7},{"duration":3,"tweenEasing":0,"rotate":13.63},{"duration":9,"tweenEasing":0,"rotate":6.92},{"duration":0,"rotate":11.7}]},{"name":"rightFrontArm","translateFrame":[{"duration":6,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":3,"tweenEasing":0,"x":0.44,"y":-0.72},{"duration":9,"tweenEasing":0,"x":-0.89,"y":0.2},{"duration":0,"x":-0.3,"y":-0.01}],"rotateFrame":[{"duration":6,"tweenEasing":0,"rotate":21.7},{"duration":3,"tweenEasing":0,"rotate":-6.33},{"duration":9,"tweenEasing":0,"rotate":14.55},{"duration":0,"rotate":21.7}]},{"name":"rightArm","translateFrame":[{"duration":6,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":3,"tweenEasing":0,"x":-4.96,"y":5.17},{"duration":9,"tweenEasing":0,"x":-3.87,"y":1.92},{"duration":0,"x":1.76,"y":2.48}],"rotateFrame":[{"duration":6,"tweenEasing":0,"rotate":-6.67},{"duration":3,"tweenEasing":0,"rotate":-17.02},{"duration":9,"tweenEasing":0,"rotate":-28.28},{"duration":0,"rotate":-6.67}]}],"slot":[{"name":"effect6","colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":66}},{"duration":6,"tweenEasing":0},{"duration":3,"tweenEasing":0},{"duration":0,"value":{"aM":0}}]},{"name":"effect4","colorFrame":[{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":49}},{"duration":9,"tweenEasing":0},{"duration":0,"value":{"aM":0}}]},{"name":"effect3","colorFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":3,"value":{"aM":0}}]},{"name":"effect2","colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":0,"value":{"aM":0}}]},{"name":"backLight","displayFrame":[{"duration":18,"value":-1}]},{"name":"effect5","displayFrame":[{"duration":18,"value":-1}]}]},{"duration":78,"name":"Dying","bone":[{"name":"effect5","translateFrame":[{"duration":24,"tweenEasing":0,"x":14.4,"y":3.43},{"duration":18,"tweenEasing":0,"x":14.4,"y":3.43},{"duration":15,"tweenEasing":0,"x":6.4,"y":-10.29},{"duration":15,"tweenEasing":0,"x":8.46,"y":-23.09},{"duration":6,"x":1.14,"y":-32.46}],"rotateFrame":[{"duration":42,"tweenEasing":0,"rotate":30.08},{"duration":15,"tweenEasing":0,"rotate":30.08},{"duration":15,"tweenEasing":0,"rotate":46.89},{"duration":6,"rotate":26.37}]},{"name":"effect4","translateFrame":[{"duration":18,"tweenEasing":0,"x":-3.2,"y":1.6},{"duration":15,"tweenEasing":0,"x":-3.2,"y":1.6},{"duration":18,"tweenEasing":0,"x":0.23,"y":-24.23},{"duration":18,"tweenEasing":0,"x":-8.69,"y":-39.54},{"duration":9,"x":-11.61,"y":-48.32}],"rotateFrame":[{"duration":18,"tweenEasing":0,"rotate":20.94},{"duration":15,"tweenEasing":0,"rotate":20.94},{"duration":18,"tweenEasing":0,"rotate":-3.4},{"duration":18,"tweenEasing":0,"rotate":-10.49},{"duration":9,"rotate":-4.63}]},{"name":"effect3","translateFrame":[{"duration":27,"tweenEasing":0,"x":-6.13,"y":22.4},{"duration":12,"tweenEasing":0,"x":-6.13,"y":22.4},{"duration":18,"tweenEasing":0,"x":-2.76,"y":-4.89},{"duration":12,"tweenEasing":0,"x":8.89,"y":-19.64},{"duration":9,"x":22.49,"y":-23.38}],"rotateFrame":[{"duration":27,"tweenEasing":0,"rotate":31.61},{"duration":12,"tweenEasing":0,"rotate":31.61},{"duration":18,"tweenEasing":0,"rotate":-12.51},{"duration":12,"tweenEasing":0,"rotate":-13.38},{"duration":9,"rotate":9.35}]},{"name":"effect2","translateFrame":[{"duration":21,"tweenEasing":0,"x":4,"y":6.13},{"duration":9,"tweenEasing":0,"x":4,"y":6.13},{"duration":9,"tweenEasing":0,"x":1.07,"y":-7.73},{"duration":15,"tweenEasing":0,"x":-13.07,"y":-20.27},{"duration":24,"x":-40.53,"y":-29.6}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":29.59},{"duration":15,"tweenEasing":0,"rotate":2.18},{"duration":24,"rotate":-22.33}]},{"name":"leftHand","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":0.1,"y":0.47},{"duration":6,"tweenEasing":0,"x":0.1,"y":0.47},{"duration":9,"tweenEasing":0,"x":0.3,"y":-0.43},{"duration":3,"tweenEasing":0,"x":0.3,"y":-0.43},{"duration":42,"x":-0.66,"y":-0.09}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":-7.81},{"duration":3,"tweenEasing":0,"rotate":3.01},{"duration":6,"tweenEasing":0,"rotate":3.01},{"duration":9,"tweenEasing":0,"rotate":-18.54},{"duration":3,"tweenEasing":0,"rotate":-18.54},{"duration":24,"tweenEasing":0,"rotate":6.38},{"duration":6,"tweenEasing":0,"rotate":6.38},{"duration":12,"rotate":11.01}]},{"name":"leftFrontArm","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":1.36,"y":-1.9},{"duration":6,"tweenEasing":0,"x":1.36,"y":-1.9},{"duration":9,"tweenEasing":0,"x":1.29,"y":-2.29},{"duration":3,"tweenEasing":0,"x":1.29,"y":-2.29},{"duration":15,"tweenEasing":0,"x":0.3,"y":0.3},{"duration":9,"tweenEasing":0,"x":-1.66,"y":1.87},{"duration":6,"tweenEasing":0,"x":1.28,"y":-7.25},{"duration":12,"x":0.98,"y":-8.17}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":-33.88},{"duration":3,"tweenEasing":0,"rotate":-26.38},{"duration":6,"tweenEasing":0,"rotate":-26.38},{"duration":9,"tweenEasing":0,"rotate":-47.87},{"duration":3,"tweenEasing":0,"rotate":-65.3},{"duration":15,"tweenEasing":0,"rotate":46.32},{"duration":9,"tweenEasing":0,"rotate":15},{"duration":6,"tweenEasing":0,"rotate":113.18},{"duration":12,"rotate":106.03}],"scaleFrame":[{"duration":9,"tweenEasing":0},{"duration":69,"x":1.05,"y":1.05}]},{"name":"leftShoulder","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":7.84,"y":0.44},{"duration":3,"tweenEasing":0,"x":7.31,"y":-0.39},{"duration":6,"tweenEasing":0,"x":7.31,"y":0.09},{"duration":9,"tweenEasing":0,"x":10.95,"y":1.85},{"duration":3,"tweenEasing":0,"x":10.69,"y":-1.88},{"duration":15,"tweenEasing":0,"x":-2.01,"y":-11.67},{"duration":9,"tweenEasing":0,"x":-9.21,"y":-16.87},{"duration":6,"tweenEasing":0,"x":-0.41,"y":38.01},{"duration":12,"tweenEasing":0,"x":-3.29,"y":34.33},{"duration":0,"x":-3.29,"y":37.53}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":13.57},{"duration":3,"tweenEasing":0,"rotate":24.2},{"duration":6,"tweenEasing":0,"rotate":16.88},{"duration":9,"tweenEasing":0,"rotate":10.9},{"duration":3,"tweenEasing":0,"rotate":16.99},{"duration":15,"tweenEasing":0,"rotate":-5.17},{"duration":9,"tweenEasing":0,"rotate":-12.82},{"duration":6,"tweenEasing":0,"rotate":-8.56},{"duration":12,"tweenEasing":0,"rotate":-2.65},{"duration":0,"rotate":-7.04}]},{"name":"leftArm","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":6.76,"y":-4.62},{"duration":3,"tweenEasing":0,"x":6.76,"y":-5.1},{"duration":6,"tweenEasing":0,"x":6.76,"y":-4.62},{"duration":9,"tweenEasing":0,"x":12.09,"y":-1.76},{"duration":3,"tweenEasing":0,"x":11.83,"y":-5.49},{"duration":15,"tweenEasing":0,"x":0.87,"y":-11.81},{"duration":9,"tweenEasing":0,"x":2.47,"y":-1.81},{"duration":6,"tweenEasing":0,"x":2.87,"y":28.27},{"duration":12,"tweenEasing":0,"x":1.27,"y":25.87},{"duration":0,"x":1.59,"y":27.47}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":0.58},{"duration":3,"tweenEasing":0,"rotate":4.94},{"duration":6,"tweenEasing":0,"rotate":4.94},{"duration":9,"tweenEasing":0,"rotate":10.19},{"duration":3,"tweenEasing":0,"rotate":25.77},{"duration":15,"tweenEasing":0,"rotate":-11.12},{"duration":9,"tweenEasing":0,"rotate":-2.99},{"duration":18,"rotate":-14.6}]},{"name":"head","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":8.19,"y":6.12},{"duration":3,"tweenEasing":0,"x":7.71,"y":5.8},{"duration":6,"tweenEasing":0,"x":7.71,"y":6.28},{"duration":9,"tweenEasing":0,"x":8.92,"y":10.46},{"duration":3,"tweenEasing":0,"x":9.58,"y":11.39},{"duration":15,"tweenEasing":0,"x":-2.71,"y":-14.39},{"duration":9,"tweenEasing":0,"x":-1.24,"y":-22.13},{"duration":6,"tweenEasing":0,"x":-2.2,"y":36.6},{"duration":12,"tweenEasing":0,"x":-5.08,"y":33.88},{"duration":0,"x":0.04,"y":42.84}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":29.23},{"duration":3,"tweenEasing":0,"rotate":8.49},{"duration":6,"tweenEasing":0,"rotate":13.15},{"duration":9,"tweenEasing":0,"rotate":15.69},{"duration":3,"tweenEasing":0,"rotate":15.69},{"duration":15,"tweenEasing":0,"rotate":-29.7},{"duration":9,"tweenEasing":0,"rotate":-25.43},{"duration":6,"tweenEasing":0,"rotate":-25.43},{"duration":12,"tweenEasing":0,"rotate":11.43},{"duration":0,"rotate":-13.96}]},{"name":"rightShoulder","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":6.06,"y":1.67},{"duration":3,"tweenEasing":0,"x":6.06,"y":1.19},{"duration":6,"tweenEasing":0,"x":6.06,"y":1.67},{"duration":9,"tweenEasing":0,"x":6.79,"y":3.11},{"duration":3,"tweenEasing":0,"x":6.52,"y":-1.69},{"duration":15,"tweenEasing":0,"x":-5.18,"y":-17.07},{"duration":9,"tweenEasing":0,"x":-0.38,"y":-13.87},{"duration":6,"tweenEasing":0,"x":-2.38,"y":32.61},{"duration":12,"tweenEasing":0,"x":-0.46,"y":33.73},{"duration":0,"x":-0.46,"y":38.53}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"rotate":-2.21},{"duration":3,"tweenEasing":0,"rotate":-17.5},{"duration":6,"tweenEasing":0,"rotate":-5.8},{"duration":9,"tweenEasing":0,"rotate":7.6},{"duration":3,"tweenEasing":0,"rotate":-0.59},{"duration":15,"tweenEasing":0,"rotate":-0.22},{"duration":9,"tweenEasing":0,"rotate":-16.47},{"duration":6,"tweenEasing":0,"rotate":20.03},{"duration":12,"rotate":10.97}]},{"name":"body","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":-0.18,"y":0.49},{"duration":3,"tweenEasing":0,"x":-0.34,"y":0.17},{"duration":6,"tweenEasing":0,"x":-0.34,"y":0.65},{"duration":9,"tweenEasing":0,"x":-0.18,"y":2.25},{"duration":3,"tweenEasing":0,"x":-0.44,"y":-1.48},{"duration":15,"tweenEasing":0,"x":2.36,"y":-14.52},{"duration":9,"tweenEasing":0,"x":3.29,"y":-8.39},{"duration":6,"tweenEasing":0,"x":9.96,"y":24.76},{"duration":12,"tweenEasing":0,"x":10.6,"y":19.16},{"duration":0,"x":10.92,"y":21.4}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":18.08},{"duration":6,"tweenEasing":0,"rotate":18.08},{"duration":9,"tweenEasing":0,"rotate":21.06},{"duration":3,"tweenEasing":0,"rotate":22.64},{"duration":15,"tweenEasing":0,"rotate":-10.59},{"duration":9,"tweenEasing":0,"rotate":-22.36},{"duration":6,"tweenEasing":0,"rotate":-49.93},{"duration":12,"tweenEasing":0,"rotate":-57.44},{"duration":0,"rotate":-66.41}],"scaleFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":1.01,"y":1.06},{"duration":3,"tweenEasing":0,"x":1.01,"y":0.96},{"duration":6,"tweenEasing":0,"x":1.01,"y":0.96},{"duration":9,"tweenEasing":0,"x":1.01,"y":1.06},{"duration":3,"tweenEasing":0,"x":1.01,"y":1.16},{"duration":15,"tweenEasing":0},{"duration":27,"y":0.9}]},{"name":"leg","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":-0.84},{"duration":9,"tweenEasing":0,"x":-0.84},{"duration":3,"tweenEasing":0,"x":-0.52,"y":-0.64},{"duration":15,"tweenEasing":0,"x":-0.52,"y":-3.84},{"duration":6,"tweenEasing":0,"x":-0.52,"y":-5.28},{"duration":21,"x":-0.52,"y":-3.52}],"scaleFrame":[{"duration":9,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.05,"y":1.25},{"duration":6,"tweenEasing":0,"x":0.95,"y":0.85},{"duration":9,"tweenEasing":0,"x":1.05,"y":1.05},{"duration":3,"tweenEasing":0,"x":1.25,"y":1.05},{"duration":15,"tweenEasing":0,"x":1.85,"y":1.05},{"duration":6,"tweenEasing":0,"x":2.15,"y":1.05},{"duration":21,"x":1.55,"y":1.05}]},{"name":"rightHand","translateFrame":[{"duration":9,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":9,"tweenEasing":0,"x":-1.53,"y":-0.76},{"duration":6,"tweenEasing":0,"x":-1.53,"y":-0.76},{"duration":27,"tweenEasing":0,"x":-2.24,"y":-1.59},{"duration":9,"tweenEasing":0,"x":-2.24,"y":-1.59},{"duration":18,"x":-1.03,"y":-1.63}],"rotateFrame":[{"duration":9,"tweenEasing":0,"rotate":11.7},{"duration":6,"tweenEasing":0,"rotate":23.26},{"duration":3,"tweenEasing":0,"rotate":-19.83},{"duration":6,"tweenEasing":0,"rotate":-19.83},{"duration":9,"tweenEasing":0,"rotate":23.75},{"duration":3,"tweenEasing":0,"rotate":20.82},{"duration":15,"tweenEasing":0,"rotate":-5.18},{"duration":9,"tweenEasing":0,"rotate":22.15},{"duration":6,"tweenEasing":0,"rotate":-22.3},{"duration":12,"tweenEasing":0,"rotate":-45.66},{"duration":0,"rotate":-37}]},{"name":"rightFrontArm","translateFrame":[{"duration":9,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":9,"tweenEasing":0,"x":-1.2,"y":-0.16},{"duration":6,"tweenEasing":0,"x":-1.2,"y":-0.16},{"duration":12,"tweenEasing":0,"x":-1.32,"y":-0.29},{"duration":15,"tweenEasing":0,"x":-1.32,"y":-0.29},{"duration":9,"tweenEasing":0,"x":-2.93,"y":-3.06},{"duration":6,"tweenEasing":0,"x":-6.42,"y":3.56},{"duration":12,"tweenEasing":0,"x":-5.56,"y":4.61},{"duration":0,"x":-7.53,"y":5.06}],"rotateFrame":[{"duration":9,"tweenEasing":0,"rotate":21.7},{"duration":6,"tweenEasing":0,"rotate":59.44},{"duration":3,"tweenEasing":0,"rotate":75.81},{"duration":6,"tweenEasing":0,"rotate":75.81},{"duration":9,"tweenEasing":0,"rotate":75.52},{"duration":3,"tweenEasing":0,"rotate":94.88},{"duration":15,"tweenEasing":0,"rotate":-2.28},{"duration":9,"tweenEasing":0,"rotate":12.05},{"duration":6,"tweenEasing":0,"rotate":12.5},{"duration":12,"tweenEasing":0,"rotate":17.33},{"duration":0,"rotate":11.94}],"scaleFrame":[{"duration":9,"tweenEasing":0},{"duration":69,"x":1.05,"y":1.05}]},{"name":"rightArm","translateFrame":[{"duration":9,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":6,"tweenEasing":0,"x":7.79,"y":1.43},{"duration":3,"tweenEasing":0,"x":6.83,"y":0.79},{"duration":6,"tweenEasing":0,"x":6.83,"y":1.27},{"duration":9,"tweenEasing":0,"x":6.51,"y":2.87},{"duration":3,"tweenEasing":0,"x":6.24,"y":-0.86},{"duration":15,"tweenEasing":0,"x":-1.89,"y":-11.77},{"duration":9,"tweenEasing":0,"x":0.11,"y":0.9},{"duration":6,"tweenEasing":0,"x":-4.52,"y":42.14},{"duration":12,"tweenEasing":0,"x":-6.12,"y":39.74},{"duration":0,"x":-5.8,"y":41.34}],"rotateFrame":[{"duration":9,"tweenEasing":0,"rotate":-6.67},{"duration":6,"tweenEasing":0,"rotate":2.1},{"duration":3,"tweenEasing":0,"rotate":1.1},{"duration":6,"tweenEasing":0,"rotate":1.1},{"duration":9,"tweenEasing":0,"rotate":-6.84},{"duration":3,"tweenEasing":0,"rotate":-18.94},{"duration":15,"tweenEasing":0,"rotate":15.53},{"duration":9,"tweenEasing":0,"rotate":-13.72},{"duration":18,"rotate":-52.69}]},{"name":"backLight","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":12,"tweenEasing":0,"y":-7.31},{"duration":9,"tweenEasing":0,"y":-12.8},{"duration":6,"tweenEasing":0,"y":-12.8},{"duration":27,"x":0.8,"y":-41.6}],"scaleFrame":[{"duration":15,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":12,"tweenEasing":0,"x":0.69,"y":0.5},{"duration":9,"tweenEasing":0,"x":1.56,"y":1.71},{"duration":6,"tweenEasing":0,"x":0.6,"y":2.57},{"duration":27,"x":0.11,"y":2.79}]}],"slot":[{"name":"effect5","colorFrame":[{"duration":24,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":6,"value":{"aM":0}}]},{"name":"effect4","colorFrame":[{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"effect3","colorFrame":[{"duration":27,"tweenEasing":0,"value":{"aM":0}},{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"effect2","colorFrame":[{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":9,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":24,"value":{"aM":0}}]},{"name":"leftArm","colorFrame":[{"duration":36,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":12}]},{"name":"head","displayFrame":[{"duration":78,"value":1}]},{"name":"rightArm","colorFrame":[{"duration":36,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":12}]},{"name":"backLight","colorFrame":[{"duration":12,"tweenEasing":0,"value":{"aM":0}},{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":30,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":27,"value":{"aM":0}}]},{"name":"effect6","displayFrame":[{"duration":78,"value":-1}]}]},{"duration":72,"playTimes":0,"name":"Atked2","bone":[{"name":"effect4","translateFrame":[{"duration":3,"tweenEasing":0,"x":-18.49,"y":6.76},{"duration":18,"tweenEasing":0,"x":-18.49,"y":6.76},{"duration":21,"tweenEasing":0,"x":-16,"y":-10.13},{"duration":21,"tweenEasing":0,"x":-24.71,"y":-24.36},{"duration":9,"x":-24.53,"y":-37.69}],"rotateFrame":[{"duration":3,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-28.4},{"duration":21,"tweenEasing":0,"rotate":-16.18},{"duration":9,"rotate":-31.27}]},{"name":"effect3","translateFrame":[{"duration":9,"tweenEasing":0,"x":-1.87,"y":10.67},{"duration":24,"tweenEasing":0,"x":-1.87,"y":10.67},{"duration":21,"tweenEasing":0,"x":3.25,"y":-16.21},{"duration":18,"tweenEasing":0,"x":0.69,"y":-29.17},{"duration":0,"x":1.17,"y":-34.61}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":24,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-39.38},{"duration":18,"rotate":-22.72}]},{"name":"effect2","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":24,"tweenEasing":0,"x":4,"y":-17},{"duration":24,"tweenEasing":0,"x":1,"y":-29.2},{"duration":3,"x":-0.2,"y":-39.8}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":29.43},{"duration":24,"tweenEasing":0,"rotate":65.43},{"duration":24,"tweenEasing":0,"rotate":44.46},{"duration":3,"rotate":60}]},{"name":"leftHand","rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":15.92},{"duration":24,"tweenEasing":0,"rotate":12.42},{"duration":24,"tweenEasing":0,"rotate":-2.24},{"duration":0,"rotate":15.92}]},{"name":"leftFrontArm","translateFrame":[{"duration":24,"tweenEasing":0},{"duration":24,"tweenEasing":0},{"duration":24,"tweenEasing":0,"x":-0.6,"y":0.39},{"duration":0}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":29.06},{"duration":24,"tweenEasing":0,"rotate":26.02},{"duration":24,"tweenEasing":0,"rotate":16.87},{"duration":0,"rotate":29.06}]},{"name":"leftShoulder","translateFrame":[{"duration":24,"tweenEasing":0,"x":4.11,"y":-1.6},{"duration":24,"tweenEasing":0,"x":5.47,"y":-1.28},{"duration":24,"tweenEasing":0,"x":6.08,"y":-1.98},{"duration":0,"x":4.11,"y":-1.6}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":-12.27},{"duration":24,"tweenEasing":0,"rotate":-15.89},{"duration":24,"tweenEasing":0,"rotate":-12.23},{"duration":0,"rotate":-12.27}]},{"name":"leftArm","translateFrame":[{"duration":24,"tweenEasing":0,"x":4.8,"y":0.91},{"duration":24,"tweenEasing":0,"x":4.8,"y":0.91},{"duration":24,"tweenEasing":0,"x":5.07,"y":1.29},{"duration":0,"x":4.8,"y":0.91}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":-23.09},{"duration":24,"tweenEasing":0,"rotate":-31.16},{"duration":24,"tweenEasing":0,"rotate":-21.98},{"duration":0,"rotate":-23.09}]},{"name":"head","translateFrame":[{"duration":24,"tweenEasing":0,"x":4.19,"y":4.72},{"duration":24,"tweenEasing":0,"x":6.33,"y":5.71},{"duration":24,"tweenEasing":0,"x":6.14,"y":5.69},{"duration":0,"x":4.19,"y":4.72}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":27.28},{"duration":24,"tweenEasing":0,"rotate":21.12},{"duration":24,"tweenEasing":0,"rotate":18.96},{"duration":0,"rotate":27.28}]},{"name":"rightShoulder","translateFrame":[{"duration":24,"tweenEasing":0,"x":3.43,"y":0.23},{"duration":24,"tweenEasing":0,"x":5.46,"y":1.26},{"duration":24,"tweenEasing":0,"x":5.41,"y":0.45},{"duration":0,"x":3.43,"y":0.23}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":13.3},{"duration":24,"tweenEasing":0,"rotate":9.28},{"duration":24,"tweenEasing":0,"rotate":14.42},{"duration":0,"rotate":13.3}]},{"name":"body","translateFrame":[{"duration":24,"tweenEasing":0},{"duration":24,"tweenEasing":0,"x":0.23,"y":0.23},{"duration":24,"tweenEasing":0,"x":0.5,"y":-0.57},{"duration":0}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":13.71},{"duration":24,"tweenEasing":0,"rotate":17.86},{"duration":24,"tweenEasing":0,"rotate":16.11},{"duration":0,"rotate":13.71}]},{"name":"leg","scaleFrame":[{"duration":18,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":18,"tweenEasing":0,"y":0.9},{"duration":6,"tweenEasing":0,"y":0.9},{"duration":18,"tweenEasing":0,"x":1.1,"y":0.8},{"duration":6,"tweenEasing":0,"x":1.1,"y":0.8},{"duration":0}]},{"name":"rightHand","translateFrame":[{"duration":72,"x":-1.95,"y":-1.15}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":11.7},{"duration":24,"tweenEasing":0,"rotate":1.26},{"duration":24,"tweenEasing":0,"rotate":-11.03},{"duration":0,"rotate":11.7}]},{"name":"rightFrontArm","translateFrame":[{"duration":72,"x":-0.3,"y":-0.01}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":1.98},{"duration":24,"tweenEasing":0,"rotate":-1.3},{"duration":24,"tweenEasing":0,"rotate":-0.66},{"duration":0,"rotate":1.98}]},{"name":"rightArm","translateFrame":[{"duration":24,"tweenEasing":0,"x":6.56,"y":3.17},{"duration":24,"tweenEasing":0,"x":6.56,"y":3.17},{"duration":24,"tweenEasing":0,"x":7.09,"y":2.9},{"duration":0,"x":6.56,"y":3.17}],"rotateFrame":[{"duration":24,"tweenEasing":0,"rotate":29.2},{"duration":24,"tweenEasing":0,"rotate":11.66},{"duration":24,"tweenEasing":0,"rotate":23.61},{"duration":0,"rotate":29.2}]}],"slot":[{"name":"effect4","colorFrame":[{"duration":3,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"effect3","colorFrame":[{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":24,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":0,"value":{"aM":0}}]},{"name":"effect2","colorFrame":[{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":24,"tweenEasing":0},{"duration":24,"tweenEasing":0},{"duration":3,"value":{"aM":0}}]},{"name":"backLight","displayFrame":[{"duration":72,"value":-1}]},{"name":"effect5","displayFrame":[{"duration":72,"value":-1}]},{"name":"effect6","displayFrame":[{"duration":72,"value":-1}]}]},{"duration":102,"playTimes":0,"name":"Idle2","bone":[{"name":"effect6","translateFrame":[{"duration":39,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":6.4,"y":-11.2},{"duration":24,"tweenEasing":0,"x":6.4,"y":-23.8},{"duration":0,"x":14,"y":-30.2}],"rotateFrame":[{"duration":39,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-27.23},{"duration":24,"tweenEasing":0,"rotate":-17.6},{"duration":0,"rotate":-35.03}]},{"name":"effect5","translateFrame":[{"duration":27,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":-10.4,"y":-18.24},{"duration":21,"tweenEasing":0,"x":-10.08,"y":-32.8},{"duration":12,"x":-12.8,"y":-39.68}],"rotateFrame":[{"duration":27,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":22.39},{"duration":21,"tweenEasing":0,"rotate":39.5},{"duration":12,"rotate":22.14}]},{"name":"effect4","translateFrame":[{"duration":15,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":8.8,"y":-12.2},{"duration":24,"tweenEasing":0,"x":11,"y":-27.6},{"duration":24,"x":12.2,"y":-38.6}],"rotateFrame":[{"duration":33,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":24,"tweenEasing":0,"rotate":-24.94},{"duration":24,"rotate":-14.84}]},{"name":"effect3","translateFrame":[{"duration":36,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":4.8,"y":-11.2},{"duration":18,"tweenEasing":0,"x":7.6,"y":-22.2},{"duration":9,"x":8.6,"y":-30.4}],"rotateFrame":[{"duration":36,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-17.53},{"duration":18,"tweenEasing":0,"rotate":-36.39},{"duration":9,"rotate":-23.84}]},{"name":"effect2","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"x":-4.53,"y":-13.33},{"duration":18,"tweenEasing":0,"x":-3.47,"y":-21.07},{"duration":33,"x":-6.13,"y":-34.93}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":15,"tweenEasing":0,"rotate":20.36},{"duration":18,"tweenEasing":0,"rotate":68.81},{"duration":33,"rotate":27.88}]},{"name":"leftHand","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":0.08,"y":0.37},{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":0.08,"y":0.37},{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":0.08,"y":0.37},{"duration":9,"tweenEasing":0},{"duration":18,"tweenEasing":0,"x":0.08,"y":0.37},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":-12.3},{"duration":9,"tweenEasing":0,"rotate":-14.11},{"duration":9,"tweenEasing":0,"rotate":-12.3},{"duration":9,"tweenEasing":0,"rotate":-14.11},{"duration":9,"tweenEasing":0,"rotate":-12.3},{"duration":9,"tweenEasing":0,"rotate":-14.11},{"duration":9,"tweenEasing":0,"rotate":-12.3},{"duration":18,"tweenEasing":0,"rotate":-14.11},{"duration":0}]},{"name":"leftFrontArm","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":0.37,"y":0.2},{"duration":9,"tweenEasing":0,"x":0.38,"y":0.31},{"duration":9,"tweenEasing":0,"x":0.37,"y":0.2},{"duration":9,"tweenEasing":0,"x":0.38,"y":0.31},{"duration":9,"tweenEasing":0,"x":0.37,"y":0.2},{"duration":9,"tweenEasing":0,"x":0.38,"y":0.31},{"duration":9,"tweenEasing":0,"x":0.37,"y":0.2},{"duration":18,"tweenEasing":0,"x":0.38,"y":0.31},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":6.55},{"duration":9,"tweenEasing":0,"rotate":-2.77},{"duration":9,"tweenEasing":0,"rotate":-0.86},{"duration":9,"tweenEasing":0,"rotate":-2.77},{"duration":9,"tweenEasing":0,"rotate":-6.22},{"duration":9,"tweenEasing":0,"rotate":3.34},{"duration":9,"tweenEasing":0,"rotate":-6.22},{"duration":18,"tweenEasing":0,"rotate":-2.77},{"duration":0}]},{"name":"leftShoulder","translateFrame":[{"duration":21,"tweenEasing":0,"x":-2.4,"y":0.27},{"duration":9,"tweenEasing":0,"x":-0.31,"y":-0.92},{"duration":9,"tweenEasing":0,"x":-0.19,"y":-1.27},{"duration":9,"tweenEasing":0,"x":0.01,"y":-2.2},{"duration":9,"tweenEasing":0,"x":-0.19,"y":-1.27},{"duration":9,"tweenEasing":0,"x":0.01,"y":-2.2},{"duration":9,"tweenEasing":0,"x":-0.19,"y":-1.27},{"duration":9,"tweenEasing":0,"x":0.01,"y":-2.2},{"duration":18,"tweenEasing":0,"x":-0.19,"y":-1.43},{"duration":0,"x":-2.4,"y":0.27}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":18.96},{"duration":9,"tweenEasing":0,"rotate":31.61},{"duration":9,"tweenEasing":0,"rotate":18.96},{"duration":9,"tweenEasing":0,"rotate":37.04},{"duration":9,"tweenEasing":0,"rotate":18.96},{"duration":9,"tweenEasing":0,"rotate":35.61},{"duration":9,"tweenEasing":0,"rotate":18.96},{"duration":18,"tweenEasing":0,"rotate":31.61},{"duration":0}]},{"name":"leftArm","translateFrame":[{"duration":21,"tweenEasing":0,"x":-2.4,"y":0.27},{"duration":9,"tweenEasing":0,"x":-0.85,"y":-2.35},{"duration":9,"tweenEasing":0,"x":-0.53,"y":-4.39},{"duration":9,"tweenEasing":0,"x":-0.53,"y":-3.63},{"duration":9,"tweenEasing":0,"x":-0.53,"y":-4.39},{"duration":9,"tweenEasing":0,"x":-0.53,"y":-3.63},{"duration":9,"tweenEasing":0,"x":-0.53,"y":-4.39},{"duration":9,"tweenEasing":0,"x":-0.53,"y":-3.63},{"duration":18,"tweenEasing":0,"x":-0.53,"y":-4.55},{"duration":0,"x":-2.4,"y":0.27}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":30.08},{"duration":9,"tweenEasing":0,"rotate":22.76},{"duration":9,"tweenEasing":0,"rotate":19.34},{"duration":9,"tweenEasing":0,"rotate":25.64},{"duration":9,"tweenEasing":0,"rotate":20.36},{"duration":9,"tweenEasing":0,"rotate":26.38},{"duration":9,"tweenEasing":0,"rotate":18.94},{"duration":18,"tweenEasing":0,"rotate":22.76},{"duration":0}]},{"name":"head","translateFrame":[{"duration":21,"tweenEasing":0,"x":-2.13,"y":0.27},{"duration":9,"tweenEasing":0,"x":-0.29,"y":0.61},{"duration":9,"tweenEasing":0,"x":0.57,"y":-1.49},{"duration":9,"tweenEasing":0,"x":0.67,"y":-0.35},{"duration":9,"tweenEasing":0,"x":0.57,"y":-1.49},{"duration":9,"tweenEasing":0,"x":0.67,"y":0.13},{"duration":9,"tweenEasing":0,"x":0.57,"y":-2.13},{"duration":9,"tweenEasing":0,"x":0.67,"y":0.61},{"duration":18,"tweenEasing":0,"x":0.57,"y":-2.13},{"duration":0,"x":-2.13,"y":0.27}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":-4.1},{"duration":9,"tweenEasing":0,"rotate":0.06},{"duration":54,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":0,"rotate":-4.1}]},{"name":"rightShoulder","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":1.01,"y":-0.72},{"duration":9,"tweenEasing":0,"x":1.72,"y":-2.61},{"duration":9,"tweenEasing":0,"x":1.33,"y":-2},{"duration":9,"tweenEasing":0,"x":1.72,"y":-2.61},{"duration":9,"tweenEasing":0,"x":1.33,"y":-2},{"duration":9,"tweenEasing":0,"x":1.72,"y":-2.77},{"duration":9,"tweenEasing":0,"x":1.33,"y":-2},{"duration":18,"tweenEasing":0,"x":1.72,"y":-3.73},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":-30.94},{"duration":9,"tweenEasing":0,"rotate":-38.24},{"duration":9,"tweenEasing":0,"rotate":-30.94},{"duration":9,"tweenEasing":0,"rotate":-39.74},{"duration":9,"tweenEasing":0,"rotate":-30.94},{"duration":9,"tweenEasing":0,"rotate":-45.24},{"duration":9,"tweenEasing":0,"rotate":-30.94},{"duration":18,"tweenEasing":0,"rotate":-38.24},{"duration":0}]},{"name":"body","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":-0.32,"y":0.32},{"duration":9,"tweenEasing":0,"y":-0.99},{"duration":9,"tweenEasing":0,"y":-0.96},{"duration":9,"tweenEasing":0,"y":-1.47},{"duration":9,"tweenEasing":0,"y":-1.12},{"duration":9,"tweenEasing":0,"y":-1.95},{"duration":9,"tweenEasing":0,"y":-0.96},{"duration":18,"tweenEasing":0,"y":-2.11},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":-6.48},{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":0.41},{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":0.41},{"duration":9,"tweenEasing":0},{"duration":9,"tweenEasing":0,"rotate":0.41},{"duration":9,"tweenEasing":0},{"duration":18,"tweenEasing":0,"rotate":0.41},{"duration":0,"rotate":-6.48}],"scaleFrame":[{"duration":21,"tweenEasing":0},{"duration":9,"tweenEasing":0,"x":1.01,"y":1.01},{"duration":9,"tweenEasing":0,"x":1.02,"y":1.02},{"duration":9,"tweenEasing":0,"x":1.01,"y":1.01},{"duration":9,"tweenEasing":0,"x":1.02,"y":1.02},{"duration":9,"tweenEasing":0,"x":1.01,"y":1.01},{"duration":9,"tweenEasing":0,"x":1.02,"y":1.02},{"duration":9,"tweenEasing":0,"x":1.01,"y":1.01},{"duration":18,"tweenEasing":0,"x":1.02,"y":1.02},{"duration":0}]},{"name":"leg","translateFrame":[{"duration":24,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"y":-0.12},{"duration":24,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"y":-0.12},{"duration":30}],"scaleFrame":[{"duration":24,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":1.04,"y":1.1},{"duration":24,"tweenEasing":0},{"duration":6,"tweenEasing":0},{"duration":6,"tweenEasing":0,"x":1.04,"y":1.1},{"duration":30}]},{"name":"rightHand","translateFrame":[{"duration":21,"tweenEasing":0,"x":-1.95,"y":-1.15},{"duration":9,"tweenEasing":0,"x":-2.1,"y":-0.4},{"duration":9,"tweenEasing":0,"x":-1.71,"y":-0.37},{"duration":9,"tweenEasing":0,"x":-2.1,"y":-0.4},{"duration":9,"tweenEasing":0,"x":-1.71,"y":-0.37},{"duration":9,"tweenEasing":0,"x":-2.1,"y":-0.4},{"duration":9,"tweenEasing":0,"x":-1.71,"y":-0.37},{"duration":9,"tweenEasing":0,"x":-2.1,"y":-0.4},{"duration":18,"tweenEasing":0,"x":-1.71,"y":-0.37},{"duration":0,"x":-1.95,"y":-1.15}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":11.7},{"duration":9,"tweenEasing":0,"rotate":8.49},{"duration":9,"tweenEasing":0,"rotate":10.34},{"duration":9,"tweenEasing":0,"rotate":8.49},{"duration":9,"tweenEasing":0,"rotate":10.34},{"duration":9,"tweenEasing":0,"rotate":8.49},{"duration":9,"tweenEasing":0,"rotate":10.34},{"duration":9,"tweenEasing":0,"rotate":8.49},{"duration":18,"tweenEasing":0,"rotate":10.34},{"duration":0,"rotate":11.7}]},{"name":"rightFrontArm","translateFrame":[{"duration":21,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":9,"tweenEasing":0,"x":-0.89,"y":0.2},{"duration":9,"tweenEasing":0,"x":-0.33,"y":0.31},{"duration":9,"tweenEasing":0,"x":-0.89,"y":0.2},{"duration":9,"tweenEasing":0,"x":-0.33,"y":0.31},{"duration":9,"tweenEasing":0,"x":-0.89,"y":0.2},{"duration":9,"tweenEasing":0,"x":-0.33,"y":0.31},{"duration":9,"tweenEasing":0,"x":-0.89,"y":0.2},{"duration":18,"tweenEasing":0,"x":-0.41,"y":0.01},{"duration":0,"x":-0.3,"y":-0.01}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":21.7},{"duration":9,"tweenEasing":0,"rotate":40.53},{"duration":9,"tweenEasing":0,"rotate":48.89},{"duration":9,"tweenEasing":0,"rotate":45.22},{"duration":9,"tweenEasing":0,"rotate":48.89},{"duration":9,"tweenEasing":0,"rotate":40.53},{"duration":9,"tweenEasing":0,"rotate":46.54},{"duration":9,"tweenEasing":0,"rotate":40.53},{"duration":18,"tweenEasing":0,"rotate":48.89},{"duration":0,"rotate":21.7}]},{"name":"rightArm","translateFrame":[{"duration":21,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":9,"tweenEasing":0,"x":1.52,"y":0.77},{"duration":9,"tweenEasing":0,"x":2.26,"y":-1.5},{"duration":9,"tweenEasing":0,"x":1.84,"y":-0.51},{"duration":9,"tweenEasing":0,"x":2.26,"y":-1.5},{"duration":9,"tweenEasing":0,"x":1.84,"y":-0.51},{"duration":9,"tweenEasing":0,"x":2.26,"y":-1.5},{"duration":9,"tweenEasing":0,"x":1.84,"y":-0.99},{"duration":18,"tweenEasing":0,"x":2.26,"y":-2.14},{"duration":0,"x":1.76,"y":2.48}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":-6.67},{"duration":9,"tweenEasing":0,"rotate":-30.66},{"duration":9,"tweenEasing":0,"rotate":-31.48},{"duration":9,"tweenEasing":0,"rotate":-27.88},{"duration":9,"tweenEasing":0,"rotate":-34.28},{"duration":9,"tweenEasing":0,"rotate":-25.77},{"duration":9,"tweenEasing":0,"rotate":-35.22},{"duration":9,"tweenEasing":0,"rotate":-23.55},{"duration":18,"tweenEasing":0,"rotate":-31.48},{"duration":0,"rotate":-6.67}]}],"slot":[{"name":"effect6","colorFrame":[{"duration":39,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0},{"duration":24,"tweenEasing":0},{"duration":0,"value":{"aM":0}}]},{"name":"effect5","colorFrame":[{"duration":27,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":12,"value":{"aM":0}}]},{"name":"effect4","colorFrame":[{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0},{"duration":24,"tweenEasing":0},{"duration":24,"value":{"aM":0}}]},{"name":"effect3","colorFrame":[{"duration":36,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"effect2","colorFrame":[{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0,"value":{"aM":0}},{"duration":15,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":33,"value":{"aM":0}}]},{"name":"backLight","displayFrame":[{"duration":102,"value":-1}]}]},{"duration":66,"playTimes":0,"name":"Idle1","bone":[{"name":"effect6","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":24,"tweenEasing":0,"x":6.93,"y":-13.69},{"duration":0,"x":10.84,"y":-19.73}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":24,"rotate":-10.38}]},{"name":"effect5","translateFrame":[{"duration":6,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":18,"tweenEasing":0,"x":-8,"y":-6.63},{"duration":15,"tweenEasing":0,"x":-10.06,"y":-17.83},{"duration":9,"x":-10.74,"y":-24.69}],"rotateFrame":[{"duration":6,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":18,"tweenEasing":0,"rotate":27.97},{"duration":15,"tweenEasing":0,"rotate":-3.77},{"duration":9,"rotate":-10.94}]},{"name":"effect4","translateFrame":[{"duration":18,"tweenEasing":0},{"duration":18,"tweenEasing":0,"x":7.77,"y":-12.8},{"duration":21,"tweenEasing":0,"x":13.49,"y":-21.94},{"duration":9,"x":13.03,"y":-26.74}],"rotateFrame":[{"duration":18,"tweenEasing":0},{"duration":18,"tweenEasing":0,"rotate":19.87},{"duration":21,"tweenEasing":0,"rotate":-1.94},{"duration":9,"rotate":-29.35}]},{"name":"effect3","translateFrame":[{"duration":9,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":6.8,"y":-15.73},{"duration":18,"tweenEasing":0,"x":6.27,"y":-28.27},{"duration":0,"x":7.33,"y":-35.73}],"rotateFrame":[{"duration":9,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-25.82},{"duration":18,"tweenEasing":0,"rotate":-13.32},{"duration":0,"rotate":-23.08}]},{"name":"effect2","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":18,"tweenEasing":0,"x":-4.64,"y":-11.84},{"duration":21,"tweenEasing":0,"x":-11.68,"y":-18.88},{"duration":6,"x":-15.04,"y":-24}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":18,"tweenEasing":0,"rotate":35.13},{"duration":21,"tweenEasing":0,"rotate":-4.98},{"duration":6,"rotate":29.58}]},{"name":"leftHand","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":0.58,"y":0.86},{"duration":24,"tweenEasing":0,"x":0.58,"y":0.86},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-4.45},{"duration":24,"tweenEasing":0,"rotate":-6.58},{"duration":0}]},{"name":"leftFrontArm","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":0.06,"y":0.45},{"duration":24}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-3.35},{"duration":24,"tweenEasing":0,"rotate":7.11},{"duration":0}]},{"name":"leftShoulder","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":-0.16,"y":-1.12},{"duration":24,"tweenEasing":0,"x":-0.16,"y":-1.12},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":13.8},{"duration":24,"tweenEasing":0,"rotate":4.52},{"duration":0}]},{"name":"leftArm","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":0.2,"y":-1.99},{"duration":24,"tweenEasing":0,"x":0.36,"y":-1.83},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":16.02},{"duration":24,"tweenEasing":0,"rotate":12.08},{"duration":0}]},{"name":"head","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":-0.32,"y":-1.37},{"duration":24,"tweenEasing":0,"y":-0.89},{"duration":0}]},{"name":"rightShoulder","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":0.64,"y":-3.79},{"duration":24,"tweenEasing":0,"x":0.64,"y":-1.55},{"duration":0}],"rotateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"rotate":-10.95},{"duration":24,"tweenEasing":0,"rotate":-8.38},{"duration":0}]},{"name":"body","translateFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"y":-1.44},{"duration":24,"tweenEasing":0,"x":0.16,"y":-0.64},{"duration":0}],"scaleFrame":[{"duration":21,"tweenEasing":0},{"duration":21,"tweenEasing":0,"x":1.03,"y":1.03},{"duration":24,"tweenEasing":0,"x":1.03,"y":1.03},{"duration":0}]},{"name":"rightHand","translateFrame":[{"duration":66,"x":-1.95,"y":-1.15}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":11.7},{"duration":21,"tweenEasing":0,"rotate":16.12},{"duration":24,"tweenEasing":0,"rotate":15.51},{"duration":0,"rotate":11.7}]},{"name":"rightFrontArm","translateFrame":[{"duration":21,"tweenEasing":0,"x":-0.3,"y":-0.01},{"duration":21,"tweenEasing":0,"x":-0.17,"y":1.03},{"duration":24,"tweenEasing":0,"x":-0.13,"y":0.26},{"duration":0,"x":-0.3,"y":-0.01}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":21.7},{"duration":21,"tweenEasing":0,"rotate":45.3},{"duration":24,"tweenEasing":0,"rotate":32.17},{"duration":0,"rotate":21.7}]},{"name":"rightArm","translateFrame":[{"duration":21,"tweenEasing":0,"x":1.76,"y":2.48},{"duration":21,"tweenEasing":0,"x":1.49,"y":0.92},{"duration":24,"tweenEasing":0,"x":2.13,"y":1.4},{"duration":0,"x":1.76,"y":2.48}],"rotateFrame":[{"duration":21,"tweenEasing":0,"rotate":-6.67},{"duration":21,"tweenEasing":0,"rotate":-26.33},{"duration":24,"tweenEasing":0,"rotate":-19.75},{"duration":0,"rotate":-6.67}]}],"slot":[{"name":"effect6","colorFrame":[{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":24,"tweenEasing":0},{"duration":0,"value":{"aM":0}}]},{"name":"effect5","colorFrame":[{"duration":6,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0},{"duration":15,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"effect4","colorFrame":[{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":9,"value":{"aM":0}}]},{"name":"effect3","colorFrame":[{"duration":9,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"duration":21,"tweenEasing":0},{"duration":18,"tweenEasing":0},{"duration":0,"value":{"aM":0}}]},{"name":"effect2","colorFrame":[{"duration":21,"tweenEasing":0,"value":{"aM":0}},{"duration":18,"tweenEasing":0},{"duration":21,"tweenEasing":0},{"duration":6,"value":{"aM":0}}]},{"name":"backLight","displayFrame":[{"duration":66,"value":-1}]}]}],"defaultActions":[{"gotoAndPlay":"Walking"}]}]} \ No newline at end of file diff --git a/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json.meta b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json.meta new file mode 100644 index 0000000..208b00e --- /dev/null +++ b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_ske.json.meta @@ -0,0 +1,6 @@ +{ + "ver": "1.0.0", + "uuid": "73b7e7d4-6ad0-41ea-9d17-1104c463aad2", + "dragonBonesJson": "{\"frameRate\":60,\"name\":\"SoldierWaterGhost\",\"version\":\"5.5\",\"compatibleVersion\":\"5.5\",\"armature\":[{\"type\":\"Armature\",\"frameRate\":60,\"name\":\"SoldierWaterGhost\",\"aabb\":{\"x\":-34.2,\"y\":-91.74,\"width\":77.68,\"height\":94.31},\"bone\":[{\"name\":\"root\"},{\"inheritScale\":false,\"length\":13,\"name\":\"leftShoulder\",\"parent\":\"root\",\"transform\":{\"x\":-11.2185,\"y\":-56.7863,\"skX\":156.8918,\"skY\":156.8918}},{\"inheritScale\":false,\"name\":\"backLight\",\"parent\":\"root\",\"transform\":{\"x\":0.2,\"y\":-46.0924,\"scX\":3,\"scY\":3}},{\"inheritScale\":false,\"length\":17,\"name\":\"rightArm\",\"parent\":\"root\",\"transform\":{\"x\":13.5908,\"y\":-53.6036,\"skX\":46.9769,\"skY\":46.9769}},{\"inheritScale\":false,\"name\":\"effect4\",\"parent\":\"root\",\"transform\":{\"x\":12.64,\"y\":-42.7787,\"skX\":-9.349,\"skY\":-9.349}},{\"inheritScale\":false,\"name\":\"effect7\",\"parent\":\"root\"},{\"inheritScale\":false,\"name\":\"effect3\",\"parent\":\"root\",\"transform\":{\"x\":11.5,\"y\":-54.7347}},{\"inheritScale\":false,\"length\":17,\"name\":\"leg\",\"parent\":\"root\",\"transform\":{\"x\":-0.9105,\"y\":-2.8201,\"skX\":-85.7242,\"skY\":-85.7242}},{\"inheritScale\":false,\"length\":22,\"name\":\"body\",\"parent\":\"root\",\"transform\":{\"x\":2.0039,\"y\":-24.7902,\"skX\":-82.2714,\"skY\":-82.2714}},{\"inheritScale\":false,\"length\":12,\"name\":\"rightShoulder\",\"parent\":\"root\",\"transform\":{\"x\":18.2082,\"y\":-52.6804,\"skX\":22.0857,\"skY\":22.0857}},{\"inheritScale\":false,\"length\":11,\"name\":\"head\",\"parent\":\"root\",\"transform\":{\"x\":8.206,\"y\":-62.581,\"skX\":-83.4757,\"skY\":-83.4757}},{\"inheritScale\":false,\"length\":10,\"name\":\"leftArm\",\"parent\":\"root\",\"transform\":{\"x\":-13.0118,\"y\":-53.6185,\"skX\":122.5397,\"skY\":122.5397}},{\"inheritScale\":false,\"name\":\"effect2\",\"parent\":\"root\",\"transform\":{\"x\":-10.0286,\"y\":-56.4408,\"skX\":-79.3059,\"skY\":-79.3059}},{\"inheritScale\":false,\"name\":\"effect5\",\"parent\":\"root\",\"transform\":{\"x\":-30.0572,\"y\":-33.1972,\"skX\":-72.4737,\"skY\":-72.4737}},{\"inheritScale\":false,\"name\":\"effect6\",\"parent\":\"root\",\"transform\":{\"x\":26.5689,\"y\":-30.0747}},{\"inheritScale\":false,\"name\":\"rightFrontArm\",\"parent\":\"rightArm\",\"transform\":{\"x\":17.6467,\"y\":1.3208,\"skX\":10.7237,\"skY\":10.7237}},{\"inheritScale\":false,\"name\":\"leftFrontArm\",\"parent\":\"leftArm\",\"transform\":{\"x\":14.7447,\"y\":3.5738,\"skX\":-39.1583,\"skY\":-39.1583}},{\"inheritScale\":false,\"name\":\"rightHand\",\"parent\":\"rightFrontArm\",\"transform\":{\"x\":10.7292,\"y\":-5.7822,\"skX\":21.9835,\"skY\":21.9835}},{\"inheritScale\":false,\"name\":\"leftHand\",\"parent\":\"leftFrontArm\",\"transform\":{\"x\":14.7808,\"y\":2.8582,\"skX\":-25.7356,\"skY\":-25.7356}}],\"slot\":[{\"name\":\"backLight\",\"parent\":\"backLight\"},{\"name\":\"rightArm\",\"parent\":\"rightArm\"},{\"name\":\"leg\",\"parent\":\"leg\"},{\"name\":\"body\",\"parent\":\"body\"},{\"name\":\"rightShoulder\",\"parent\":\"rightShoulder\"},{\"name\":\"rightFrontArm\",\"parent\":\"rightFrontArm\"},{\"name\":\"rightHand\",\"parent\":\"rightHand\"},{\"name\":\"leftArm\",\"parent\":\"leftArm\"},{\"name\":\"leftShoulder\",\"parent\":\"leftShoulder\"},{\"name\":\"leftFrontArm\",\"parent\":\"leftFrontArm\"},{\"name\":\"head\",\"parent\":\"head\"},{\"name\":\"leftHand\",\"parent\":\"leftHand\"},{\"name\":\"effect2\",\"parent\":\"effect2\"},{\"name\":\"effect3\",\"parent\":\"effect3\"},{\"name\":\"effect4\",\"parent\":\"effect4\"},{\"name\":\"effect5\",\"parent\":\"effect5\"},{\"name\":\"effect6\",\"parent\":\"effect6\"},{\"displayIndex\":-1,\"name\":\"effect7\",\"parent\":\"effect7\"}],\"skin\":[{\"slot\":[{\"name\":\"leg\",\"display\":[{\"name\":\"yinmoqe00\",\"transform\":{\"x\":10.63,\"y\":-0.15,\"skX\":85.72,\"skY\":85.72}}]},{\"name\":\"head\",\"display\":[{\"name\":\"yinmo01\",\"transform\":{\"x\":13.01,\"y\":-2.08,\"skX\":82.3,\"skY\":82.3,\"scX\":1.5,\"scY\":1.5},\"path\":\"head\"},{\"name\":\"head2\",\"transform\":{\"x\":13.28,\"y\":-2.44,\"skX\":83.48,\"skY\":83.48}}]},{\"name\":\"leftFrontArm\",\"display\":[{\"name\":\"yinmo06\",\"transform\":{\"x\":6.29,\"y\":0.98,\"skX\":-76.83,\"skY\":-76.83},\"path\":\"leftFrontArm\"}]},{\"name\":\"body\",\"display\":[{\"name\":\"yinmo02\",\"transform\":{\"x\":12.81,\"y\":-2.38,\"skX\":82.27,\"skY\":82.27},\"path\":\"body\"}]},{\"name\":\"leftShoulder\",\"display\":[{\"name\":\"yinmo03\",\"transform\":{\"x\":4.79,\"y\":-0.12,\"skX\":-154.62,\"skY\":-154.62},\"path\":\"leftShoulder\"}]},{\"name\":\"backLight\",\"display\":[{\"name\":\"biu\"}]},{\"name\":\"effect5\",\"display\":[{\"name\":\"huomiao01\"}]},{\"name\":\"rightArm\",\"display\":[{\"name\":\"yinmo08\",\"transform\":{\"x\":9.07,\"y\":-0.39,\"skX\":-54.4,\"skY\":-54.4},\"path\":\"rightArm\"}]},{\"name\":\"rightShoulder\",\"display\":[{\"name\":\"yinmo04\",\"transform\":{\"x\":3.42,\"y\":-0.82,\"skX\":-28.61,\"skY\":-28.61},\"path\":\"rightShoulder\"}]},{\"name\":\"effect6\",\"display\":[{\"name\":\"huomiao01\"}]},{\"name\":\"rightFrontArm\",\"display\":[{\"name\":\"yinmo09\",\"transform\":{\"x\":3.74,\"y\":-1.19,\"skX\":-60.14,\"skY\":-60.14},\"path\":\"rightFrontArm\"}]},{\"name\":\"rightHand\",\"display\":[{\"name\":\"yinmo10\",\"transform\":{\"x\":5.38,\"y\":-0.23,\"skX\":-63.84,\"skY\":-63.84},\"path\":\"rightHand\"}]},{\"name\":\"effect4\",\"display\":[{\"name\":\"huomiao01\"}]},{\"name\":\"effect2\",\"display\":[{\"name\":\"huomiao01\"}]},{\"name\":\"leftArm\",\"display\":[{\"name\":\"yinmo05\",\"transform\":{\"x\":6.91,\"y\":0.09,\"skX\":-112.43,\"skY\":-112.43},\"path\":\"leftArm\"}]},{\"name\":\"effect3\",\"display\":[{\"name\":\"huomiao01\"}]},{\"name\":\"leftHand\",\"display\":[{\"name\":\"yinmo07\",\"transform\":{\"x\":4.09,\"y\":-0.34,\"skX\":-66.8,\"skY\":-66.8},\"path\":\"leftHand\"}]}]}],\"animation\":[{\"duration\":60,\"playTimes\":0,\"name\":\"Walking\",\"bone\":[{\"name\":\"effect5\",\"translateFrame\":[{\"duration\":12,\"tweenEasing\":0,\"x\":44.16,\"y\":14.08},{\"duration\":12,\"tweenEasing\":0,\"x\":44.16,\"y\":14.08},{\"duration\":15,\"tweenEasing\":0,\"x\":31.04,\"y\":15.36},{\"duration\":15,\"tweenEasing\":0,\"x\":22.08,\"y\":-0.64},{\"duration\":6,\"x\":-10.24,\"y\":-23.36}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":21,\"rotate\":7.3}]},{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":7.36,\"y\":-2.48},{\"duration\":9,\"tweenEasing\":0,\"x\":7.36,\"y\":-2.48},{\"duration\":15,\"tweenEasing\":0,\"x\":-2,\"y\":-15.76},{\"duration\":12,\"tweenEasing\":0,\"x\":-14.48,\"y\":-20.48},{\"duration\":12,\"tweenEasing\":0,\"x\":-14.64,\"y\":-36.8},{\"duration\":6,\"x\":-40.56,\"y\":-53.04}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":-49.96},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-49.96},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-84.92},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-11.77},{\"duration\":6,\"rotate\":-28.57}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":-14.8,\"y\":25.6},{\"duration\":12,\"tweenEasing\":0,\"x\":-14.8,\"y\":25.6},{\"duration\":18,\"tweenEasing\":0,\"x\":-29.2,\"y\":17.6},{\"duration\":12,\"tweenEasing\":0,\"x\":-38,\"y\":9.2},{\"duration\":9,\"tweenEasing\":0,\"x\":-56.4,\"y\":4.4},{\"duration\":3,\"x\":-68.8,\"y\":4}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-59.23},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-36.85},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-66.48},{\"duration\":3,\"rotate\":-111.5}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":3,\"tweenEasing\":0,\"x\":10.56,\"y\":11.2},{\"duration\":12,\"tweenEasing\":0,\"x\":10.56,\"y\":11.2},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.6,\"y\":1.6},{\"duration\":18,\"tweenEasing\":0,\"x\":-19.84,\"y\":3.2},{\"duration\":9,\"tweenEasing\":0,\"x\":-29.76,\"y\":-6.72},{\"duration\":3,\"x\":-39.68,\"y\":-24}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-61.22},{\"duration\":9,\"tweenEasing\":0,\"rotate\":0.48},{\"duration\":3,\"rotate\":27.59}]},{\"name\":\"leftHand\",\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"rotate\":11.3},{\"duration\":15,\"tweenEasing\":0,\"rotate\":15.68},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-5.06},{\"duration\":0}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":0.15,\"y\":1.19},{\"duration\":15,\"tweenEasing\":0,\"x\":0.46,\"y\":-1.06},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.33,\"y\":-2.07},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":-4.65},{\"duration\":15,\"tweenEasing\":0,\"rotate\":12.03},{\"duration\":15,\"tweenEasing\":0,\"rotate\":23.96},{\"duration\":15,\"tweenEasing\":0,\"rotate\":16.54},{\"duration\":0,\"rotate\":-4.65}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":5.76},{\"duration\":15,\"tweenEasing\":0,\"x\":5.14,\"y\":1.94},{\"duration\":15,\"tweenEasing\":0,\"x\":8.29,\"y\":-0.16},{\"duration\":15,\"tweenEasing\":0,\"x\":7.36,\"y\":2.19},{\"duration\":0,\"x\":5.76}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":20.1},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-5.43},{\"duration\":15,\"tweenEasing\":0,\"rotate\":10.13},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-2.7},{\"duration\":0,\"rotate\":20.1}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":3.84,\"y\":-0.96},{\"duration\":15,\"tweenEasing\":0,\"x\":7.18,\"y\":1.44},{\"duration\":15,\"tweenEasing\":0,\"x\":13.26,\"y\":3.09},{\"duration\":15,\"tweenEasing\":0,\"x\":11.89,\"y\":3.87},{\"duration\":0,\"x\":3.84,\"y\":-0.96}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":26.91},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-35.34},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-70.51},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-30.69},{\"duration\":0,\"rotate\":26.91}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":5.44,\"y\":1.28},{\"duration\":15,\"tweenEasing\":0,\"x\":4.96,\"y\":4.88},{\"duration\":15,\"tweenEasing\":0,\"x\":7.29,\"y\":0.64},{\"duration\":15,\"tweenEasing\":0,\"x\":7.59,\"y\":5.42},{\"duration\":0,\"x\":5.44,\"y\":1.28}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":0.59},{\"duration\":15,\"tweenEasing\":0,\"rotate\":0.59},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-0.72},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-0.72},{\"duration\":0,\"rotate\":0.59}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":3.41,\"y\":1.17},{\"duration\":15,\"tweenEasing\":0,\"x\":1.71,\"y\":2.68},{\"duration\":15,\"tweenEasing\":0,\"x\":3.89,\"y\":0.18},{\"duration\":15,\"tweenEasing\":0,\"x\":5.61,\"y\":3.87},{\"duration\":0,\"x\":3.41,\"y\":1.17}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":10.12},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-14.23},{\"duration\":15,\"tweenEasing\":0,\"rotate\":5.57},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-13.84},{\"duration\":0,\"rotate\":10.12}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"y\":2.72},{\"duration\":15,\"tweenEasing\":0,\"x\":0.96,\"y\":-0.18},{\"duration\":15,\"tweenEasing\":0,\"x\":1.42,\"y\":3.34},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":11.24},{\"duration\":15,\"tweenEasing\":0,\"rotate\":13},{\"duration\":15,\"tweenEasing\":0,\"rotate\":16.36},{\"duration\":15,\"tweenEasing\":0,\"rotate\":14.15},{\"duration\":0,\"rotate\":11.24}]},{\"name\":\"leg\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.96},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.8},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.96},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.96},{\"duration\":12,\"tweenEasing\":0,\"x\":0.64},{\"duration\":6,\"tweenEasing\":0,\"x\":0.64},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.32},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":1.02},{\"duration\":24,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-0.52},{\"duration\":6}],\"scaleFrame\":[{\"duration\":6,\"tweenEasing\":0,\"y\":0.9},{\"duration\":6,\"tweenEasing\":0,\"y\":0.8},{\"duration\":6,\"tweenEasing\":0,\"y\":1.1},{\"duration\":6,\"tweenEasing\":0,\"y\":0.8},{\"duration\":12,\"tweenEasing\":0,\"y\":0.9},{\"duration\":6,\"tweenEasing\":0,\"y\":0.9},{\"duration\":6,\"tweenEasing\":0,\"y\":0.8},{\"duration\":12,\"y\":0.9}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":60,\"x\":-1.95,\"y\":-1.15}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":-8},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-1.89},{\"duration\":15,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":15,\"tweenEasing\":0,\"rotate\":0.14},{\"duration\":0,\"rotate\":-8}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":-0.19,\"y\":-1.7},{\"duration\":15,\"tweenEasing\":0,\"x\":0.81,\"y\":-2.06},{\"duration\":15,\"tweenEasing\":0,\"x\":0.11,\"y\":-0.1},{\"duration\":3,\"tweenEasing\":0,\"x\":0.11,\"y\":-0.1},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.08,\"y\":-2.55},{\"duration\":6,\"tweenEasing\":0,\"y\":-2.64},{\"duration\":0,\"x\":-0.19,\"y\":-1.7}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":-43.73},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-66.02},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-6.47},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-62.6},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-58.82},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-51.28},{\"duration\":0,\"rotate\":-43.73}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":4.32,\"y\":4.08},{\"duration\":15,\"tweenEasing\":0,\"x\":4.96,\"y\":2.34},{\"duration\":15,\"tweenEasing\":0,\"x\":-8.37,\"y\":-4.26},{\"duration\":15,\"tweenEasing\":0,\"x\":4.21,\"y\":3.38},{\"duration\":0,\"x\":4.32,\"y\":4.08}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":11.28},{\"duration\":15,\"tweenEasing\":0,\"rotate\":63.1},{\"duration\":15,\"tweenEasing\":0,\"rotate\":74.64},{\"duration\":15,\"tweenEasing\":0,\"rotate\":55.11},{\"duration\":0,\"rotate\":11.28}]}],\"slot\":[{\"name\":\"effect5\",\"displayFrame\":[{\"duration\":12,\"value\":-1},{\"duration\":45},{\"duration\":3,\"value\":-1}],\"colorFrame\":[{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":6,\"value\":{\"aM\":0}}]},{\"name\":\"effect4\",\"displayFrame\":[{\"duration\":6,\"value\":-1},{\"duration\":51},{\"duration\":3,\"value\":-1}],\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":27,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":6,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"displayFrame\":[{\"duration\":6,\"value\":-1},{\"duration\":54},{\"duration\":0,\"value\":-1}],\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":30,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":3,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"displayFrame\":[{\"duration\":60},{\"duration\":0,\"value\":-1}],\"colorFrame\":[{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":33,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":3,\"value\":{\"aM\":0}}]},{\"name\":\"backLight\",\"displayFrame\":[{\"duration\":60,\"value\":-1}]},{\"name\":\"effect6\",\"displayFrame\":[{\"duration\":60,\"value\":-1}]}]},{\"duration\":174,\"name\":\"Atk2\",\"bone\":[{\"name\":\"effect5\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"x\":33.4,\"y\":-11},{\"duration\":12,\"tweenEasing\":0,\"x\":33.4,\"y\":-11},{\"duration\":12,\"tweenEasing\":0,\"x\":26.6,\"y\":-37.6},{\"duration\":12,\"tweenEasing\":0,\"x\":29.6,\"y\":-47},{\"duration\":24,\"tweenEasing\":0,\"x\":22.4,\"y\":-63.2},{\"duration\":12,\"tweenEasing\":0,\"x\":33.4,\"y\":-11},{\"duration\":12,\"tweenEasing\":0,\"x\":26.6,\"y\":-37.6},{\"duration\":12,\"tweenEasing\":0,\"x\":29.6,\"y\":-47},{\"duration\":24,\"tweenEasing\":0,\"x\":22.4,\"y\":-63.2},{\"duration\":12,\"tweenEasing\":0,\"x\":33.4,\"y\":-11},{\"duration\":12,\"tweenEasing\":0,\"x\":26.6,\"y\":-37.6},{\"duration\":9,\"tweenEasing\":0,\"x\":29.6,\"y\":-47},{\"duration\":3,\"x\":22.4,\"y\":-63.2}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"rotate\":33.54},{\"duration\":12,\"tweenEasing\":0,\"rotate\":33.54},{\"duration\":12,\"tweenEasing\":0,\"rotate\":56.49},{\"duration\":12,\"tweenEasing\":0,\"rotate\":11.57},{\"duration\":24,\"tweenEasing\":0,\"rotate\":61.88},{\"duration\":12,\"tweenEasing\":0,\"rotate\":33.54},{\"duration\":12,\"tweenEasing\":0,\"rotate\":56.49},{\"duration\":12,\"tweenEasing\":0,\"rotate\":11.57},{\"duration\":24,\"tweenEasing\":0,\"rotate\":61.88},{\"duration\":12,\"tweenEasing\":0,\"rotate\":33.54},{\"duration\":12,\"tweenEasing\":0,\"rotate\":56.49},{\"duration\":9,\"tweenEasing\":0,\"rotate\":11.57},{\"duration\":3,\"rotate\":61.88}]},{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":12,\"tweenEasing\":0,\"x\":6.86,\"y\":9.83},{\"duration\":12,\"tweenEasing\":0,\"x\":6.86,\"y\":9.83},{\"duration\":15,\"tweenEasing\":0,\"x\":8.69,\"y\":-11.2},{\"duration\":12,\"tweenEasing\":0,\"x\":-3.89,\"y\":-32.46},{\"duration\":21,\"tweenEasing\":0,\"x\":5.03,\"y\":-47.77},{\"duration\":12,\"tweenEasing\":0,\"x\":6.86,\"y\":9.83},{\"duration\":15,\"tweenEasing\":0,\"x\":8.69,\"y\":-11.2},{\"duration\":12,\"tweenEasing\":0,\"x\":-3.89,\"y\":-32.46},{\"duration\":21,\"tweenEasing\":0,\"x\":5.03,\"y\":-47.77},{\"duration\":12,\"tweenEasing\":0,\"x\":6.86,\"y\":9.83},{\"duration\":12,\"tweenEasing\":0,\"x\":8.69,\"y\":-11.2},{\"duration\":12,\"tweenEasing\":0,\"x\":-3.89,\"y\":-32.46},{\"duration\":6,\"x\":5.03,\"y\":-47.77}],\"rotateFrame\":[{\"duration\":12,\"tweenEasing\":0,\"rotate\":-12.09},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-12.09},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-56.61},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-44.01},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-53.65},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-12.09},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-56.61},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-44.01},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-53.65},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-12.09},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-56.61},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-44.01},{\"duration\":6,\"rotate\":-53.65}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"y\":15.09},{\"duration\":15,\"tweenEasing\":0,\"y\":15.09},{\"duration\":15,\"tweenEasing\":0,\"x\":-12.57,\"y\":-18.51},{\"duration\":12,\"tweenEasing\":0,\"x\":-24.23,\"y\":-35.89},{\"duration\":18,\"tweenEasing\":0,\"x\":-37.94,\"y\":-42.74},{\"duration\":15,\"tweenEasing\":0,\"y\":15.09},{\"duration\":15,\"tweenEasing\":0,\"x\":-12.57,\"y\":-18.51},{\"duration\":12,\"tweenEasing\":0,\"x\":-24.23,\"y\":-35.89},{\"duration\":18,\"tweenEasing\":0,\"x\":-37.94,\"y\":-42.74},{\"duration\":15,\"tweenEasing\":0,\"y\":15.09},{\"duration\":12,\"tweenEasing\":0,\"x\":-12.57,\"y\":-18.51},{\"duration\":12,\"tweenEasing\":0,\"x\":-24.23,\"y\":-35.89},{\"duration\":6,\"x\":-37.94,\"y\":-42.74}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":-42.15},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-42.15},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-77.72},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-111.08},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-42.15},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-42.15},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-77.72},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-111.08},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-42.15},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-42.15},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-77.72},{\"duration\":6,\"rotate\":-111.08}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":2.51,\"y\":23.54},{\"duration\":9,\"tweenEasing\":0,\"x\":2.51,\"y\":23.54},{\"duration\":15,\"tweenEasing\":0,\"x\":-3.2,\"y\":-0.46},{\"duration\":15,\"tweenEasing\":0,\"x\":-28.57,\"y\":-8.23},{\"duration\":15,\"tweenEasing\":0,\"x\":-27.43,\"y\":-20.57},{\"duration\":15,\"tweenEasing\":0,\"x\":2.51,\"y\":23.54},{\"duration\":15,\"tweenEasing\":0,\"x\":-3.2,\"y\":-0.46},{\"duration\":15,\"tweenEasing\":0,\"x\":-28.57,\"y\":-8.23},{\"duration\":15,\"tweenEasing\":0,\"x\":-27.43,\"y\":-20.57},{\"duration\":15,\"tweenEasing\":0,\"x\":2.51,\"y\":23.54},{\"duration\":15,\"tweenEasing\":0,\"x\":-3.2,\"y\":-0.46},{\"duration\":15,\"tweenEasing\":0,\"x\":-28.57,\"y\":-8.23},{\"duration\":9,\"x\":-27.43,\"y\":-20.57}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"rotate\":44.61},{\"duration\":15,\"tweenEasing\":0,\"rotate\":26.09},{\"duration\":15,\"tweenEasing\":0,\"rotate\":57.19},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"rotate\":44.61},{\"duration\":15,\"tweenEasing\":0,\"rotate\":26.09},{\"duration\":15,\"tweenEasing\":0,\"rotate\":57.19},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"rotate\":44.61},{\"duration\":15,\"tweenEasing\":0,\"rotate\":26.09},{\"duration\":9,\"rotate\":57.19}]},{\"name\":\"leftHand\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.1,\"y\":0.47},{\"duration\":3,\"tweenEasing\":0,\"x\":0.7,\"y\":0.08},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.44,\"y\":0.2},{\"duration\":12,\"tweenEasing\":0,\"x\":0.12,\"y\":0.59},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.1,\"y\":0.47},{\"duration\":3,\"tweenEasing\":0,\"x\":0.7,\"y\":0.08},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.44,\"y\":0.2},{\"duration\":12,\"tweenEasing\":0,\"x\":0.12,\"y\":0.59},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.1,\"y\":0.47},{\"duration\":3,\"tweenEasing\":0,\"x\":0.7,\"y\":0.08},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.44,\"y\":0.2},{\"duration\":12,\"tweenEasing\":0,\"x\":0.12,\"y\":0.59},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-7.81},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-6.46},{\"duration\":15,\"tweenEasing\":0,\"rotate\":8.11},{\"duration\":3,\"tweenEasing\":0,\"rotate\":9.3},{\"duration\":3,\"tweenEasing\":0,\"rotate\":15.3},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-14.89},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-7.81},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-6.46},{\"duration\":15,\"tweenEasing\":0,\"rotate\":8.11},{\"duration\":3,\"tweenEasing\":0,\"rotate\":9.3},{\"duration\":3,\"tweenEasing\":0,\"rotate\":15.3},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-14.89},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-7.81},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-6.46},{\"duration\":15,\"tweenEasing\":0,\"rotate\":8.11},{\"duration\":3,\"tweenEasing\":0,\"rotate\":9.3},{\"duration\":3,\"tweenEasing\":0,\"rotate\":15.3},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-14.89},{\"duration\":0}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":2.96,\"y\":-1.21},{\"duration\":3,\"tweenEasing\":0,\"x\":0.28,\"y\":0.35},{\"duration\":15,\"tweenEasing\":0,\"x\":1.5,\"y\":-3.97},{\"duration\":3,\"tweenEasing\":0,\"x\":1.5,\"y\":-3.97},{\"duration\":3,\"tweenEasing\":0,\"x\":0.65,\"y\":-3},{\"duration\":12,\"tweenEasing\":0,\"x\":0.49,\"y\":-0.89},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":2.96,\"y\":-1.21},{\"duration\":3,\"tweenEasing\":0,\"x\":0.28,\"y\":0.35},{\"duration\":15,\"tweenEasing\":0,\"x\":1.5,\"y\":-3.97},{\"duration\":3,\"tweenEasing\":0,\"x\":1.5,\"y\":-3.97},{\"duration\":3,\"tweenEasing\":0,\"x\":0.65,\"y\":-3},{\"duration\":12,\"tweenEasing\":0,\"x\":0.49,\"y\":-0.89},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":2.96,\"y\":-1.21},{\"duration\":3,\"tweenEasing\":0,\"x\":0.28,\"y\":0.35},{\"duration\":15,\"tweenEasing\":0,\"x\":1.5,\"y\":-3.97},{\"duration\":3,\"tweenEasing\":0,\"x\":1.5,\"y\":-3.97},{\"duration\":3,\"tweenEasing\":0,\"x\":0.65,\"y\":-3},{\"duration\":12,\"tweenEasing\":0,\"x\":0.49,\"y\":-0.89},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":26.32},{\"duration\":3,\"tweenEasing\":0,\"rotate\":13.47},{\"duration\":15,\"tweenEasing\":0,\"rotate\":17.13},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-10.43},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.34},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-21.72},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":26.32},{\"duration\":3,\"tweenEasing\":0,\"rotate\":13.47},{\"duration\":15,\"tweenEasing\":0,\"rotate\":17.13},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-10.43},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.34},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-21.72},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":26.32},{\"duration\":3,\"tweenEasing\":0,\"rotate\":13.47},{\"duration\":15,\"tweenEasing\":0,\"rotate\":17.13},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-10.43},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.34},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-21.72},{\"duration\":0}],\"scaleFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.07,\"y\":1.07},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.06,\"y\":1.06},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.07,\"y\":1.07},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.06,\"y\":1.06},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.07,\"y\":1.07},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.06,\"y\":1.06},{\"duration\":0}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":10.32,\"y\":5.25},{\"duration\":3,\"tweenEasing\":0,\"x\":15.99,\"y\":2.07},{\"duration\":15,\"tweenEasing\":0,\"x\":-14.24,\"y\":3.29},{\"duration\":3,\"tweenEasing\":0,\"x\":-20.77,\"y\":-0.8},{\"duration\":3,\"tweenEasing\":0,\"x\":-7.4,\"y\":-0.01},{\"duration\":12,\"tweenEasing\":0,\"x\":9.35,\"y\":3.21},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":10.32,\"y\":5.25},{\"duration\":3,\"tweenEasing\":0,\"x\":15.99,\"y\":2.07},{\"duration\":15,\"tweenEasing\":0,\"x\":-14.24,\"y\":3.29},{\"duration\":3,\"tweenEasing\":0,\"x\":-20.77,\"y\":-0.8},{\"duration\":3,\"tweenEasing\":0,\"x\":-7.4,\"y\":-0.01},{\"duration\":12,\"tweenEasing\":0,\"x\":9.35,\"y\":3.21},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":10.32,\"y\":5.25},{\"duration\":3,\"tweenEasing\":0,\"x\":15.99,\"y\":2.07},{\"duration\":15,\"tweenEasing\":0,\"x\":-14.24,\"y\":3.29},{\"duration\":3,\"tweenEasing\":0,\"x\":-20.77,\"y\":-0.8},{\"duration\":3,\"tweenEasing\":0,\"x\":-7.4,\"y\":-0.01},{\"duration\":12,\"tweenEasing\":0,\"x\":9.35,\"y\":3.21},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":51.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":0.72},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-26.65},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-44.38},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-6.99},{\"duration\":12,\"tweenEasing\":0,\"rotate\":18.04},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":51.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":0.72},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-26.65},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-44.38},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-6.99},{\"duration\":12,\"tweenEasing\":0,\"rotate\":18.04},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":51.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":0.72},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-26.65},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-44.38},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-6.99},{\"duration\":12,\"tweenEasing\":0,\"rotate\":18.04},{\"duration\":0}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":8.51,\"y\":-1.26},{\"duration\":3,\"tweenEasing\":0,\"x\":15.88,\"y\":0.43},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.36,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":-5.81,\"y\":-1.2},{\"duration\":3,\"tweenEasing\":0,\"x\":3.44,\"y\":2.61},{\"duration\":12,\"tweenEasing\":0,\"x\":9.85,\"y\":0.52},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":8.51,\"y\":-1.26},{\"duration\":3,\"tweenEasing\":0,\"x\":15.88,\"y\":0.43},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.36,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":-5.81,\"y\":-1.2},{\"duration\":3,\"tweenEasing\":0,\"x\":3.44,\"y\":2.61},{\"duration\":12,\"tweenEasing\":0,\"x\":9.85,\"y\":0.52},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":8.51,\"y\":-1.26},{\"duration\":3,\"tweenEasing\":0,\"x\":15.88,\"y\":0.43},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.36,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":-5.81,\"y\":-1.2},{\"duration\":3,\"tweenEasing\":0,\"x\":3.44,\"y\":2.61},{\"duration\":12,\"tweenEasing\":0,\"x\":9.85,\"y\":0.52},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":57.33},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.62},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-161.51},{\"duration\":3,\"tweenEasing\":0,\"rotate\":177.69},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-129.73},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-7.29},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":57.33},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.62},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-161.51},{\"duration\":3,\"tweenEasing\":0,\"rotate\":177.69},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-129.73},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-7.29},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":57.33},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.62},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-161.51},{\"duration\":3,\"tweenEasing\":0,\"rotate\":177.69},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-129.73},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-7.29},{\"duration\":0}],\"scaleFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":1.1,\"y\":1.1},{\"duration\":3,\"tweenEasing\":0,\"x\":1.1},{\"duration\":39,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":1.1,\"y\":1.1},{\"duration\":3,\"tweenEasing\":0,\"x\":1.1},{\"duration\":39,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":1.1,\"y\":1.1},{\"duration\":3,\"tweenEasing\":0,\"x\":1.1},{\"duration\":15}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":11.17,\"y\":11.95},{\"duration\":3,\"tweenEasing\":0,\"x\":17.87,\"y\":16.22},{\"duration\":15,\"tweenEasing\":0,\"x\":-17.67,\"y\":1.23},{\"duration\":3,\"tweenEasing\":0,\"x\":-18.56,\"y\":-2},{\"duration\":3,\"tweenEasing\":0,\"x\":-8.49,\"y\":-0.72},{\"duration\":12,\"tweenEasing\":0,\"x\":9.18,\"y\":7.81},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":11.17,\"y\":11.95},{\"duration\":3,\"tweenEasing\":0,\"x\":17.87,\"y\":16.22},{\"duration\":15,\"tweenEasing\":0,\"x\":-17.67,\"y\":1.23},{\"duration\":3,\"tweenEasing\":0,\"x\":-18.56,\"y\":-2},{\"duration\":3,\"tweenEasing\":0,\"x\":-8.49,\"y\":-0.72},{\"duration\":12,\"tweenEasing\":0,\"x\":9.18,\"y\":7.81},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":11.17,\"y\":11.95},{\"duration\":3,\"tweenEasing\":0,\"x\":17.87,\"y\":16.22},{\"duration\":15,\"tweenEasing\":0,\"x\":-17.67,\"y\":1.23},{\"duration\":3,\"tweenEasing\":0,\"x\":-18.56,\"y\":-2},{\"duration\":3,\"tweenEasing\":0,\"x\":-8.49,\"y\":-0.72},{\"duration\":12,\"tweenEasing\":0,\"x\":9.18,\"y\":7.81},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":5.13},{\"duration\":3,\"tweenEasing\":0,\"rotate\":4.91},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-41.98},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.02},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-19.11},{\"duration\":12,\"tweenEasing\":0,\"rotate\":0.01},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":5.13},{\"duration\":3,\"tweenEasing\":0,\"rotate\":4.91},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-41.98},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.02},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-19.11},{\"duration\":12,\"tweenEasing\":0,\"rotate\":0.01},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":5.13},{\"duration\":3,\"tweenEasing\":0,\"rotate\":4.91},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-41.98},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.02},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-19.11},{\"duration\":12,\"tweenEasing\":0,\"rotate\":0.01},{\"duration\":0}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":7.13,\"y\":4.46},{\"duration\":3,\"tweenEasing\":0,\"x\":10.32,\"y\":7.06},{\"duration\":15,\"tweenEasing\":0,\"x\":-22.31,\"y\":-2.2},{\"duration\":3,\"tweenEasing\":0,\"x\":-20.91,\"y\":-5.68},{\"duration\":3,\"tweenEasing\":0,\"x\":-8.89,\"y\":-0.87},{\"duration\":12,\"tweenEasing\":0,\"x\":6.95,\"y\":5.43},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":7.13,\"y\":4.46},{\"duration\":3,\"tweenEasing\":0,\"x\":10.32,\"y\":7.06},{\"duration\":15,\"tweenEasing\":0,\"x\":-22.31,\"y\":-2.2},{\"duration\":3,\"tweenEasing\":0,\"x\":-20.91,\"y\":-5.68},{\"duration\":3,\"tweenEasing\":0,\"x\":-8.89,\"y\":-0.87},{\"duration\":12,\"tweenEasing\":0,\"x\":6.95,\"y\":5.43},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":7.13,\"y\":4.46},{\"duration\":3,\"tweenEasing\":0,\"x\":10.32,\"y\":7.06},{\"duration\":15,\"tweenEasing\":0,\"x\":-22.31,\"y\":-2.2},{\"duration\":3,\"tweenEasing\":0,\"x\":-20.91,\"y\":-5.68},{\"duration\":3,\"tweenEasing\":0,\"x\":-8.89,\"y\":-0.87},{\"duration\":12,\"tweenEasing\":0,\"x\":6.95,\"y\":5.43},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-41.75},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-5.66},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-45.17},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-39.69},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-53.59},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-18.74},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-41.75},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-5.66},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-45.17},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-39.69},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-53.59},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-18.74},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-41.75},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-5.66},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-45.17},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-39.69},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-53.59},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-18.74},{\"duration\":0}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.89,\"y\":3.28},{\"duration\":3,\"tweenEasing\":0,\"x\":0.05,\"y\":2.17},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.88,\"y\":-1.42},{\"duration\":6,\"tweenEasing\":0,\"x\":-3.36,\"y\":-0.99},{\"duration\":3,\"tweenEasing\":0,\"x\":-3.68,\"y\":-0.7},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.23,\"y\":-0.74},{\"duration\":12,\"tweenEasing\":0,\"x\":0.1,\"y\":2.23},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.89,\"y\":3.28},{\"duration\":3,\"tweenEasing\":0,\"x\":0.05,\"y\":2.17},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.88,\"y\":-1.42},{\"duration\":6,\"tweenEasing\":0,\"x\":-3.36,\"y\":-0.99},{\"duration\":3,\"tweenEasing\":0,\"x\":-3.68,\"y\":-0.7},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.23,\"y\":-0.74},{\"duration\":12,\"tweenEasing\":0,\"x\":0.1,\"y\":2.23},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.89,\"y\":3.28},{\"duration\":3,\"tweenEasing\":0,\"x\":0.05,\"y\":2.17},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.88,\"y\":-1.42},{\"duration\":6,\"tweenEasing\":0,\"x\":-3.36,\"y\":-0.99},{\"duration\":3,\"tweenEasing\":0,\"x\":-3.68,\"y\":-0.7},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.23,\"y\":-0.74},{\"duration\":12,\"tweenEasing\":0,\"x\":0.1,\"y\":2.23},{\"duration\":0}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":18.08},{\"duration\":3,\"tweenEasing\":0,\"rotate\":32.5},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-28.34},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-25.65},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-23.86},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-17.88},{\"duration\":12,\"tweenEasing\":0,\"rotate\":17.51},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":18.08},{\"duration\":3,\"tweenEasing\":0,\"rotate\":32.5},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-28.34},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-25.65},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-23.86},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-17.88},{\"duration\":12,\"tweenEasing\":0,\"rotate\":17.51},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":18.08},{\"duration\":3,\"tweenEasing\":0,\"rotate\":32.5},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-28.34},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-25.65},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-23.86},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-17.88},{\"duration\":12,\"tweenEasing\":0,\"rotate\":17.51},{\"duration\":0}],\"scaleFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.01,\"y\":1.06},{\"duration\":3,\"tweenEasing\":0,\"x\":1.02,\"y\":1.09},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.02,\"y\":1.02},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.01,\"y\":1.06},{\"duration\":3,\"tweenEasing\":0,\"x\":1.02,\"y\":1.09},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.02,\"y\":1.02},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.01,\"y\":1.06},{\"duration\":3,\"tweenEasing\":0,\"x\":1.02,\"y\":1.09},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.02,\"y\":1.02},{\"duration\":0}]},{\"name\":\"leg\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"y\":0.48},{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"y\":-0.64},{\"duration\":3,\"tweenEasing\":0,\"y\":-0.64},{\"duration\":27,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"y\":0.48},{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"y\":-0.64},{\"duration\":3,\"tweenEasing\":0,\"y\":-0.64},{\"duration\":27,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"y\":0.48},{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"y\":-0.64},{\"duration\":3,\"tweenEasing\":0,\"y\":-0.64},{\"duration\":15}],\"scaleFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.9,\"y\":1.2},{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":1.2},{\"duration\":3,\"tweenEasing\":0,\"x\":1.2},{\"duration\":27,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.9,\"y\":1.2},{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":1.2},{\"duration\":3,\"tweenEasing\":0,\"x\":1.2},{\"duration\":27,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.9,\"y\":1.2},{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":1.2},{\"duration\":3,\"tweenEasing\":0,\"x\":1.2},{\"duration\":15}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.53,\"y\":-0.76},{\"duration\":3,\"tweenEasing\":0,\"x\":-2.61,\"y\":-1.24},{\"duration\":18,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":12,\"tweenEasing\":0,\"x\":-2.41,\"y\":-0.33},{\"duration\":6,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.53,\"y\":-0.76},{\"duration\":3,\"tweenEasing\":0,\"x\":-2.61,\"y\":-1.24},{\"duration\":18,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":12,\"tweenEasing\":0,\"x\":-2.41,\"y\":-0.33},{\"duration\":6,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.53,\"y\":-0.76},{\"duration\":3,\"tweenEasing\":0,\"x\":-2.61,\"y\":-1.24},{\"duration\":18,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":12,\"tweenEasing\":0,\"x\":-2.41,\"y\":-0.33},{\"duration\":0,\"x\":-1.95,\"y\":-1.15}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-31.82},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.66},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-40.03},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-30.35},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-57.07},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-0.66},{\"duration\":6,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":15,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-31.82},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.66},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-40.03},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-40.03},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-57.07},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-0.66},{\"duration\":6,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":15,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-31.82},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.66},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-40.03},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-40.03},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-57.07},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-0.66},{\"duration\":0,\"rotate\":11.7}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.2,\"y\":-0.16},{\"duration\":3,\"tweenEasing\":0,\"x\":3.12,\"y\":-3.07},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.09,\"y\":1.77},{\"duration\":3,\"tweenEasing\":0,\"x\":0.54,\"y\":1.17},{\"duration\":3,\"tweenEasing\":0,\"x\":0.54,\"y\":1.17},{\"duration\":12,\"tweenEasing\":0,\"x\":1.24,\"y\":-3.23},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.2,\"y\":-0.16},{\"duration\":3,\"tweenEasing\":0,\"x\":3.12,\"y\":-3.07},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.09,\"y\":1.77},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.09,\"y\":1.77},{\"duration\":3,\"tweenEasing\":0,\"x\":0.54,\"y\":1.17},{\"duration\":12,\"tweenEasing\":0,\"x\":1.24,\"y\":-3.23},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.2,\"y\":-0.16},{\"duration\":3,\"tweenEasing\":0,\"x\":3.12,\"y\":-3.07},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.09,\"y\":1.77},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.09,\"y\":1.77},{\"duration\":3,\"tweenEasing\":0,\"x\":0.54,\"y\":1.17},{\"duration\":12,\"tweenEasing\":0,\"x\":1.24,\"y\":-3.23},{\"duration\":0,\"x\":-0.3,\"y\":-0.01}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-53.33},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-61.03},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-60.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-42.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.53},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-48.05},{\"duration\":6,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":15,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-53.33},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-61.03},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-60.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-55.76},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.53},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-48.05},{\"duration\":6,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":15,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-53.33},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-61.03},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-60.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-55.76},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-28.53},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-48.05},{\"duration\":0,\"rotate\":21.7}],\"scaleFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.07,\"y\":1.07},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.06,\"y\":1.06},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.07,\"y\":1.07},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.06,\"y\":1.06},{\"duration\":6,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.07,\"y\":1.07},{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.06,\"y\":1.06},{\"duration\":0}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":3,\"tweenEasing\":0,\"x\":7.03,\"y\":0.57},{\"duration\":3,\"tweenEasing\":0,\"x\":8.46,\"y\":4.38},{\"duration\":15,\"tweenEasing\":0,\"x\":-9.94,\"y\":-5.59},{\"duration\":3,\"tweenEasing\":0,\"x\":-10.56,\"y\":-6.78},{\"duration\":3,\"tweenEasing\":0,\"x\":-7.33,\"y\":-0.7},{\"duration\":12,\"tweenEasing\":0,\"x\":4.31,\"y\":3.25},{\"duration\":6,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":15,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":3,\"tweenEasing\":0,\"x\":7.03,\"y\":0.57},{\"duration\":3,\"tweenEasing\":0,\"x\":8.46,\"y\":4.38},{\"duration\":15,\"tweenEasing\":0,\"x\":-9.94,\"y\":-5.59},{\"duration\":3,\"tweenEasing\":0,\"x\":-10.56,\"y\":-6.78},{\"duration\":3,\"tweenEasing\":0,\"x\":-7.33,\"y\":-0.7},{\"duration\":12,\"tweenEasing\":0,\"x\":4.31,\"y\":3.25},{\"duration\":6,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":15,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":3,\"tweenEasing\":0,\"x\":7.03,\"y\":0.57},{\"duration\":3,\"tweenEasing\":0,\"x\":8.46,\"y\":4.38},{\"duration\":15,\"tweenEasing\":0,\"x\":-9.94,\"y\":-5.59},{\"duration\":3,\"tweenEasing\":0,\"x\":-10.56,\"y\":-6.78},{\"duration\":3,\"tweenEasing\":0,\"x\":-7.33,\"y\":-0.7},{\"duration\":12,\"tweenEasing\":0,\"x\":4.31,\"y\":3.25},{\"duration\":0,\"x\":1.76,\"y\":2.48}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":3,\"tweenEasing\":0,\"rotate\":108.8},{\"duration\":3,\"tweenEasing\":0,\"rotate\":68.96},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-61.71},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-119.79},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-76.68},{\"duration\":12,\"tweenEasing\":0,\"rotate\":31.95},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":3,\"tweenEasing\":0,\"rotate\":108.8},{\"duration\":3,\"tweenEasing\":0,\"rotate\":68.96},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-61.71},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-119.79},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-76.68},{\"duration\":12,\"tweenEasing\":0,\"rotate\":31.95},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":3,\"tweenEasing\":0,\"rotate\":108.8},{\"duration\":3,\"tweenEasing\":0,\"rotate\":68.96},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-61.71},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-119.79},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-76.68},{\"duration\":12,\"tweenEasing\":0,\"rotate\":31.95},{\"duration\":0,\"rotate\":-6.67}],\"scaleFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":1.1,\"y\":-1.1},{\"duration\":3,\"tweenEasing\":0,\"x\":1.2,\"y\":-1.1},{\"duration\":3,\"tweenEasing\":0,\"y\":-1},{\"duration\":36,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":1.1,\"y\":-1.1},{\"duration\":3,\"tweenEasing\":0,\"x\":1.2,\"y\":-1.1},{\"duration\":3,\"tweenEasing\":0,\"y\":-1},{\"duration\":36,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":1.1,\"y\":-1.1},{\"duration\":3,\"tweenEasing\":0,\"x\":1.2,\"y\":-1.1},{\"duration\":3,\"tweenEasing\":0,\"y\":-1},{\"duration\":12}]}],\"slot\":[{\"name\":\"effect5\",\"displayFrame\":[{\"duration\":18,\"value\":-1},{\"duration\":156},{\"duration\":0,\"value\":-1}],\"colorFrame\":[{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":3,\"value\":{\"aM\":0}}]},{\"name\":\"effect4\",\"displayFrame\":[{\"duration\":12,\"value\":-1},{\"duration\":159},{\"duration\":3,\"value\":-1}],\"colorFrame\":[{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":6,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"displayFrame\":[{\"duration\":9,\"value\":-1},{\"duration\":162},{\"duration\":3,\"value\":-1}],\"colorFrame\":[{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":6,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"displayFrame\":[{\"duration\":6,\"value\":-1},{\"duration\":162},{\"duration\":6,\"value\":-1}],\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"rightHand\",\"displayFrame\":[{\"duration\":21},{\"duration\":18,\"value\":-1},{\"duration\":42},{\"duration\":18,\"value\":-1},{\"duration\":42},{\"duration\":18,\"value\":-1},{\"duration\":15}],\"colorFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":42,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":39,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15}]},{\"name\":\"rightFrontArm\",\"displayFrame\":[{\"duration\":21},{\"duration\":18,\"value\":-1},{\"duration\":42},{\"duration\":18,\"value\":-1},{\"duration\":42},{\"duration\":18,\"value\":-1},{\"duration\":15}],\"colorFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":42,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":39,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15}]},{\"name\":\"backLight\",\"displayFrame\":[{\"duration\":174,\"value\":-1}]},{\"name\":\"effect6\",\"displayFrame\":[{\"duration\":174,\"value\":-1}]}]},{\"duration\":60,\"name\":\"Atk1\",\"bone\":[{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":12,\"tweenEasing\":0,\"x\":-18.2,\"y\":13.4},{\"duration\":12,\"tweenEasing\":0,\"x\":-18.2,\"y\":13.4},{\"duration\":15,\"tweenEasing\":0,\"x\":-35.6,\"y\":3.6},{\"duration\":12,\"tweenEasing\":0,\"x\":-48,\"y\":0.8},{\"duration\":9,\"x\":-61.2}],\"rotateFrame\":[{\"duration\":12,\"tweenEasing\":0,\"rotate\":-105.08},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-105.08},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-96.73},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-69.9},{\"duration\":9,\"rotate\":-94.04}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":-29.33,\"y\":21.33},{\"duration\":9,\"tweenEasing\":0,\"x\":-29.33,\"y\":21.33},{\"duration\":15,\"tweenEasing\":0,\"x\":-46.13,\"y\":12},{\"duration\":15,\"tweenEasing\":0,\"x\":-53.87,\"y\":18.93},{\"duration\":15,\"x\":-62.13,\"y\":14.67}],\"rotateFrame\":[{\"duration\":15,\"tweenEasing\":0,\"rotate\":-108.91},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-108.91},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-127.09},{\"duration\":15,\"rotate\":-108.09}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":-9.07,\"y\":26.4},{\"duration\":12,\"tweenEasing\":0,\"x\":-9.07,\"y\":26.4},{\"duration\":15,\"tweenEasing\":0,\"x\":-27.2,\"y\":5.6},{\"duration\":9,\"tweenEasing\":0,\"x\":-46.93,\"y\":-8.53},{\"duration\":18,\"x\":-54.93,\"y\":-10.93}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"rotate\":31.2},{\"duration\":12,\"tweenEasing\":0,\"rotate\":31.2},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-0.05},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-26.91},{\"duration\":18,\"rotate\":-24.71}]},{\"name\":\"leftHand\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":0.03,\"y\":0.14},{\"duration\":15,\"tweenEasing\":0,\"x\":0.03,\"y\":0.14},{\"duration\":12,\"tweenEasing\":0,\"x\":0.21,\"y\":0.98},{\"duration\":0}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-12.3},{\"duration\":12,\"tweenEasing\":0,\"rotate\":18.53},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-9},{\"duration\":12,\"tweenEasing\":0,\"rotate\":9.5},{\"duration\":0}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.43,\"y\":0.09},{\"duration\":12,\"tweenEasing\":0,\"x\":0.37,\"y\":0.24},{\"duration\":15,\"tweenEasing\":0,\"x\":1.38,\"y\":-1.56},{\"duration\":12,\"tweenEasing\":0,\"x\":0.39,\"y\":0.48},{\"duration\":0}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":13.83},{\"duration\":12,\"tweenEasing\":0,\"rotate\":25.06},{\"duration\":15,\"tweenEasing\":0,\"rotate\":17.69},{\"duration\":12,\"tweenEasing\":0,\"rotate\":12.39},{\"duration\":0}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-5.77,\"y\":-1.21},{\"duration\":12,\"tweenEasing\":0,\"x\":16.81,\"y\":-1.49},{\"duration\":15,\"tweenEasing\":0,\"x\":16.01,\"y\":-1.17},{\"duration\":12,\"tweenEasing\":0,\"x\":2.27,\"y\":-0.45},{\"duration\":0}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":40},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-12.39},{\"duration\":15,\"tweenEasing\":0,\"rotate\":4.99},{\"duration\":12,\"tweenEasing\":0,\"rotate\":8.69},{\"duration\":0}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-6.85,\"y\":-3.89},{\"duration\":12,\"tweenEasing\":0,\"x\":25.9,\"y\":0.2},{\"duration\":15,\"tweenEasing\":0,\"x\":24.94,\"y\":0.84},{\"duration\":12,\"tweenEasing\":0,\"x\":2.99,\"y\":-4.37},{\"duration\":0}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":66.79},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-95.1},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-98.37},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-44.89},{\"duration\":0}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-8.35,\"y\":0.91},{\"duration\":12,\"tweenEasing\":0,\"x\":18.7,\"y\":3.66},{\"duration\":15,\"tweenEasing\":0,\"x\":17.58,\"y\":4.46},{\"duration\":12,\"tweenEasing\":0,\"x\":2.45,\"y\":1.81},{\"duration\":0}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":15.73},{\"duration\":12,\"tweenEasing\":0,\"rotate\":2.95},{\"duration\":15,\"tweenEasing\":0,\"rotate\":2.83},{\"duration\":12,\"tweenEasing\":0,\"rotate\":0.01},{\"duration\":0}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-7.25,\"y\":-1.47},{\"duration\":12,\"tweenEasing\":0,\"x\":12.57,\"y\":4.07},{\"duration\":15,\"tweenEasing\":0,\"x\":12.25,\"y\":4.55},{\"duration\":12,\"tweenEasing\":0,\"x\":0.8,\"y\":0.69},{\"duration\":0}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.02},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-27.15},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-15.36},{\"duration\":12,\"tweenEasing\":0,\"rotate\":3.41},{\"duration\":0}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-2.93,\"y\":-2.03},{\"duration\":12,\"tweenEasing\":0,\"x\":2.55,\"y\":-0.18},{\"duration\":15,\"tweenEasing\":0,\"x\":2.87,\"y\":0.46},{\"duration\":12,\"tweenEasing\":0,\"y\":0.8},{\"duration\":0}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-11.15},{\"duration\":12,\"tweenEasing\":0,\"rotate\":29.43},{\"duration\":15,\"tweenEasing\":0,\"rotate\":30.7},{\"duration\":12,\"tweenEasing\":0,\"rotate\":1.09},{\"duration\":0}],\"scaleFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.01,\"y\":1.01},{\"duration\":12,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":1.03,\"y\":1.03},{\"duration\":0}]},{\"name\":\"leg\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"y\":-0.05},{\"duration\":6,\"tweenEasing\":0,\"y\":-0.05},{\"duration\":6,\"tweenEasing\":0,\"y\":-0.32},{\"duration\":3,\"tweenEasing\":0,\"y\":-0.32},{\"duration\":0}],\"scaleFrame\":[{\"duration\":12,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.1,\"y\":1.3},{\"duration\":6,\"tweenEasing\":0,\"x\":1.01,\"y\":1.1},{\"duration\":6,\"tweenEasing\":0,\"x\":1.01,\"y\":1.1},{\"duration\":12,\"tweenEasing\":0,\"x\":1.01,\"y\":0.9},{\"duration\":6,\"tweenEasing\":0,\"x\":1.01,\"y\":0.9},{\"duration\":6,\"tweenEasing\":0,\"x\":1.1,\"y\":1.1},{\"duration\":3,\"tweenEasing\":0,\"x\":1.1,\"y\":1.1},{\"duration\":0}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-2.1,\"y\":-0.4},{\"duration\":12,\"tweenEasing\":0,\"x\":-1.95,\"y\":-0.39},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.95,\"y\":-0.39},{\"duration\":12,\"tweenEasing\":0,\"x\":-1.08,\"y\":-0.33},{\"duration\":0,\"x\":-1.95,\"y\":-1.15}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-34.26},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-8.09},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-36.51},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-12.04},{\"duration\":0,\"rotate\":11.7}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.4,\"y\":0.36},{\"duration\":12,\"tweenEasing\":0,\"x\":-0.68,\"y\":0.24},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.88,\"y\":0.14},{\"duration\":12,\"tweenEasing\":0,\"x\":0.62,\"y\":0.51},{\"duration\":0,\"x\":-0.3,\"y\":-0.01}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-36.51},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-41.51},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-50.9},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-42.18},{\"duration\":0,\"rotate\":21.7}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":3,\"tweenEasing\":0,\"x\":-5.92,\"y\":-0.64},{\"duration\":12,\"tweenEasing\":0,\"x\":2.79,\"y\":7.74},{\"duration\":15,\"tweenEasing\":0,\"x\":2.95,\"y\":8.38},{\"duration\":12,\"tweenEasing\":0,\"x\":-7.65,\"y\":-6.15},{\"duration\":0,\"x\":1.76,\"y\":2.48}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":3,\"tweenEasing\":0,\"rotate\":8.81},{\"duration\":12,\"tweenEasing\":0,\"rotate\":7.26},{\"duration\":15,\"tweenEasing\":0,\"rotate\":15.7},{\"duration\":12,\"tweenEasing\":0,\"rotate\":25.83},{\"duration\":0,\"rotate\":-6.67}]}],\"slot\":[{\"name\":\"effect4\",\"displayFrame\":[{\"duration\":12,\"value\":-1},{\"duration\":42},{\"duration\":6,\"value\":-1}],\"colorFrame\":[{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"displayFrame\":[{\"duration\":6,\"value\":-1},{\"duration\":42},{\"duration\":12,\"value\":-1}],\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"displayFrame\":[{\"duration\":6,\"value\":-1},{\"duration\":39},{\"duration\":15,\"value\":-1}],\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":18,\"value\":{\"aM\":0}}]},{\"name\":\"backLight\",\"displayFrame\":[{\"duration\":60,\"value\":-1}]},{\"name\":\"effect5\",\"displayFrame\":[{\"duration\":60,\"value\":-1}]},{\"name\":\"effect6\",\"displayFrame\":[{\"duration\":60,\"value\":-1}]}]},{\"duration\":18,\"name\":\"Atked1\",\"bone\":[{\"name\":\"effect6\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":-5.03,\"y\":3.43},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.32,\"y\":-0.45},{\"duration\":6,\"tweenEasing\":0,\"x\":6.49,\"y\":-2.74},{\"duration\":3,\"x\":9.6,\"y\":-12.57}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"rotate\":-20.99}]},{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":3,\"tweenEasing\":0,\"x\":-9,\"y\":7.6},{\"duration\":3,\"tweenEasing\":0,\"x\":-9,\"y\":7.6},{\"duration\":3,\"tweenEasing\":0,\"x\":-20.26,\"y\":-2.26},{\"duration\":9,\"tweenEasing\":0,\"x\":-23.68,\"y\":-12.6},{\"duration\":0,\"x\":-48,\"y\":-32.6}],\"rotateFrame\":[{\"duration\":3,\"tweenEasing\":0,\"rotate\":-9.48},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-9.48},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-12.21},{\"duration\":9,\"rotate\":-14.93}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":-7.36,\"y\":10.88},{\"duration\":3,\"tweenEasing\":0,\"x\":-1.52,\"y\":-14.48},{\"duration\":6,\"tweenEasing\":0,\"x\":3.68,\"y\":-18.72},{\"duration\":3,\"x\":13.12,\"y\":-27.2}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-20.49},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-21.44},{\"duration\":3,\"rotate\":-23.34}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":5.44,\"y\":1.92},{\"duration\":3,\"tweenEasing\":0,\"x\":-12.08,\"y\":-14.48},{\"duration\":9,\"tweenEasing\":0,\"x\":-13.46,\"y\":-17.74},{\"duration\":0,\"x\":-18.88,\"y\":-27.52}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":55.47},{\"duration\":9,\"tweenEasing\":0,\"rotate\":51.89},{\"duration\":0,\"rotate\":41.14}]},{\"name\":\"leftHand\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":0.01,\"y\":-0.45},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-26.56},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-11.41},{\"duration\":0}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":0.37,\"y\":0.2},{\"duration\":9,\"tweenEasing\":0,\"x\":0.37,\"y\":0.2},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":6.05},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-2.27},{\"duration\":0}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-6.31,\"y\":4.6},{\"duration\":9,\"tweenEasing\":0,\"x\":-7.03,\"y\":3.4},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":22.93},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-13.8},{\"duration\":0}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-6.32,\"y\":2.11},{\"duration\":9,\"tweenEasing\":0,\"x\":-4.59,\"y\":0.88},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-15.21},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-28.28},{\"duration\":0}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-5.95,\"y\":5.81},{\"duration\":9,\"tweenEasing\":0,\"x\":-4.61,\"y\":1.44},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":20.08},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-25.26},{\"duration\":0}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-6.05,\"y\":0.53},{\"duration\":9,\"tweenEasing\":0,\"x\":-5.11,\"y\":-0.59},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-17.61},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-22.45},{\"duration\":0}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-4.19,\"y\":2.37},{\"duration\":9,\"tweenEasing\":0,\"x\":0.8,\"y\":1.76},{\"duration\":0}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-5.23},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-13.28},{\"duration\":0}],\"scaleFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":1.01,\"y\":1.01},{\"duration\":9,\"tweenEasing\":0,\"x\":1.01,\"y\":1.01},{\"duration\":0}]},{\"name\":\"leg\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0,\"x\":-3.28,\"y\":0.24},{\"duration\":9,\"tweenEasing\":0,\"x\":0.64,\"y\":-0.08},{\"duration\":0}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":3,\"tweenEasing\":0,\"x\":-2.1,\"y\":-0.4},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.1,\"y\":-0.4},{\"duration\":0,\"x\":-1.95,\"y\":-1.15}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":13.63},{\"duration\":9,\"tweenEasing\":0,\"rotate\":6.92},{\"duration\":0,\"rotate\":11.7}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":3,\"tweenEasing\":0,\"x\":0.44,\"y\":-0.72},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.89,\"y\":0.2},{\"duration\":0,\"x\":-0.3,\"y\":-0.01}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-6.33},{\"duration\":9,\"tweenEasing\":0,\"rotate\":14.55},{\"duration\":0,\"rotate\":21.7}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":3,\"tweenEasing\":0,\"x\":-4.96,\"y\":5.17},{\"duration\":9,\"tweenEasing\":0,\"x\":-3.87,\"y\":1.92},{\"duration\":0,\"x\":1.76,\"y\":2.48}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-17.02},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-28.28},{\"duration\":0,\"rotate\":-6.67}]}],\"slot\":[{\"name\":\"effect6\",\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":66}},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"tweenEasing\":0},{\"duration\":0,\"value\":{\"aM\":0}}]},{\"name\":\"effect4\",\"colorFrame\":[{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":49}},{\"duration\":9,\"tweenEasing\":0},{\"duration\":0,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"colorFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":3,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":0,\"value\":{\"aM\":0}}]},{\"name\":\"backLight\",\"displayFrame\":[{\"duration\":18,\"value\":-1}]},{\"name\":\"effect5\",\"displayFrame\":[{\"duration\":18,\"value\":-1}]}]},{\"duration\":78,\"name\":\"Dying\",\"bone\":[{\"name\":\"effect5\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"x\":14.4,\"y\":3.43},{\"duration\":18,\"tweenEasing\":0,\"x\":14.4,\"y\":3.43},{\"duration\":15,\"tweenEasing\":0,\"x\":6.4,\"y\":-10.29},{\"duration\":15,\"tweenEasing\":0,\"x\":8.46,\"y\":-23.09},{\"duration\":6,\"x\":1.14,\"y\":-32.46}],\"rotateFrame\":[{\"duration\":42,\"tweenEasing\":0,\"rotate\":30.08},{\"duration\":15,\"tweenEasing\":0,\"rotate\":30.08},{\"duration\":15,\"tweenEasing\":0,\"rotate\":46.89},{\"duration\":6,\"rotate\":26.37}]},{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"x\":-3.2,\"y\":1.6},{\"duration\":15,\"tweenEasing\":0,\"x\":-3.2,\"y\":1.6},{\"duration\":18,\"tweenEasing\":0,\"x\":0.23,\"y\":-24.23},{\"duration\":18,\"tweenEasing\":0,\"x\":-8.69,\"y\":-39.54},{\"duration\":9,\"x\":-11.61,\"y\":-48.32}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0,\"rotate\":20.94},{\"duration\":15,\"tweenEasing\":0,\"rotate\":20.94},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-3.4},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-10.49},{\"duration\":9,\"rotate\":-4.63}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":27,\"tweenEasing\":0,\"x\":-6.13,\"y\":22.4},{\"duration\":12,\"tweenEasing\":0,\"x\":-6.13,\"y\":22.4},{\"duration\":18,\"tweenEasing\":0,\"x\":-2.76,\"y\":-4.89},{\"duration\":12,\"tweenEasing\":0,\"x\":8.89,\"y\":-19.64},{\"duration\":9,\"x\":22.49,\"y\":-23.38}],\"rotateFrame\":[{\"duration\":27,\"tweenEasing\":0,\"rotate\":31.61},{\"duration\":12,\"tweenEasing\":0,\"rotate\":31.61},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-12.51},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-13.38},{\"duration\":9,\"rotate\":9.35}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":4,\"y\":6.13},{\"duration\":9,\"tweenEasing\":0,\"x\":4,\"y\":6.13},{\"duration\":9,\"tweenEasing\":0,\"x\":1.07,\"y\":-7.73},{\"duration\":15,\"tweenEasing\":0,\"x\":-13.07,\"y\":-20.27},{\"duration\":24,\"x\":-40.53,\"y\":-29.6}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":29.59},{\"duration\":15,\"tweenEasing\":0,\"rotate\":2.18},{\"duration\":24,\"rotate\":-22.33}]},{\"name\":\"leftHand\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":0.1,\"y\":0.47},{\"duration\":6,\"tweenEasing\":0,\"x\":0.1,\"y\":0.47},{\"duration\":9,\"tweenEasing\":0,\"x\":0.3,\"y\":-0.43},{\"duration\":3,\"tweenEasing\":0,\"x\":0.3,\"y\":-0.43},{\"duration\":42,\"x\":-0.66,\"y\":-0.09}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-7.81},{\"duration\":3,\"tweenEasing\":0,\"rotate\":3.01},{\"duration\":6,\"tweenEasing\":0,\"rotate\":3.01},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-18.54},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-18.54},{\"duration\":24,\"tweenEasing\":0,\"rotate\":6.38},{\"duration\":6,\"tweenEasing\":0,\"rotate\":6.38},{\"duration\":12,\"rotate\":11.01}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":1.36,\"y\":-1.9},{\"duration\":6,\"tweenEasing\":0,\"x\":1.36,\"y\":-1.9},{\"duration\":9,\"tweenEasing\":0,\"x\":1.29,\"y\":-2.29},{\"duration\":3,\"tweenEasing\":0,\"x\":1.29,\"y\":-2.29},{\"duration\":15,\"tweenEasing\":0,\"x\":0.3,\"y\":0.3},{\"duration\":9,\"tweenEasing\":0,\"x\":-1.66,\"y\":1.87},{\"duration\":6,\"tweenEasing\":0,\"x\":1.28,\"y\":-7.25},{\"duration\":12,\"x\":0.98,\"y\":-8.17}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-33.88},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-26.38},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-26.38},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-47.87},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-65.3},{\"duration\":15,\"tweenEasing\":0,\"rotate\":46.32},{\"duration\":9,\"tweenEasing\":0,\"rotate\":15},{\"duration\":6,\"tweenEasing\":0,\"rotate\":113.18},{\"duration\":12,\"rotate\":106.03}],\"scaleFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":69,\"x\":1.05,\"y\":1.05}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":7.84,\"y\":0.44},{\"duration\":3,\"tweenEasing\":0,\"x\":7.31,\"y\":-0.39},{\"duration\":6,\"tweenEasing\":0,\"x\":7.31,\"y\":0.09},{\"duration\":9,\"tweenEasing\":0,\"x\":10.95,\"y\":1.85},{\"duration\":3,\"tweenEasing\":0,\"x\":10.69,\"y\":-1.88},{\"duration\":15,\"tweenEasing\":0,\"x\":-2.01,\"y\":-11.67},{\"duration\":9,\"tweenEasing\":0,\"x\":-9.21,\"y\":-16.87},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.41,\"y\":38.01},{\"duration\":12,\"tweenEasing\":0,\"x\":-3.29,\"y\":34.33},{\"duration\":0,\"x\":-3.29,\"y\":37.53}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":13.57},{\"duration\":3,\"tweenEasing\":0,\"rotate\":24.2},{\"duration\":6,\"tweenEasing\":0,\"rotate\":16.88},{\"duration\":9,\"tweenEasing\":0,\"rotate\":10.9},{\"duration\":3,\"tweenEasing\":0,\"rotate\":16.99},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-5.17},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-12.82},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-8.56},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-2.65},{\"duration\":0,\"rotate\":-7.04}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":6.76,\"y\":-4.62},{\"duration\":3,\"tweenEasing\":0,\"x\":6.76,\"y\":-5.1},{\"duration\":6,\"tweenEasing\":0,\"x\":6.76,\"y\":-4.62},{\"duration\":9,\"tweenEasing\":0,\"x\":12.09,\"y\":-1.76},{\"duration\":3,\"tweenEasing\":0,\"x\":11.83,\"y\":-5.49},{\"duration\":15,\"tweenEasing\":0,\"x\":0.87,\"y\":-11.81},{\"duration\":9,\"tweenEasing\":0,\"x\":2.47,\"y\":-1.81},{\"duration\":6,\"tweenEasing\":0,\"x\":2.87,\"y\":28.27},{\"duration\":12,\"tweenEasing\":0,\"x\":1.27,\"y\":25.87},{\"duration\":0,\"x\":1.59,\"y\":27.47}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":0.58},{\"duration\":3,\"tweenEasing\":0,\"rotate\":4.94},{\"duration\":6,\"tweenEasing\":0,\"rotate\":4.94},{\"duration\":9,\"tweenEasing\":0,\"rotate\":10.19},{\"duration\":3,\"tweenEasing\":0,\"rotate\":25.77},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-11.12},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-2.99},{\"duration\":18,\"rotate\":-14.6}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":8.19,\"y\":6.12},{\"duration\":3,\"tweenEasing\":0,\"x\":7.71,\"y\":5.8},{\"duration\":6,\"tweenEasing\":0,\"x\":7.71,\"y\":6.28},{\"duration\":9,\"tweenEasing\":0,\"x\":8.92,\"y\":10.46},{\"duration\":3,\"tweenEasing\":0,\"x\":9.58,\"y\":11.39},{\"duration\":15,\"tweenEasing\":0,\"x\":-2.71,\"y\":-14.39},{\"duration\":9,\"tweenEasing\":0,\"x\":-1.24,\"y\":-22.13},{\"duration\":6,\"tweenEasing\":0,\"x\":-2.2,\"y\":36.6},{\"duration\":12,\"tweenEasing\":0,\"x\":-5.08,\"y\":33.88},{\"duration\":0,\"x\":0.04,\"y\":42.84}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":29.23},{\"duration\":3,\"tweenEasing\":0,\"rotate\":8.49},{\"duration\":6,\"tweenEasing\":0,\"rotate\":13.15},{\"duration\":9,\"tweenEasing\":0,\"rotate\":15.69},{\"duration\":3,\"tweenEasing\":0,\"rotate\":15.69},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-29.7},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-25.43},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-25.43},{\"duration\":12,\"tweenEasing\":0,\"rotate\":11.43},{\"duration\":0,\"rotate\":-13.96}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":6.06,\"y\":1.67},{\"duration\":3,\"tweenEasing\":0,\"x\":6.06,\"y\":1.19},{\"duration\":6,\"tweenEasing\":0,\"x\":6.06,\"y\":1.67},{\"duration\":9,\"tweenEasing\":0,\"x\":6.79,\"y\":3.11},{\"duration\":3,\"tweenEasing\":0,\"x\":6.52,\"y\":-1.69},{\"duration\":15,\"tweenEasing\":0,\"x\":-5.18,\"y\":-17.07},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.38,\"y\":-13.87},{\"duration\":6,\"tweenEasing\":0,\"x\":-2.38,\"y\":32.61},{\"duration\":12,\"tweenEasing\":0,\"x\":-0.46,\"y\":33.73},{\"duration\":0,\"x\":-0.46,\"y\":38.53}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-2.21},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-17.5},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-5.8},{\"duration\":9,\"tweenEasing\":0,\"rotate\":7.6},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-0.59},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-0.22},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-16.47},{\"duration\":6,\"tweenEasing\":0,\"rotate\":20.03},{\"duration\":12,\"rotate\":10.97}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.18,\"y\":0.49},{\"duration\":3,\"tweenEasing\":0,\"x\":-0.34,\"y\":0.17},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.34,\"y\":0.65},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.18,\"y\":2.25},{\"duration\":3,\"tweenEasing\":0,\"x\":-0.44,\"y\":-1.48},{\"duration\":15,\"tweenEasing\":0,\"x\":2.36,\"y\":-14.52},{\"duration\":9,\"tweenEasing\":0,\"x\":3.29,\"y\":-8.39},{\"duration\":6,\"tweenEasing\":0,\"x\":9.96,\"y\":24.76},{\"duration\":12,\"tweenEasing\":0,\"x\":10.6,\"y\":19.16},{\"duration\":0,\"x\":10.92,\"y\":21.4}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":18.08},{\"duration\":6,\"tweenEasing\":0,\"rotate\":18.08},{\"duration\":9,\"tweenEasing\":0,\"rotate\":21.06},{\"duration\":3,\"tweenEasing\":0,\"rotate\":22.64},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-10.59},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-22.36},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-49.93},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-57.44},{\"duration\":0,\"rotate\":-66.41}],\"scaleFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":1.01,\"y\":1.06},{\"duration\":3,\"tweenEasing\":0,\"x\":1.01,\"y\":0.96},{\"duration\":6,\"tweenEasing\":0,\"x\":1.01,\"y\":0.96},{\"duration\":9,\"tweenEasing\":0,\"x\":1.01,\"y\":1.06},{\"duration\":3,\"tweenEasing\":0,\"x\":1.01,\"y\":1.16},{\"duration\":15,\"tweenEasing\":0},{\"duration\":27,\"y\":0.9}]},{\"name\":\"leg\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.84},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.84},{\"duration\":3,\"tweenEasing\":0,\"x\":-0.52,\"y\":-0.64},{\"duration\":15,\"tweenEasing\":0,\"x\":-0.52,\"y\":-3.84},{\"duration\":6,\"tweenEasing\":0,\"x\":-0.52,\"y\":-5.28},{\"duration\":21,\"x\":-0.52,\"y\":-3.52}],\"scaleFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.05,\"y\":1.25},{\"duration\":6,\"tweenEasing\":0,\"x\":0.95,\"y\":0.85},{\"duration\":9,\"tweenEasing\":0,\"x\":1.05,\"y\":1.05},{\"duration\":3,\"tweenEasing\":0,\"x\":1.25,\"y\":1.05},{\"duration\":15,\"tweenEasing\":0,\"x\":1.85,\"y\":1.05},{\"duration\":6,\"tweenEasing\":0,\"x\":2.15,\"y\":1.05},{\"duration\":21,\"x\":1.55,\"y\":1.05}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":9,\"tweenEasing\":0,\"x\":-1.53,\"y\":-0.76},{\"duration\":6,\"tweenEasing\":0,\"x\":-1.53,\"y\":-0.76},{\"duration\":27,\"tweenEasing\":0,\"x\":-2.24,\"y\":-1.59},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.24,\"y\":-1.59},{\"duration\":18,\"x\":-1.03,\"y\":-1.63}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":6,\"tweenEasing\":0,\"rotate\":23.26},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-19.83},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-19.83},{\"duration\":9,\"tweenEasing\":0,\"rotate\":23.75},{\"duration\":3,\"tweenEasing\":0,\"rotate\":20.82},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-5.18},{\"duration\":9,\"tweenEasing\":0,\"rotate\":22.15},{\"duration\":6,\"tweenEasing\":0,\"rotate\":-22.3},{\"duration\":12,\"tweenEasing\":0,\"rotate\":-45.66},{\"duration\":0,\"rotate\":-37}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":9,\"tweenEasing\":0,\"x\":-1.2,\"y\":-0.16},{\"duration\":6,\"tweenEasing\":0,\"x\":-1.2,\"y\":-0.16},{\"duration\":12,\"tweenEasing\":0,\"x\":-1.32,\"y\":-0.29},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.32,\"y\":-0.29},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.93,\"y\":-3.06},{\"duration\":6,\"tweenEasing\":0,\"x\":-6.42,\"y\":3.56},{\"duration\":12,\"tweenEasing\":0,\"x\":-5.56,\"y\":4.61},{\"duration\":0,\"x\":-7.53,\"y\":5.06}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":6,\"tweenEasing\":0,\"rotate\":59.44},{\"duration\":3,\"tweenEasing\":0,\"rotate\":75.81},{\"duration\":6,\"tweenEasing\":0,\"rotate\":75.81},{\"duration\":9,\"tweenEasing\":0,\"rotate\":75.52},{\"duration\":3,\"tweenEasing\":0,\"rotate\":94.88},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-2.28},{\"duration\":9,\"tweenEasing\":0,\"rotate\":12.05},{\"duration\":6,\"tweenEasing\":0,\"rotate\":12.5},{\"duration\":12,\"tweenEasing\":0,\"rotate\":17.33},{\"duration\":0,\"rotate\":11.94}],\"scaleFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":69,\"x\":1.05,\"y\":1.05}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":6,\"tweenEasing\":0,\"x\":7.79,\"y\":1.43},{\"duration\":3,\"tweenEasing\":0,\"x\":6.83,\"y\":0.79},{\"duration\":6,\"tweenEasing\":0,\"x\":6.83,\"y\":1.27},{\"duration\":9,\"tweenEasing\":0,\"x\":6.51,\"y\":2.87},{\"duration\":3,\"tweenEasing\":0,\"x\":6.24,\"y\":-0.86},{\"duration\":15,\"tweenEasing\":0,\"x\":-1.89,\"y\":-11.77},{\"duration\":9,\"tweenEasing\":0,\"x\":0.11,\"y\":0.9},{\"duration\":6,\"tweenEasing\":0,\"x\":-4.52,\"y\":42.14},{\"duration\":12,\"tweenEasing\":0,\"x\":-6.12,\"y\":39.74},{\"duration\":0,\"x\":-5.8,\"y\":41.34}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":6,\"tweenEasing\":0,\"rotate\":2.1},{\"duration\":3,\"tweenEasing\":0,\"rotate\":1.1},{\"duration\":6,\"tweenEasing\":0,\"rotate\":1.1},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-6.84},{\"duration\":3,\"tweenEasing\":0,\"rotate\":-18.94},{\"duration\":15,\"tweenEasing\":0,\"rotate\":15.53},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-13.72},{\"duration\":18,\"rotate\":-52.69}]},{\"name\":\"backLight\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"y\":-7.31},{\"duration\":9,\"tweenEasing\":0,\"y\":-12.8},{\"duration\":6,\"tweenEasing\":0,\"y\":-12.8},{\"duration\":27,\"x\":0.8,\"y\":-41.6}],\"scaleFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0,\"x\":0.69,\"y\":0.5},{\"duration\":9,\"tweenEasing\":0,\"x\":1.56,\"y\":1.71},{\"duration\":6,\"tweenEasing\":0,\"x\":0.6,\"y\":2.57},{\"duration\":27,\"x\":0.11,\"y\":2.79}]}],\"slot\":[{\"name\":\"effect5\",\"colorFrame\":[{\"duration\":24,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":6,\"value\":{\"aM\":0}}]},{\"name\":\"effect4\",\"colorFrame\":[{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"colorFrame\":[{\"duration\":27,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0},{\"duration\":12,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"colorFrame\":[{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":9,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":24,\"value\":{\"aM\":0}}]},{\"name\":\"leftArm\",\"colorFrame\":[{\"duration\":36,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12}]},{\"name\":\"head\",\"displayFrame\":[{\"duration\":78,\"value\":1}]},{\"name\":\"rightArm\",\"colorFrame\":[{\"duration\":36,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":12}]},{\"name\":\"backLight\",\"colorFrame\":[{\"duration\":12,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":30,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":27,\"value\":{\"aM\":0}}]},{\"name\":\"effect6\",\"displayFrame\":[{\"duration\":78,\"value\":-1}]}]},{\"duration\":72,\"playTimes\":0,\"name\":\"Atked2\",\"bone\":[{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":3,\"tweenEasing\":0,\"x\":-18.49,\"y\":6.76},{\"duration\":18,\"tweenEasing\":0,\"x\":-18.49,\"y\":6.76},{\"duration\":21,\"tweenEasing\":0,\"x\":-16,\"y\":-10.13},{\"duration\":21,\"tweenEasing\":0,\"x\":-24.71,\"y\":-24.36},{\"duration\":9,\"x\":-24.53,\"y\":-37.69}],\"rotateFrame\":[{\"duration\":3,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-28.4},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-16.18},{\"duration\":9,\"rotate\":-31.27}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0,\"x\":-1.87,\"y\":10.67},{\"duration\":24,\"tweenEasing\":0,\"x\":-1.87,\"y\":10.67},{\"duration\":21,\"tweenEasing\":0,\"x\":3.25,\"y\":-16.21},{\"duration\":18,\"tweenEasing\":0,\"x\":0.69,\"y\":-29.17},{\"duration\":0,\"x\":1.17,\"y\":-34.61}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-39.38},{\"duration\":18,\"rotate\":-22.72}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"x\":4,\"y\":-17},{\"duration\":24,\"tweenEasing\":0,\"x\":1,\"y\":-29.2},{\"duration\":3,\"x\":-0.2,\"y\":-39.8}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":29.43},{\"duration\":24,\"tweenEasing\":0,\"rotate\":65.43},{\"duration\":24,\"tweenEasing\":0,\"rotate\":44.46},{\"duration\":3,\"rotate\":60}]},{\"name\":\"leftHand\",\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":15.92},{\"duration\":24,\"tweenEasing\":0,\"rotate\":12.42},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-2.24},{\"duration\":0,\"rotate\":15.92}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"x\":-0.6,\"y\":0.39},{\"duration\":0}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":29.06},{\"duration\":24,\"tweenEasing\":0,\"rotate\":26.02},{\"duration\":24,\"tweenEasing\":0,\"rotate\":16.87},{\"duration\":0,\"rotate\":29.06}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"x\":4.11,\"y\":-1.6},{\"duration\":24,\"tweenEasing\":0,\"x\":5.47,\"y\":-1.28},{\"duration\":24,\"tweenEasing\":0,\"x\":6.08,\"y\":-1.98},{\"duration\":0,\"x\":4.11,\"y\":-1.6}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":-12.27},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-15.89},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-12.23},{\"duration\":0,\"rotate\":-12.27}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"x\":4.8,\"y\":0.91},{\"duration\":24,\"tweenEasing\":0,\"x\":4.8,\"y\":0.91},{\"duration\":24,\"tweenEasing\":0,\"x\":5.07,\"y\":1.29},{\"duration\":0,\"x\":4.8,\"y\":0.91}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":-23.09},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-31.16},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-21.98},{\"duration\":0,\"rotate\":-23.09}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"x\":4.19,\"y\":4.72},{\"duration\":24,\"tweenEasing\":0,\"x\":6.33,\"y\":5.71},{\"duration\":24,\"tweenEasing\":0,\"x\":6.14,\"y\":5.69},{\"duration\":0,\"x\":4.19,\"y\":4.72}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":27.28},{\"duration\":24,\"tweenEasing\":0,\"rotate\":21.12},{\"duration\":24,\"tweenEasing\":0,\"rotate\":18.96},{\"duration\":0,\"rotate\":27.28}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"x\":3.43,\"y\":0.23},{\"duration\":24,\"tweenEasing\":0,\"x\":5.46,\"y\":1.26},{\"duration\":24,\"tweenEasing\":0,\"x\":5.41,\"y\":0.45},{\"duration\":0,\"x\":3.43,\"y\":0.23}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":13.3},{\"duration\":24,\"tweenEasing\":0,\"rotate\":9.28},{\"duration\":24,\"tweenEasing\":0,\"rotate\":14.42},{\"duration\":0,\"rotate\":13.3}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"x\":0.23,\"y\":0.23},{\"duration\":24,\"tweenEasing\":0,\"x\":0.5,\"y\":-0.57},{\"duration\":0}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":13.71},{\"duration\":24,\"tweenEasing\":0,\"rotate\":17.86},{\"duration\":24,\"tweenEasing\":0,\"rotate\":16.11},{\"duration\":0,\"rotate\":13.71}]},{\"name\":\"leg\",\"scaleFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"y\":0.9},{\"duration\":6,\"tweenEasing\":0,\"y\":0.9},{\"duration\":18,\"tweenEasing\":0,\"x\":1.1,\"y\":0.8},{\"duration\":6,\"tweenEasing\":0,\"x\":1.1,\"y\":0.8},{\"duration\":0}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":72,\"x\":-1.95,\"y\":-1.15}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":24,\"tweenEasing\":0,\"rotate\":1.26},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-11.03},{\"duration\":0,\"rotate\":11.7}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":72,\"x\":-0.3,\"y\":-0.01}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":1.98},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-1.3},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-0.66},{\"duration\":0,\"rotate\":1.98}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"x\":6.56,\"y\":3.17},{\"duration\":24,\"tweenEasing\":0,\"x\":6.56,\"y\":3.17},{\"duration\":24,\"tweenEasing\":0,\"x\":7.09,\"y\":2.9},{\"duration\":0,\"x\":6.56,\"y\":3.17}],\"rotateFrame\":[{\"duration\":24,\"tweenEasing\":0,\"rotate\":29.2},{\"duration\":24,\"tweenEasing\":0,\"rotate\":11.66},{\"duration\":24,\"tweenEasing\":0,\"rotate\":23.61},{\"duration\":0,\"rotate\":29.2}]}],\"slot\":[{\"name\":\"effect4\",\"colorFrame\":[{\"duration\":3,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"colorFrame\":[{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":24,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":0,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"colorFrame\":[{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":24,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0},{\"duration\":3,\"value\":{\"aM\":0}}]},{\"name\":\"backLight\",\"displayFrame\":[{\"duration\":72,\"value\":-1}]},{\"name\":\"effect5\",\"displayFrame\":[{\"duration\":72,\"value\":-1}]},{\"name\":\"effect6\",\"displayFrame\":[{\"duration\":72,\"value\":-1}]}]},{\"duration\":102,\"playTimes\":0,\"name\":\"Idle2\",\"bone\":[{\"name\":\"effect6\",\"translateFrame\":[{\"duration\":39,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":6.4,\"y\":-11.2},{\"duration\":24,\"tweenEasing\":0,\"x\":6.4,\"y\":-23.8},{\"duration\":0,\"x\":14,\"y\":-30.2}],\"rotateFrame\":[{\"duration\":39,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-27.23},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-17.6},{\"duration\":0,\"rotate\":-35.03}]},{\"name\":\"effect5\",\"translateFrame\":[{\"duration\":27,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":-10.4,\"y\":-18.24},{\"duration\":21,\"tweenEasing\":0,\"x\":-10.08,\"y\":-32.8},{\"duration\":12,\"x\":-12.8,\"y\":-39.68}],\"rotateFrame\":[{\"duration\":27,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":22.39},{\"duration\":21,\"tweenEasing\":0,\"rotate\":39.5},{\"duration\":12,\"rotate\":22.14}]},{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":15,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":8.8,\"y\":-12.2},{\"duration\":24,\"tweenEasing\":0,\"x\":11,\"y\":-27.6},{\"duration\":24,\"x\":12.2,\"y\":-38.6}],\"rotateFrame\":[{\"duration\":33,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-24.94},{\"duration\":24,\"rotate\":-14.84}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":36,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":4.8,\"y\":-11.2},{\"duration\":18,\"tweenEasing\":0,\"x\":7.6,\"y\":-22.2},{\"duration\":9,\"x\":8.6,\"y\":-30.4}],\"rotateFrame\":[{\"duration\":36,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-17.53},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-36.39},{\"duration\":9,\"rotate\":-23.84}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"x\":-4.53,\"y\":-13.33},{\"duration\":18,\"tweenEasing\":0,\"x\":-3.47,\"y\":-21.07},{\"duration\":33,\"x\":-6.13,\"y\":-34.93}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0,\"rotate\":20.36},{\"duration\":18,\"tweenEasing\":0,\"rotate\":68.81},{\"duration\":33,\"rotate\":27.88}]},{\"name\":\"leftHand\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":0.08,\"y\":0.37},{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":0.08,\"y\":0.37},{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":0.08,\"y\":0.37},{\"duration\":9,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"x\":0.08,\"y\":0.37},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-12.3},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-14.11},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-12.3},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-14.11},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-12.3},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-14.11},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-12.3},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-14.11},{\"duration\":0}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":0.37,\"y\":0.2},{\"duration\":9,\"tweenEasing\":0,\"x\":0.38,\"y\":0.31},{\"duration\":9,\"tweenEasing\":0,\"x\":0.37,\"y\":0.2},{\"duration\":9,\"tweenEasing\":0,\"x\":0.38,\"y\":0.31},{\"duration\":9,\"tweenEasing\":0,\"x\":0.37,\"y\":0.2},{\"duration\":9,\"tweenEasing\":0,\"x\":0.38,\"y\":0.31},{\"duration\":9,\"tweenEasing\":0,\"x\":0.37,\"y\":0.2},{\"duration\":18,\"tweenEasing\":0,\"x\":0.38,\"y\":0.31},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":6.55},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-2.77},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-0.86},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-2.77},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-6.22},{\"duration\":9,\"tweenEasing\":0,\"rotate\":3.34},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-6.22},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-2.77},{\"duration\":0}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":-2.4,\"y\":0.27},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.31,\"y\":-0.92},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.19,\"y\":-1.27},{\"duration\":9,\"tweenEasing\":0,\"x\":0.01,\"y\":-2.2},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.19,\"y\":-1.27},{\"duration\":9,\"tweenEasing\":0,\"x\":0.01,\"y\":-2.2},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.19,\"y\":-1.27},{\"duration\":9,\"tweenEasing\":0,\"x\":0.01,\"y\":-2.2},{\"duration\":18,\"tweenEasing\":0,\"x\":-0.19,\"y\":-1.43},{\"duration\":0,\"x\":-2.4,\"y\":0.27}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":18.96},{\"duration\":9,\"tweenEasing\":0,\"rotate\":31.61},{\"duration\":9,\"tweenEasing\":0,\"rotate\":18.96},{\"duration\":9,\"tweenEasing\":0,\"rotate\":37.04},{\"duration\":9,\"tweenEasing\":0,\"rotate\":18.96},{\"duration\":9,\"tweenEasing\":0,\"rotate\":35.61},{\"duration\":9,\"tweenEasing\":0,\"rotate\":18.96},{\"duration\":18,\"tweenEasing\":0,\"rotate\":31.61},{\"duration\":0}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":-2.4,\"y\":0.27},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.85,\"y\":-2.35},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.53,\"y\":-4.39},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.53,\"y\":-3.63},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.53,\"y\":-4.39},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.53,\"y\":-3.63},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.53,\"y\":-4.39},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.53,\"y\":-3.63},{\"duration\":18,\"tweenEasing\":0,\"x\":-0.53,\"y\":-4.55},{\"duration\":0,\"x\":-2.4,\"y\":0.27}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":30.08},{\"duration\":9,\"tweenEasing\":0,\"rotate\":22.76},{\"duration\":9,\"tweenEasing\":0,\"rotate\":19.34},{\"duration\":9,\"tweenEasing\":0,\"rotate\":25.64},{\"duration\":9,\"tweenEasing\":0,\"rotate\":20.36},{\"duration\":9,\"tweenEasing\":0,\"rotate\":26.38},{\"duration\":9,\"tweenEasing\":0,\"rotate\":18.94},{\"duration\":18,\"tweenEasing\":0,\"rotate\":22.76},{\"duration\":0}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":-2.13,\"y\":0.27},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.29,\"y\":0.61},{\"duration\":9,\"tweenEasing\":0,\"x\":0.57,\"y\":-1.49},{\"duration\":9,\"tweenEasing\":0,\"x\":0.67,\"y\":-0.35},{\"duration\":9,\"tweenEasing\":0,\"x\":0.57,\"y\":-1.49},{\"duration\":9,\"tweenEasing\":0,\"x\":0.67,\"y\":0.13},{\"duration\":9,\"tweenEasing\":0,\"x\":0.57,\"y\":-2.13},{\"duration\":9,\"tweenEasing\":0,\"x\":0.67,\"y\":0.61},{\"duration\":18,\"tweenEasing\":0,\"x\":0.57,\"y\":-2.13},{\"duration\":0,\"x\":-2.13,\"y\":0.27}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":-4.1},{\"duration\":9,\"tweenEasing\":0,\"rotate\":0.06},{\"duration\":54,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":0,\"rotate\":-4.1}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":1.01,\"y\":-0.72},{\"duration\":9,\"tweenEasing\":0,\"x\":1.72,\"y\":-2.61},{\"duration\":9,\"tweenEasing\":0,\"x\":1.33,\"y\":-2},{\"duration\":9,\"tweenEasing\":0,\"x\":1.72,\"y\":-2.61},{\"duration\":9,\"tweenEasing\":0,\"x\":1.33,\"y\":-2},{\"duration\":9,\"tweenEasing\":0,\"x\":1.72,\"y\":-2.77},{\"duration\":9,\"tweenEasing\":0,\"x\":1.33,\"y\":-2},{\"duration\":18,\"tweenEasing\":0,\"x\":1.72,\"y\":-3.73},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-30.94},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-38.24},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-30.94},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-39.74},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-30.94},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-45.24},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-30.94},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-38.24},{\"duration\":0}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.32,\"y\":0.32},{\"duration\":9,\"tweenEasing\":0,\"y\":-0.99},{\"duration\":9,\"tweenEasing\":0,\"y\":-0.96},{\"duration\":9,\"tweenEasing\":0,\"y\":-1.47},{\"duration\":9,\"tweenEasing\":0,\"y\":-1.12},{\"duration\":9,\"tweenEasing\":0,\"y\":-1.95},{\"duration\":9,\"tweenEasing\":0,\"y\":-0.96},{\"duration\":18,\"tweenEasing\":0,\"y\":-2.11},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":-6.48},{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":0.41},{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":0.41},{\"duration\":9,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"rotate\":0.41},{\"duration\":9,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"rotate\":0.41},{\"duration\":0,\"rotate\":-6.48}],\"scaleFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"tweenEasing\":0,\"x\":1.01,\"y\":1.01},{\"duration\":9,\"tweenEasing\":0,\"x\":1.02,\"y\":1.02},{\"duration\":9,\"tweenEasing\":0,\"x\":1.01,\"y\":1.01},{\"duration\":9,\"tweenEasing\":0,\"x\":1.02,\"y\":1.02},{\"duration\":9,\"tweenEasing\":0,\"x\":1.01,\"y\":1.01},{\"duration\":9,\"tweenEasing\":0,\"x\":1.02,\"y\":1.02},{\"duration\":9,\"tweenEasing\":0,\"x\":1.01,\"y\":1.01},{\"duration\":18,\"tweenEasing\":0,\"x\":1.02,\"y\":1.02},{\"duration\":0}]},{\"name\":\"leg\",\"translateFrame\":[{\"duration\":24,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"y\":-0.12},{\"duration\":24,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"y\":-0.12},{\"duration\":30}],\"scaleFrame\":[{\"duration\":24,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":1.04,\"y\":1.1},{\"duration\":24,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0},{\"duration\":6,\"tweenEasing\":0,\"x\":1.04,\"y\":1.1},{\"duration\":30}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":-1.95,\"y\":-1.15},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.1,\"y\":-0.4},{\"duration\":9,\"tweenEasing\":0,\"x\":-1.71,\"y\":-0.37},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.1,\"y\":-0.4},{\"duration\":9,\"tweenEasing\":0,\"x\":-1.71,\"y\":-0.37},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.1,\"y\":-0.4},{\"duration\":9,\"tweenEasing\":0,\"x\":-1.71,\"y\":-0.37},{\"duration\":9,\"tweenEasing\":0,\"x\":-2.1,\"y\":-0.4},{\"duration\":18,\"tweenEasing\":0,\"x\":-1.71,\"y\":-0.37},{\"duration\":0,\"x\":-1.95,\"y\":-1.15}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":9,\"tweenEasing\":0,\"rotate\":8.49},{\"duration\":9,\"tweenEasing\":0,\"rotate\":10.34},{\"duration\":9,\"tweenEasing\":0,\"rotate\":8.49},{\"duration\":9,\"tweenEasing\":0,\"rotate\":10.34},{\"duration\":9,\"tweenEasing\":0,\"rotate\":8.49},{\"duration\":9,\"tweenEasing\":0,\"rotate\":10.34},{\"duration\":9,\"tweenEasing\":0,\"rotate\":8.49},{\"duration\":18,\"tweenEasing\":0,\"rotate\":10.34},{\"duration\":0,\"rotate\":11.7}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.89,\"y\":0.2},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.33,\"y\":0.31},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.89,\"y\":0.2},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.33,\"y\":0.31},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.89,\"y\":0.2},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.33,\"y\":0.31},{\"duration\":9,\"tweenEasing\":0,\"x\":-0.89,\"y\":0.2},{\"duration\":18,\"tweenEasing\":0,\"x\":-0.41,\"y\":0.01},{\"duration\":0,\"x\":-0.3,\"y\":-0.01}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":9,\"tweenEasing\":0,\"rotate\":40.53},{\"duration\":9,\"tweenEasing\":0,\"rotate\":48.89},{\"duration\":9,\"tweenEasing\":0,\"rotate\":45.22},{\"duration\":9,\"tweenEasing\":0,\"rotate\":48.89},{\"duration\":9,\"tweenEasing\":0,\"rotate\":40.53},{\"duration\":9,\"tweenEasing\":0,\"rotate\":46.54},{\"duration\":9,\"tweenEasing\":0,\"rotate\":40.53},{\"duration\":18,\"tweenEasing\":0,\"rotate\":48.89},{\"duration\":0,\"rotate\":21.7}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":9,\"tweenEasing\":0,\"x\":1.52,\"y\":0.77},{\"duration\":9,\"tweenEasing\":0,\"x\":2.26,\"y\":-1.5},{\"duration\":9,\"tweenEasing\":0,\"x\":1.84,\"y\":-0.51},{\"duration\":9,\"tweenEasing\":0,\"x\":2.26,\"y\":-1.5},{\"duration\":9,\"tweenEasing\":0,\"x\":1.84,\"y\":-0.51},{\"duration\":9,\"tweenEasing\":0,\"x\":2.26,\"y\":-1.5},{\"duration\":9,\"tweenEasing\":0,\"x\":1.84,\"y\":-0.99},{\"duration\":18,\"tweenEasing\":0,\"x\":2.26,\"y\":-2.14},{\"duration\":0,\"x\":1.76,\"y\":2.48}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-30.66},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-31.48},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-27.88},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-34.28},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-25.77},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-35.22},{\"duration\":9,\"tweenEasing\":0,\"rotate\":-23.55},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-31.48},{\"duration\":0,\"rotate\":-6.67}]}],\"slot\":[{\"name\":\"effect6\",\"colorFrame\":[{\"duration\":39,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0},{\"duration\":0,\"value\":{\"aM\":0}}]},{\"name\":\"effect5\",\"colorFrame\":[{\"duration\":27,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":12,\"value\":{\"aM\":0}}]},{\"name\":\"effect4\",\"colorFrame\":[{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0},{\"duration\":24,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"colorFrame\":[{\"duration\":36,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"colorFrame\":[{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":15,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":33,\"value\":{\"aM\":0}}]},{\"name\":\"backLight\",\"displayFrame\":[{\"duration\":102,\"value\":-1}]}]},{\"duration\":66,\"playTimes\":0,\"name\":\"Idle1\",\"bone\":[{\"name\":\"effect6\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":24,\"tweenEasing\":0,\"x\":6.93,\"y\":-13.69},{\"duration\":0,\"x\":10.84,\"y\":-19.73}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":24,\"rotate\":-10.38}]},{\"name\":\"effect5\",\"translateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"x\":-8,\"y\":-6.63},{\"duration\":15,\"tweenEasing\":0,\"x\":-10.06,\"y\":-17.83},{\"duration\":9,\"x\":-10.74,\"y\":-24.69}],\"rotateFrame\":[{\"duration\":6,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"rotate\":27.97},{\"duration\":15,\"tweenEasing\":0,\"rotate\":-3.77},{\"duration\":9,\"rotate\":-10.94}]},{\"name\":\"effect4\",\"translateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"x\":7.77,\"y\":-12.8},{\"duration\":21,\"tweenEasing\":0,\"x\":13.49,\"y\":-21.94},{\"duration\":9,\"x\":13.03,\"y\":-26.74}],\"rotateFrame\":[{\"duration\":18,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"rotate\":19.87},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-1.94},{\"duration\":9,\"rotate\":-29.35}]},{\"name\":\"effect3\",\"translateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":6.8,\"y\":-15.73},{\"duration\":18,\"tweenEasing\":0,\"x\":6.27,\"y\":-28.27},{\"duration\":0,\"x\":7.33,\"y\":-35.73}],\"rotateFrame\":[{\"duration\":9,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-25.82},{\"duration\":18,\"tweenEasing\":0,\"rotate\":-13.32},{\"duration\":0,\"rotate\":-23.08}]},{\"name\":\"effect2\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"x\":-4.64,\"y\":-11.84},{\"duration\":21,\"tweenEasing\":0,\"x\":-11.68,\"y\":-18.88},{\"duration\":6,\"x\":-15.04,\"y\":-24}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0,\"rotate\":35.13},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-4.98},{\"duration\":6,\"rotate\":29.58}]},{\"name\":\"leftHand\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":0.58,\"y\":0.86},{\"duration\":24,\"tweenEasing\":0,\"x\":0.58,\"y\":0.86},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-4.45},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-6.58},{\"duration\":0}]},{\"name\":\"leftFrontArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":0.06,\"y\":0.45},{\"duration\":24}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-3.35},{\"duration\":24,\"tweenEasing\":0,\"rotate\":7.11},{\"duration\":0}]},{\"name\":\"leftShoulder\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":-0.16,\"y\":-1.12},{\"duration\":24,\"tweenEasing\":0,\"x\":-0.16,\"y\":-1.12},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":13.8},{\"duration\":24,\"tweenEasing\":0,\"rotate\":4.52},{\"duration\":0}]},{\"name\":\"leftArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":0.2,\"y\":-1.99},{\"duration\":24,\"tweenEasing\":0,\"x\":0.36,\"y\":-1.83},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":16.02},{\"duration\":24,\"tweenEasing\":0,\"rotate\":12.08},{\"duration\":0}]},{\"name\":\"head\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":-0.32,\"y\":-1.37},{\"duration\":24,\"tweenEasing\":0,\"y\":-0.89},{\"duration\":0}]},{\"name\":\"rightShoulder\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":0.64,\"y\":-3.79},{\"duration\":24,\"tweenEasing\":0,\"x\":0.64,\"y\":-1.55},{\"duration\":0}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-10.95},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-8.38},{\"duration\":0}]},{\"name\":\"body\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"y\":-1.44},{\"duration\":24,\"tweenEasing\":0,\"x\":0.16,\"y\":-0.64},{\"duration\":0}],\"scaleFrame\":[{\"duration\":21,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0,\"x\":1.03,\"y\":1.03},{\"duration\":24,\"tweenEasing\":0,\"x\":1.03,\"y\":1.03},{\"duration\":0}]},{\"name\":\"rightHand\",\"translateFrame\":[{\"duration\":66,\"x\":-1.95,\"y\":-1.15}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":11.7},{\"duration\":21,\"tweenEasing\":0,\"rotate\":16.12},{\"duration\":24,\"tweenEasing\":0,\"rotate\":15.51},{\"duration\":0,\"rotate\":11.7}]},{\"name\":\"rightFrontArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":-0.3,\"y\":-0.01},{\"duration\":21,\"tweenEasing\":0,\"x\":-0.17,\"y\":1.03},{\"duration\":24,\"tweenEasing\":0,\"x\":-0.13,\"y\":0.26},{\"duration\":0,\"x\":-0.3,\"y\":-0.01}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":21.7},{\"duration\":21,\"tweenEasing\":0,\"rotate\":45.3},{\"duration\":24,\"tweenEasing\":0,\"rotate\":32.17},{\"duration\":0,\"rotate\":21.7}]},{\"name\":\"rightArm\",\"translateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"x\":1.76,\"y\":2.48},{\"duration\":21,\"tweenEasing\":0,\"x\":1.49,\"y\":0.92},{\"duration\":24,\"tweenEasing\":0,\"x\":2.13,\"y\":1.4},{\"duration\":0,\"x\":1.76,\"y\":2.48}],\"rotateFrame\":[{\"duration\":21,\"tweenEasing\":0,\"rotate\":-6.67},{\"duration\":21,\"tweenEasing\":0,\"rotate\":-26.33},{\"duration\":24,\"tweenEasing\":0,\"rotate\":-19.75},{\"duration\":0,\"rotate\":-6.67}]}],\"slot\":[{\"name\":\"effect6\",\"colorFrame\":[{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":24,\"tweenEasing\":0},{\"duration\":0,\"value\":{\"aM\":0}}]},{\"name\":\"effect5\",\"colorFrame\":[{\"duration\":6,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0},{\"duration\":15,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"effect4\",\"colorFrame\":[{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":9,\"value\":{\"aM\":0}}]},{\"name\":\"effect3\",\"colorFrame\":[{\"duration\":9,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":21,\"tweenEasing\":0},{\"duration\":18,\"tweenEasing\":0},{\"duration\":0,\"value\":{\"aM\":0}}]},{\"name\":\"effect2\",\"colorFrame\":[{\"duration\":21,\"tweenEasing\":0,\"value\":{\"aM\":0}},{\"duration\":18,\"tweenEasing\":0},{\"duration\":21,\"tweenEasing\":0},{\"duration\":6,\"value\":{\"aM\":0}}]},{\"name\":\"backLight\",\"displayFrame\":[{\"duration\":66,\"value\":-1}]}]}],\"defaultActions\":[{\"gotoAndPlay\":\"Walking\"}]}]}", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json new file mode 100644 index 0000000..4bfb89c --- /dev/null +++ b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json @@ -0,0 +1 @@ +{"SubTexture":[{"y":50,"frameX":-2,"frameY":-2,"width":19,"frameWidth":23,"height":19,"name":"biu","frameHeight":22,"x":1},{"width":9,"y":50,"height":14,"name":"rightArm","x":42},{"y":34,"frameX":-6,"frameY":0,"width":20,"frameWidth":29,"height":32,"name":"yinmoqe00","frameHeight":32,"x":88},{"y":1,"frameX":0,"frameY":0,"width":33,"frameWidth":34,"height":39,"name":"body","frameHeight":41,"x":53},{"width":9,"y":56,"height":13,"name":"rightShoulder","x":74},{"y":50,"frameX":0,"frameY":0,"width":18,"frameWidth":19,"height":17,"name":"rightFrontArm","frameHeight":18,"x":22},{"width":14,"y":50,"height":14,"name":"rightHand","x":110},{"width":12,"y":42,"height":12,"name":"leftArm","x":74},{"width":13,"y":66,"height":12,"name":"leftShoulder","x":110},{"y":42,"frameX":-1,"frameY":0,"width":19,"frameWidth":20,"height":21,"name":"leftFrontArm","frameHeight":21,"x":53},{"width":50,"y":1,"height":47,"name":"head2","x":1},{"y":1,"frameX":-1,"frameY":0,"width":32,"frameWidth":33,"height":31,"name":"head","frameHeight":32,"x":88},{"width":16,"y":34,"height":14,"name":"leftHand","x":110},{"y":1,"frameX":-2,"frameY":-3,"width":2,"frameWidth":8,"height":2,"name":"huomiao01","frameHeight":8,"x":122}],"width":128,"height":128,"name":"SoldierWaterGhost","imagePath":"SoldierWaterGhost_tex.png"} \ No newline at end of file diff --git a/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json.meta b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json.meta new file mode 100644 index 0000000..61e6feb --- /dev/null +++ b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.json.meta @@ -0,0 +1,7 @@ +{ + "ver": "1.0.0", + "uuid": "2f5ba371-9006-4e2d-8dd4-df91fcea1df2", + "atlasJson": "{\"SubTexture\":[{\"y\":50,\"frameX\":-2,\"frameY\":-2,\"width\":19,\"frameWidth\":23,\"height\":19,\"name\":\"biu\",\"frameHeight\":22,\"x\":1},{\"width\":9,\"y\":50,\"height\":14,\"name\":\"rightArm\",\"x\":42},{\"y\":34,\"frameX\":-6,\"frameY\":0,\"width\":20,\"frameWidth\":29,\"height\":32,\"name\":\"yinmoqe00\",\"frameHeight\":32,\"x\":88},{\"y\":1,\"frameX\":0,\"frameY\":0,\"width\":33,\"frameWidth\":34,\"height\":39,\"name\":\"body\",\"frameHeight\":41,\"x\":53},{\"width\":9,\"y\":56,\"height\":13,\"name\":\"rightShoulder\",\"x\":74},{\"y\":50,\"frameX\":0,\"frameY\":0,\"width\":18,\"frameWidth\":19,\"height\":17,\"name\":\"rightFrontArm\",\"frameHeight\":18,\"x\":22},{\"width\":14,\"y\":50,\"height\":14,\"name\":\"rightHand\",\"x\":110},{\"width\":12,\"y\":42,\"height\":12,\"name\":\"leftArm\",\"x\":74},{\"width\":13,\"y\":66,\"height\":12,\"name\":\"leftShoulder\",\"x\":110},{\"y\":42,\"frameX\":-1,\"frameY\":0,\"width\":19,\"frameWidth\":20,\"height\":21,\"name\":\"leftFrontArm\",\"frameHeight\":21,\"x\":53},{\"width\":50,\"y\":1,\"height\":47,\"name\":\"head2\",\"x\":1},{\"y\":1,\"frameX\":-1,\"frameY\":0,\"width\":32,\"frameWidth\":33,\"height\":31,\"name\":\"head\",\"frameHeight\":32,\"x\":88},{\"width\":16,\"y\":34,\"height\":14,\"name\":\"leftHand\",\"x\":110},{\"y\":1,\"frameX\":-2,\"frameY\":-3,\"width\":2,\"frameWidth\":8,\"height\":2,\"name\":\"huomiao01\",\"frameHeight\":8,\"x\":122}],\"width\":128,\"height\":128,\"name\":\"SoldierWaterGhost\",\"imagePath\":\"SoldierWaterGhost_tex.png\"}", + "texture": "62ea1a78-b096-4b8c-afb4-8edd4be142f7", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.png b/frontend/assets/resources/animation/SolderWaterGhost/SoldierWaterGhost_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..c2af9ee00c2772ec5c1166c48fdcac5b4d69404f GIT binary patch literal 6976 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 Date: Tue, 22 Nov 2022 17:12:51 +0800 Subject: [PATCH 2/6] Drafted attack trigger logic in OfflineMap. --- battle_srv/models/room.go | 8 +- battle_srv/protos/room_downsync_frame.pb.go | 656 +++++--- .../pbfiles/room_downsync_frame.proto | 49 +- frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map_1.fire | 2 +- frontend/assets/scripts/AttackingCharacter.js | 3 + frontend/assets/scripts/Map.js | 19 +- frontend/assets/scripts/OfflineMap.js | 169 ++- ...om_downsync_frame_proto_bundle.forcemsg.js | 1333 +++++++++++++---- 9 files changed, 1707 insertions(+), 534 deletions(-) diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 030c5ea..e91ce66 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -266,8 +266,8 @@ func (pR *Room) ChooseStage() error { panic(err) } - // Obtain the content of `gidBoundariesMapInB2World`. - gidBoundariesMapInB2World := make(map[int]StrToPolygon2DListMap, 0) + // Obtain the content of `gidBoundariesMap`. + gidBoundariesMap := make(map[int]StrToPolygon2DListMap, 0) for _, tileset := range pTmxMapIns.Tilesets { relativeTsxFilePath := fmt.Sprintf("%s/%s", filepath.Join(pwd, relativePathForChosenStage), tileset.Source) // Note that "TmxTileset.Source" can be a string of "relative path". absTsxFilePath, err := filepath.Abs(relativeTsxFilePath) @@ -283,10 +283,10 @@ func (pR *Room) ChooseStage() error { panic(err) } - DeserializeTsxToColliderDict(pTmxMapIns, byteArrOfTsxFile, int(tileset.FirstGid), gidBoundariesMapInB2World) + DeserializeTsxToColliderDict(pTmxMapIns, byteArrOfTsxFile, int(tileset.FirstGid), gidBoundariesMap) } - stageDiscreteW, stageDiscreteH, stageTileW, stageTileH, strToVec2DListMap, strToPolygon2DListMap, err := ParseTmxLayersAndGroups(pTmxMapIns, gidBoundariesMapInB2World) + stageDiscreteW, stageDiscreteH, stageTileW, stageTileH, strToVec2DListMap, strToPolygon2DListMap, err := ParseTmxLayersAndGroups(pTmxMapIns, gidBoundariesMap) if nil != err { panic(err) } diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index d435a6b..b84ce1b 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -260,9 +260,13 @@ type PlayerDownsync struct { Removed bool `protobuf:"varint,9,opt,name=removed,proto3" json:"removed,omitempty"` Score int32 `protobuf:"varint,10,opt,name=score,proto3" json:"score,omitempty"` LastMoveGmtMillis int32 `protobuf:"varint,11,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` - Name string `protobuf:"bytes,12,opt,name=name,proto3" json:"name,omitempty"` - DisplayName string `protobuf:"bytes,13,opt,name=displayName,proto3" json:"displayName,omitempty"` - Avatar string `protobuf:"bytes,14,opt,name=avatar,proto3" json:"avatar,omitempty"` + FramesToRecover int32 `protobuf:"varint,12,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` + Hp int32 `protobuf:"varint,13,opt,name=hp,proto3" json:"hp,omitempty"` + MaxHp int32 `protobuf:"varint,14,opt,name=maxHp,proto3" json:"maxHp,omitempty"` + CharacterState int32 `protobuf:"varint,15,opt,name=characterState,proto3" json:"characterState,omitempty"` + Name string `protobuf:"bytes,16,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,17,opt,name=displayName,proto3" json:"displayName,omitempty"` + Avatar string `protobuf:"bytes,18,opt,name=avatar,proto3" json:"avatar,omitempty"` } func (x *PlayerDownsync) Reset() { @@ -374,6 +378,34 @@ func (x *PlayerDownsync) GetLastMoveGmtMillis() int32 { return 0 } +func (x *PlayerDownsync) GetFramesToRecover() int32 { + if x != nil { + return x.FramesToRecover + } + return 0 +} + +func (x *PlayerDownsync) GetHp() int32 { + if x != nil { + return x.Hp + } + return 0 +} + +func (x *PlayerDownsync) GetMaxHp() int32 { + if x != nil { + return x.MaxHp + } + return 0 +} + +func (x *PlayerDownsync) GetCharacterState() int32 { + if x != nil { + return x.CharacterState + } + return 0 +} + func (x *PlayerDownsync) GetName() string { if x != nil { return x.Name @@ -623,69 +655,6 @@ func (x *HeartbeatUpsync) GetClientTimestamp() int64 { return 0 } -type RoomDownsyncFrame struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Players map[int32]*PlayerDownsync `protobuf:"bytes,2,rep,name=players,proto3" json:"players,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - CountdownNanos int64 `protobuf:"varint,3,opt,name=countdownNanos,proto3" json:"countdownNanos,omitempty"` -} - -func (x *RoomDownsyncFrame) Reset() { - *x = RoomDownsyncFrame{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RoomDownsyncFrame) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RoomDownsyncFrame) ProtoMessage() {} - -func (x *RoomDownsyncFrame) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RoomDownsyncFrame.ProtoReflect.Descriptor instead. -func (*RoomDownsyncFrame) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} -} - -func (x *RoomDownsyncFrame) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *RoomDownsyncFrame) GetPlayers() map[int32]*PlayerDownsync { - if x != nil { - return x.Players - } - return nil -} - -func (x *RoomDownsyncFrame) GetCountdownNanos() int64 { - if x != nil { - return x.CountdownNanos - } - return 0 -} - type WsReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -704,7 +673,7 @@ type WsReq struct { func (x *WsReq) Reset() { *x = WsReq{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[7] + mi := &file_room_downsync_frame_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -717,7 +686,7 @@ func (x *WsReq) String() string { func (*WsReq) ProtoMessage() {} func (x *WsReq) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[7] + mi := &file_room_downsync_frame_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -730,7 +699,7 @@ func (x *WsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WsReq.ProtoReflect.Descriptor instead. func (*WsReq) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} } func (x *WsReq) GetMsgId() int32 { @@ -805,7 +774,7 @@ type WsResp struct { func (x *WsResp) Reset() { *x = WsResp{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[8] + mi := &file_room_downsync_frame_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -818,7 +787,7 @@ func (x *WsResp) String() string { func (*WsResp) ProtoMessage() {} func (x *WsResp) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[8] + mi := &file_room_downsync_frame_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -831,7 +800,7 @@ func (x *WsResp) ProtoReflect() protoreflect.Message { // Deprecated: Use WsResp.ProtoReflect.Descriptor instead. func (*WsResp) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} } func (x *WsResp) GetRet() int32 { @@ -876,6 +845,246 @@ func (x *WsResp) GetBciFrame() *BattleColliderInfo { return nil } +type MeleeBullet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // for offender + BattleLocalId int32 `protobuf:"varint,1,opt,name=battleLocalId,proto3" json:"battleLocalId,omitempty"` + StartupFrames int32 `protobuf:"varint,2,opt,name=startupFrames,proto3" json:"startupFrames,omitempty"` + ActiveFrames int32 `protobuf:"varint,3,opt,name=activeFrames,proto3" json:"activeFrames,omitempty"` + RecoveryFrames int32 `protobuf:"varint,4,opt,name=recoveryFrames,proto3" json:"recoveryFrames,omitempty"` + RecoveryFramesOnBlock int32 `protobuf:"varint,5,opt,name=recoveryFramesOnBlock,proto3" json:"recoveryFramesOnBlock,omitempty"` + RecoveryFramesOnHit int32 `protobuf:"varint,6,opt,name=recoveryFramesOnHit,proto3" json:"recoveryFramesOnHit,omitempty"` + Moveforward *sharedprotos.Vec2D `protobuf:"bytes,7,opt,name=moveforward,proto3" json:"moveforward,omitempty"` + HitboxOffset *sharedprotos.Vec2D `protobuf:"bytes,8,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` + HitboxSize *sharedprotos.Vec2D `protobuf:"bytes,9,opt,name=hitboxSize,proto3" json:"hitboxSize,omitempty"` + OffenderJoinIndex int32 `protobuf:"varint,10,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` + OriginatedRenderFrameId int32 `protobuf:"varint,11,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` + // for defender + HitStunFrames int32 `protobuf:"varint,12,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` + BlockStunFrames int32 `protobuf:"varint,13,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` + Pushback float64 `protobuf:"fixed64,14,opt,name=pushback,proto3" json:"pushback,omitempty"` + ReleaseTriggerType int32 `protobuf:"varint,15,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge + Damage int32 `protobuf:"varint,16,opt,name=damage,proto3" json:"damage,omitempty"` +} + +func (x *MeleeBullet) Reset() { + *x = MeleeBullet{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MeleeBullet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MeleeBullet) ProtoMessage() {} + +func (x *MeleeBullet) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MeleeBullet.ProtoReflect.Descriptor instead. +func (*MeleeBullet) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} +} + +func (x *MeleeBullet) GetBattleLocalId() int32 { + if x != nil { + return x.BattleLocalId + } + return 0 +} + +func (x *MeleeBullet) GetStartupFrames() int32 { + if x != nil { + return x.StartupFrames + } + return 0 +} + +func (x *MeleeBullet) GetActiveFrames() int32 { + if x != nil { + return x.ActiveFrames + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFrames() int32 { + if x != nil { + return x.RecoveryFrames + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFramesOnBlock() int32 { + if x != nil { + return x.RecoveryFramesOnBlock + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFramesOnHit() int32 { + if x != nil { + return x.RecoveryFramesOnHit + } + return 0 +} + +func (x *MeleeBullet) GetMoveforward() *sharedprotos.Vec2D { + if x != nil { + return x.Moveforward + } + return nil +} + +func (x *MeleeBullet) GetHitboxOffset() *sharedprotos.Vec2D { + if x != nil { + return x.HitboxOffset + } + return nil +} + +func (x *MeleeBullet) GetHitboxSize() *sharedprotos.Vec2D { + if x != nil { + return x.HitboxSize + } + return nil +} + +func (x *MeleeBullet) GetOffenderJoinIndex() int32 { + if x != nil { + return x.OffenderJoinIndex + } + return 0 +} + +func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { + if x != nil { + return x.OriginatedRenderFrameId + } + return 0 +} + +func (x *MeleeBullet) GetHitStunFrames() int32 { + if x != nil { + return x.HitStunFrames + } + return 0 +} + +func (x *MeleeBullet) GetBlockStunFrames() int32 { + if x != nil { + return x.BlockStunFrames + } + return 0 +} + +func (x *MeleeBullet) GetPushback() float64 { + if x != nil { + return x.Pushback + } + return 0 +} + +func (x *MeleeBullet) GetReleaseTriggerType() int32 { + if x != nil { + return x.ReleaseTriggerType + } + return 0 +} + +func (x *MeleeBullet) GetDamage() int32 { + if x != nil { + return x.Damage + } + return 0 +} + +type RoomDownsyncFrame struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Players map[int32]*PlayerDownsync `protobuf:"bytes,2,rep,name=players,proto3" json:"players,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + CountdownNanos int64 `protobuf:"varint,3,opt,name=countdownNanos,proto3" json:"countdownNanos,omitempty"` + MeleeBullets []*MeleeBullet `protobuf:"bytes,4,rep,name=meleeBullets,proto3" json:"meleeBullets,omitempty"` // I don't know how to mimic inheritance/composition in protobuf by far, thus using an array for each type of bullet as a compromise +} + +func (x *RoomDownsyncFrame) Reset() { + *x = RoomDownsyncFrame{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoomDownsyncFrame) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoomDownsyncFrame) ProtoMessage() {} + +func (x *RoomDownsyncFrame) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoomDownsyncFrame.ProtoReflect.Descriptor instead. +func (*RoomDownsyncFrame) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{9} +} + +func (x *RoomDownsyncFrame) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *RoomDownsyncFrame) GetPlayers() map[int32]*PlayerDownsync { + if x != nil { + return x.Players + } + return nil +} + +func (x *RoomDownsyncFrame) GetCountdownNanos() int64 { + if x != nil { + return x.CountdownNanos + } + return 0 +} + +func (x *RoomDownsyncFrame) GetMeleeBullets() []*MeleeBullet { + if x != nil { + return x.MeleeBullets + } + return nil +} + var File_room_downsync_frame_proto protoreflect.FileDescriptor var file_room_downsync_frame_proto_rawDesc = []byte{ @@ -970,7 +1179,7 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbd, 0x03, 0x0a, 0x0e, 0x50, 0x6c, 0x61, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb5, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -993,34 +1202,123 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, - 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, - 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, - 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, - 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, - 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, - 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe1, 0x01, 0x0a, 0x11, 0x52, 0x6f, 0x6f, + 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x68, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x78, 0x48, 0x70, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x48, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, + 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, + 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, + 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, + 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, + 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, + 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, + 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, + 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, + 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, + 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, + 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0xce, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, + 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, + 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, + 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, + 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, + 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, + 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x37, + 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, + 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, + 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, + 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, + 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, + 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, @@ -1029,50 +1327,18 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, - 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, - 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb8, 0x02, 0x0a, - 0x05, 0x57, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, - 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, - 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, - 0x0a, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, - 0x0a, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, - 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, - 0x0a, 0x02, 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, - 0x79, 0x6e, 0x63, 0x52, 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x72, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, - 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, - 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, - 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x52, 0x03, 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, - 0x6e, 0x63, 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, - 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, - 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, + 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, + 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, + 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, + 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1087,7 +1353,7 @@ func file_room_downsync_frame_proto_rawDescGZIP() []byte { return file_room_downsync_frame_proto_rawDescData } -var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_room_downsync_frame_proto_goTypes = []interface{}{ (*BattleColliderInfo)(nil), // 0: protos.BattleColliderInfo (*PlayerDownsync)(nil), // 1: protos.PlayerDownsync @@ -1095,34 +1361,40 @@ var file_room_downsync_frame_proto_goTypes = []interface{}{ (*InputFrameUpsync)(nil), // 3: protos.InputFrameUpsync (*InputFrameDownsync)(nil), // 4: protos.InputFrameDownsync (*HeartbeatUpsync)(nil), // 5: protos.HeartbeatUpsync - (*RoomDownsyncFrame)(nil), // 6: protos.RoomDownsyncFrame - (*WsReq)(nil), // 7: protos.WsReq - (*WsResp)(nil), // 8: protos.WsResp - nil, // 9: protos.BattleColliderInfo.StrToVec2DListMapEntry - nil, // 10: protos.BattleColliderInfo.StrToPolygon2DListMapEntry - nil, // 11: protos.RoomDownsyncFrame.PlayersEntry - (*sharedprotos.Direction)(nil), // 12: sharedprotos.Direction - (*sharedprotos.Vec2DList)(nil), // 13: sharedprotos.Vec2DList - (*sharedprotos.Polygon2DList)(nil), // 14: sharedprotos.Polygon2DList + (*WsReq)(nil), // 6: protos.WsReq + (*WsResp)(nil), // 7: protos.WsResp + (*MeleeBullet)(nil), // 8: protos.MeleeBullet + (*RoomDownsyncFrame)(nil), // 9: protos.RoomDownsyncFrame + nil, // 10: protos.BattleColliderInfo.StrToVec2DListMapEntry + nil, // 11: protos.BattleColliderInfo.StrToPolygon2DListMapEntry + nil, // 12: protos.RoomDownsyncFrame.PlayersEntry + (*sharedprotos.Direction)(nil), // 13: sharedprotos.Direction + (*sharedprotos.Vec2D)(nil), // 14: sharedprotos.Vec2D + (*sharedprotos.Vec2DList)(nil), // 15: sharedprotos.Vec2DList + (*sharedprotos.Polygon2DList)(nil), // 16: sharedprotos.Polygon2DList } var file_room_downsync_frame_proto_depIdxs = []int32{ - 9, // 0: protos.BattleColliderInfo.strToVec2DListMap:type_name -> protos.BattleColliderInfo.StrToVec2DListMapEntry - 10, // 1: protos.BattleColliderInfo.strToPolygon2DListMap:type_name -> protos.BattleColliderInfo.StrToPolygon2DListMapEntry - 12, // 2: protos.PlayerDownsync.dir:type_name -> sharedprotos.Direction - 11, // 3: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry - 3, // 4: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync - 5, // 5: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync - 6, // 6: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame - 4, // 7: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync - 0, // 8: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo - 13, // 9: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList - 14, // 10: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList - 1, // 11: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync - 12, // [12:12] is the sub-list for method output_type - 12, // [12:12] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 10, // 0: protos.BattleColliderInfo.strToVec2DListMap:type_name -> protos.BattleColliderInfo.StrToVec2DListMapEntry + 11, // 1: protos.BattleColliderInfo.strToPolygon2DListMap:type_name -> protos.BattleColliderInfo.StrToPolygon2DListMapEntry + 13, // 2: protos.PlayerDownsync.dir:type_name -> sharedprotos.Direction + 3, // 3: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync + 5, // 4: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync + 9, // 5: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame + 4, // 6: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync + 0, // 7: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo + 14, // 8: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D + 14, // 9: protos.MeleeBullet.hitboxOffset:type_name -> sharedprotos.Vec2D + 14, // 10: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D + 12, // 11: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry + 8, // 12: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet + 15, // 13: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList + 16, // 14: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList + 1, // 15: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync + 16, // [16:16] is the sub-list for method output_type + 16, // [16:16] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name } func init() { file_room_downsync_frame_proto_init() } @@ -1204,18 +1476,6 @@ func file_room_downsync_frame_proto_init() { } } file_room_downsync_frame_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoomDownsyncFrame); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WsReq); i { case 0: return &v.state @@ -1227,7 +1487,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WsResp); i { case 0: return &v.state @@ -1239,6 +1499,30 @@ func file_room_downsync_frame_proto_init() { return nil } } + file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MeleeBullet); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_room_downsync_frame_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoomDownsyncFrame); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1246,7 +1530,7 @@ func file_room_downsync_frame_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_room_downsync_frame_proto_rawDesc, NumEnums: 0, - NumMessages: 12, + NumMessages: 13, NumExtensions: 0, NumServices: 0, }, diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index b33f9a1..1242f1b 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -45,10 +45,14 @@ message PlayerDownsync { bool removed = 9; int32 score = 10; int32 lastMoveGmtMillis = 11; + int32 framesToRecover = 12; + int32 hp = 13; + int32 maxHp = 14; + int32 characterState = 15; - string name = 12; - string displayName = 13; - string avatar = 14; + string name = 16; + string displayName = 17; + string avatar = 18; } message InputFrameDecoded { @@ -72,12 +76,6 @@ message HeartbeatUpsync { int64 clientTimestamp = 1; } -message RoomDownsyncFrame { - int32 id = 1; - map players = 2; - int64 countdownNanos = 3; -} - message WsReq { int32 msgId = 1; int32 playerId = 2; @@ -97,3 +95,36 @@ message WsResp { repeated InputFrameDownsync inputFrameDownsyncBatch = 5; BattleColliderInfo bciFrame = 6; } + +message MeleeBullet { + // Jargon reference https://www.thegamer.com/fighting-games-frame-data-explained/ + // ALL lengths are in world coordinate + + // for offender + int32 battleLocalId = 1; + int32 startupFrames = 2; + int32 activeFrames = 3; + int32 recoveryFrames = 4; + int32 recoveryFramesOnBlock = 5; + int32 recoveryFramesOnHit = 6; + sharedprotos.Vec2D moveforward = 7; + sharedprotos.Vec2D hitboxOffset = 8; + sharedprotos.Vec2D hitboxSize = 9; + int32 offenderJoinIndex = 10; + int32 originatedRenderFrameId = 11; + + // for defender + int32 hitStunFrames = 12; + int32 blockStunFrames = 13; + double pushback = 14; + + int32 releaseTriggerType = 15; // 1: rising-edge, 2: falling-edge + int32 damage = 16; +} + +message RoomDownsyncFrame { + int32 id = 1; + map players = 2; + int64 countdownNanos = 3; + repeated MeleeBullet meleeBullets = 4; // I don't know how to mimic inheritance/composition in protobuf by far, thus using an array for each type of bullet as a compromise +} diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index 5cbb696..76a6bfa 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 210.4441731196186, + 216.50635094610968, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map_1.fire b/frontend/assets/scenes/offline_map_1.fire index eda2fde..4939b21 100644 --- a/frontend/assets/scenes/offline_map_1.fire +++ b/frontend/assets/scenes/offline_map_1.fire @@ -453,7 +453,7 @@ "array": [ 0, 0, - 210.4441731196186, + 216.50635094610968, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index df5fefc..9a30f8b 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -22,6 +22,9 @@ cc.Class({ ctor() { this.speciesName = null; + this.hp = 100; + this.maxHp = 100; + this.framesToRecover = 0; }, setSpecies(speciesName) { diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index dea1087..8a5e4c3 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -300,6 +300,7 @@ cc.Class({ // Clearing previous info of all players. [ENDS] self.renderFrameId = 0; // After battle started + self.bulletBattleLocalIdCounter = 0; self.lastAllConfirmedRenderFrameId = -1; self.lastAllConfirmedInputFrameId = -1; self.lastUpsyncInputFrameId = -1; @@ -313,6 +314,7 @@ cc.Class({ self.collisionSys = new collisions.Collisions(); self.collisionBarrierIndexPrefix = (1 << 16); // For tracking the movements of barriers, though not yet actually used + self.collisionBulletIndexPrefix = (1 << 15); // For tracking the movements of bullets self.collisionSysMap = new Map(); self.transitToState(ALL_MAP_STATES.VISUAL); @@ -408,19 +410,7 @@ cc.Class({ /** Init required prefab ended. */ window.handleBattleColliderInfo = function(parsedBattleColliderInfo) { - self.inputDelayFrames = parsedBattleColliderInfo.inputDelayFrames; - self.inputScaleFrames = parsedBattleColliderInfo.inputScaleFrames; - self.inputFrameUpsyncDelayTolerance = parsedBattleColliderInfo.inputFrameUpsyncDelayTolerance; - - self.battleDurationNanos = parsedBattleColliderInfo.battleDurationNanos; - self.rollbackEstimatedDt = parsedBattleColliderInfo.rollbackEstimatedDt; - self.rollbackEstimatedDtMillis = parsedBattleColliderInfo.rollbackEstimatedDtMillis; - self.rollbackEstimatedDtNanos = parsedBattleColliderInfo.rollbackEstimatedDtNanos; - self.maxChasingRenderFramesPerUpdate = parsedBattleColliderInfo.maxChasingRenderFramesPerUpdate; - self.spAtkLookupFrames = parsedBattleColliderInfo.spAtkLookupFrames; - - self.worldToVirtualGridRatio = parsedBattleColliderInfo.worldToVirtualGridRatio; - self.virtualGridToWorldRatio = parsedBattleColliderInfo.virtualGridToWorldRatio; + Object.assign(self, parsedBattleColliderInfo); const tiledMapIns = self.node.getComponent(cc.TiledMap); @@ -758,7 +748,7 @@ cc.Class({ playerScriptIns.joinIndex = joinIndex; if (1 == joinIndex) { - playerScriptIns.setSpecies("SoldierElf"); + playerScriptIns.setSpecies("SoldierWaterGhost"); } else if (2 == joinIndex) { playerScriptIns.setSpecies("SoldierFireGhost"); if (0 == playerRichInfo.dir.dx && 0 == playerRichInfo.dir.dy) { @@ -1045,7 +1035,6 @@ cc.Class({ const decodedInput = self.ctrl.decodeInput(inputList[joinIndex - 1]); - // console.log(`Got non-zero inputs for playerId=${playerId}, decodedInput=${JSON.stringify(decodedInput)} @currRenderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.id}`); /* Reset "position" of players in "collisionSys" according to "virtual grid position". The easy part is that we don't have path-dependent-integrals to worry about like that of thermal dynamics. */ diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 902213d..a594ca0 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -3,6 +3,34 @@ i18n.init(window.language); // languageID should be equal to the one we input in const OnlineMap = require('./Map'); +const PunchAtkConfig = { + // for offender + startupFrames: 2, + activeFrames: 2, + recoveryFrames: 4, // usually but not always "startupFrames+activeFrames" + recoveryFramesOnBlock: 4, // usually but not always the same as "recoveryFrames" + recoveryFramesOnHit: 4, // usually but not always the same as "recoveryFrames" + moveforward: { + x: 0, + y: 0, + }, + hitboxOffset: { + x: 24.0, // should be about the radius of the PlayerCollider + y: 0, + }, + hitboxSize: { + x: 24.0, + y: 24.0, + }, + + // for defender + hitStunFrames: 0, + blockStunFrames: 0, + pushback: 10.0, + releaseTriggerType: 1, // 1: rising-edge, 2: falling-edge + damage: 5 +}; + cc.Class({ extends: OnlineMap, @@ -162,8 +190,8 @@ cc.Class({ 11: { id: 11, joinIndex: 2, - virtualGridX: 80*self.worldToVirtualGridRatio, - virtualGridY: 40*self.worldToVirtualGridRatio, + virtualGridX: 80 * self.worldToVirtualGridRatio, + virtualGridY: 40 * self.worldToVirtualGridRatio, speed: 2 * self.worldToVirtualGridRatio, colliderRadius: 12, dir: { @@ -213,4 +241,141 @@ cc.Class({ } } }, + + // Overriding this function to test experimental dynamics + applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputFrame, currRenderFrame, collisionSys, collisionSysMap) { + const self = this; + const nextRenderFramePlayers = {} + for (let playerId in currRenderFrame.players) { + const currPlayerDownsync = currRenderFrame.players[playerId]; + nextRenderFramePlayers[playerId] = { + id: playerId, + virtualGridX: currPlayerDownsync.virtualGridX, + virtualGridY: currPlayerDownsync.virtualGridY, + dir: { + dx: currPlayerDownsync.dir.dx, + dy: currPlayerDownsync.dir.dy, + }, + speed: currPlayerDownsync.speed, + battleState: currPlayerDownsync.battleState, + score: currPlayerDownsync.score, + removed: currPlayerDownsync.removed, + joinIndex: currPlayerDownsync.joinIndex, + framesToRecover: (0 < currPlayerDownsync.framesToRecover ? currPlayerDownsync.framesToRecover - 1 : 0), + hp: currPlayerDownsync.hp, + maxHp: currPlayerDownsync.maxHp, + }; + } + + const toRet = { + id: currRenderFrame.id + 1, + players: nextRenderFramePlayers, + meleeBullets: [] + }; + + if (null != delayedInputFrame) { + const delayedInputFrameForPrevRenderFrame = self.getCachedInputFrameDownsyncWithPrediction(self._convertToInputFrameId(currRenderFrame.id - 1, self.inputDelayFrames)); + const inputList = delayedInputFrame.inputList; + const effPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + for (let j in self.playerRichInfoArr) { + const joinIndex = parseInt(j) + 1; + effPushbacks[joinIndex - 1] = [0.0, 0.0]; + const playerRichInfo = self.playerRichInfoArr[j]; + const playerId = playerRichInfo.id; + const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; + const playerCollider = collisionSysMap.get(collisionPlayerIndex); + const player = currRenderFrame.players[playerId]; + + const decodedInput = self.ctrl.decodeInput(inputList[joinIndex - 1]); + + const prevDecodedInput = (null == delayedInputFrameForPrevRenderFrame ? null : self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[joinIndex - 1])); + const prevBtnALevel = (null == prevDecodedInput ? 0 : prevDecodedInput.btnALevel); + if (1 == decodedInput.btnALevel && 0 == prevBtnALevel) { + console.log(`playerId=${playerId} triggered a rising-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + if (0 == player.framesToRecover) { + nextRenderFramePlayers[playerId].framesToRecover = PunchAtkConfig.recoveryFrames; + const punch = window.pb.protos.MeleeBullet.create(PunchAtkConfig); + punch.battleLocalId = self.bulletBattleLocalIdCounter++; + punch.offenderJoinIndex = joinIndex; + punch.originatedRenderFrameId = currRenderFrame.id; + toRet.meleeBullets.push(punch); + console.log(`A rising-edge of meleeBullet=${JSON.stringify(punch)} is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + } + } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { + console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + } + + /* + Reset "position" of players in "collisionSys" according to "virtual grid position". The easy part is that we don't have path-dependent-integrals to worry about like that of thermal dynamics. + */ + const newVx = player.virtualGridX + (decodedInput.dx + player.speed * decodedInput.dx); + const newVy = player.virtualGridY + (decodedInput.dy + player.speed * decodedInput.dy); + const newCpos = self.virtualGridToPlayerColliderPos(newVx, newVy, self.playerRichInfoArr[joinIndex - 1]); + playerCollider.x = newCpos[0]; + playerCollider.y = newCpos[1]; + if (0 != decodedInput.dx || 0 != decodedInput.dy) { + // Update directions and thus would eventually update moving animation accordingly + nextRenderFramePlayers[playerId].dir.dx = decodedInput.dx; + nextRenderFramePlayers[playerId].dir.dy = decodedInput.dy; + } + } + + for (let k in currRenderFrame.meleeBullets) { + const meleeBullet = currRenderFrame.meleeBullets[k]; + if (meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames + meleeBullet.activeFrames > currRenderFrame.id) { + // Won't cause any collision + const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; + const bulletCollider = collisionSysMap.get(collisionBulletIndex); + if (null != bulletCollider) { + console.log(`A rising-edge of meleeBullet=${JSON.stringify(meleeBullet)} is removed from collisionSys at renderFrame.id=${currRenderFrame.id} as active frames ended`); + bulletCollider.remove(); + } + continue; + } + if (meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames == currRenderFrame.id) { + // Add meleeBullet to collisionSys (shall we just remove all bullets at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` considering that we might be doing the calculation during rollback? + const collisionBulletIndex = self.collisionBulletIndexPrefix + melee.battleLocalId; + const collisionOffenderIndex = self.collisionPlayerIndexPrefix + melee.offenderJoinIndex; + const offenderCollider = collisionSysMap.get(collisionOffenderIndex); + const x0 = offenderCollider.x + meleeBullet.hitboxOffset.x, + y0 = offenderCollider.y + meleeBullet.hitboxOffset.y; + const pts = [[0, 0], [meleeBullet.hitboxSize.x, 0], [meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; + const newBulletCollider = collisionSys.createPolygon(x0, y0, pts); + collisionSysMap.set(collisionBulletIndex, newBulletCollider); + console.log(`A rising-edge of meleeBullet=${JSON.stringify(meleeBullet)} is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended`); + } + toRet.meleeBullets.push(meleeBullet); + } + + collisionSys.update(); + const result = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? + + for (let j in self.playerRichInfoArr) { + const joinIndex = parseInt(j) + 1; + const playerId = self.playerRichInfoArr[j].id; + const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; + const playerCollider = collisionSysMap.get(collisionPlayerIndex); + const potentials = playerCollider.potentials(); + for (const potential of potentials) { + // Test if the player collides with the wall + if (!playerCollider.collides(potential, result)) continue; + // Push the player out of the wall + effPushbacks[joinIndex - 1][0] += result.overlap * result.overlap_x; + effPushbacks[joinIndex - 1][1] += result.overlap * result.overlap_y; + } + } + + for (let j in self.playerRichInfoArr) { + const joinIndex = parseInt(j) + 1; + const playerId = self.playerRichInfoArr[j].id; + const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; + const playerCollider = collisionSysMap.get(collisionPlayerIndex); + const newVpos = self.playerColliderAnchorToVirtualGridPos(playerCollider.x - effPushbacks[joinIndex - 1][0], playerCollider.y - effPushbacks[joinIndex - 1][1], self.playerRichInfoArr[j]); + nextRenderFramePlayers[playerId].virtualGridX = newVpos[0]; + nextRenderFramePlayers[playerId].virtualGridY = newVpos[1]; + } + } + + return toRet; + }, }); diff --git a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index 6a40721..6eac069 100644 --- a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js +++ b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js @@ -2025,6 +2025,10 @@ $root.protos = (function() { * @property {boolean|null} [removed] PlayerDownsync removed * @property {number|null} [score] PlayerDownsync score * @property {number|null} [lastMoveGmtMillis] PlayerDownsync lastMoveGmtMillis + * @property {number|null} [framesToRecover] PlayerDownsync framesToRecover + * @property {number|null} [hp] PlayerDownsync hp + * @property {number|null} [maxHp] PlayerDownsync maxHp + * @property {number|null} [characterState] PlayerDownsync characterState * @property {string|null} [name] PlayerDownsync name * @property {string|null} [displayName] PlayerDownsync displayName * @property {string|null} [avatar] PlayerDownsync avatar @@ -2133,6 +2137,38 @@ $root.protos = (function() { */ PlayerDownsync.prototype.lastMoveGmtMillis = 0; + /** + * PlayerDownsync framesToRecover. + * @member {number} framesToRecover + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.framesToRecover = 0; + + /** + * PlayerDownsync hp. + * @member {number} hp + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.hp = 0; + + /** + * PlayerDownsync maxHp. + * @member {number} maxHp + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.maxHp = 0; + + /** + * PlayerDownsync characterState. + * @member {number} characterState + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.characterState = 0; + /** * PlayerDownsync name. * @member {string} name @@ -2203,12 +2239,20 @@ $root.protos = (function() { writer.uint32(/* id 10, wireType 0 =*/80).int32(message.score); if (message.lastMoveGmtMillis != null && Object.hasOwnProperty.call(message, "lastMoveGmtMillis")) writer.uint32(/* id 11, wireType 0 =*/88).int32(message.lastMoveGmtMillis); + if (message.framesToRecover != null && Object.hasOwnProperty.call(message, "framesToRecover")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.framesToRecover); + if (message.hp != null && Object.hasOwnProperty.call(message, "hp")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.hp); + if (message.maxHp != null && Object.hasOwnProperty.call(message, "maxHp")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.maxHp); + if (message.characterState != null && Object.hasOwnProperty.call(message, "characterState")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.characterState); if (message.name != null && Object.hasOwnProperty.call(message, "name")) - writer.uint32(/* id 12, wireType 2 =*/98).string(message.name); + writer.uint32(/* id 16, wireType 2 =*/130).string(message.name); if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) - writer.uint32(/* id 13, wireType 2 =*/106).string(message.displayName); + writer.uint32(/* id 17, wireType 2 =*/138).string(message.displayName); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) - writer.uint32(/* id 14, wireType 2 =*/114).string(message.avatar); + writer.uint32(/* id 18, wireType 2 =*/146).string(message.avatar); return writer; }; @@ -2288,14 +2332,30 @@ $root.protos = (function() { break; } case 12: { - message.name = reader.string(); + message.framesToRecover = reader.int32(); break; } case 13: { - message.displayName = reader.string(); + message.hp = reader.int32(); break; } case 14: { + message.maxHp = reader.int32(); + break; + } + case 15: { + message.characterState = reader.int32(); + break; + } + case 16: { + message.name = reader.string(); + break; + } + case 17: { + message.displayName = reader.string(); + break; + } + case 18: { message.avatar = reader.string(); break; } @@ -2369,6 +2429,18 @@ $root.protos = (function() { if (message.lastMoveGmtMillis != null && message.hasOwnProperty("lastMoveGmtMillis")) if (!$util.isInteger(message.lastMoveGmtMillis)) return "lastMoveGmtMillis: integer expected"; + if (message.framesToRecover != null && message.hasOwnProperty("framesToRecover")) + if (!$util.isInteger(message.framesToRecover)) + return "framesToRecover: integer expected"; + if (message.hp != null && message.hasOwnProperty("hp")) + if (!$util.isInteger(message.hp)) + return "hp: integer expected"; + if (message.maxHp != null && message.hasOwnProperty("maxHp")) + if (!$util.isInteger(message.maxHp)) + return "maxHp: integer expected"; + if (message.characterState != null && message.hasOwnProperty("characterState")) + if (!$util.isInteger(message.characterState)) + return "characterState: integer expected"; if (message.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; @@ -2418,6 +2490,14 @@ $root.protos = (function() { message.score = object.score | 0; if (object.lastMoveGmtMillis != null) message.lastMoveGmtMillis = object.lastMoveGmtMillis | 0; + if (object.framesToRecover != null) + message.framesToRecover = object.framesToRecover | 0; + if (object.hp != null) + message.hp = object.hp | 0; + if (object.maxHp != null) + message.maxHp = object.maxHp | 0; + if (object.characterState != null) + message.characterState = object.characterState | 0; if (object.name != null) message.name = String(object.name); if (object.displayName != null) @@ -2452,6 +2532,10 @@ $root.protos = (function() { object.removed = false; object.score = 0; object.lastMoveGmtMillis = 0; + object.framesToRecover = 0; + object.hp = 0; + object.maxHp = 0; + object.characterState = 0; object.name = ""; object.displayName = ""; object.avatar = ""; @@ -2478,6 +2562,14 @@ $root.protos = (function() { object.score = message.score; if (message.lastMoveGmtMillis != null && message.hasOwnProperty("lastMoveGmtMillis")) object.lastMoveGmtMillis = message.lastMoveGmtMillis; + if (message.framesToRecover != null && message.hasOwnProperty("framesToRecover")) + object.framesToRecover = message.framesToRecover; + if (message.hp != null && message.hasOwnProperty("hp")) + object.hp = message.hp; + if (message.maxHp != null && message.hasOwnProperty("maxHp")) + object.maxHp = message.maxHp; + if (message.characterState != null && message.hasOwnProperty("characterState")) + object.characterState = message.characterState; if (message.name != null && message.hasOwnProperty("name")) object.name = message.name; if (message.displayName != null && message.hasOwnProperty("displayName")) @@ -3523,317 +3615,6 @@ $root.protos = (function() { return HeartbeatUpsync; })(); - protos.RoomDownsyncFrame = (function() { - - /** - * Properties of a RoomDownsyncFrame. - * @memberof protos - * @interface IRoomDownsyncFrame - * @property {number|null} [id] RoomDownsyncFrame id - * @property {Object.|null} [players] RoomDownsyncFrame players - * @property {number|Long|null} [countdownNanos] RoomDownsyncFrame countdownNanos - */ - - /** - * Constructs a new RoomDownsyncFrame. - * @memberof protos - * @classdesc Represents a RoomDownsyncFrame. - * @implements IRoomDownsyncFrame - * @constructor - * @param {protos.IRoomDownsyncFrame=} [properties] Properties to set - */ - function RoomDownsyncFrame(properties) { - this.players = {}; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * RoomDownsyncFrame id. - * @member {number} id - * @memberof protos.RoomDownsyncFrame - * @instance - */ - RoomDownsyncFrame.prototype.id = 0; - - /** - * RoomDownsyncFrame players. - * @member {Object.} players - * @memberof protos.RoomDownsyncFrame - * @instance - */ - RoomDownsyncFrame.prototype.players = $util.emptyObject; - - /** - * RoomDownsyncFrame countdownNanos. - * @member {number|Long} countdownNanos - * @memberof protos.RoomDownsyncFrame - * @instance - */ - RoomDownsyncFrame.prototype.countdownNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - - /** - * Creates a new RoomDownsyncFrame instance using the specified properties. - * @function create - * @memberof protos.RoomDownsyncFrame - * @static - * @param {protos.IRoomDownsyncFrame=} [properties] Properties to set - * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame instance - */ - RoomDownsyncFrame.create = function create(properties) { - return new RoomDownsyncFrame(properties); - }; - - /** - * Encodes the specified RoomDownsyncFrame message. Does not implicitly {@link protos.RoomDownsyncFrame.verify|verify} messages. - * @function encode - * @memberof protos.RoomDownsyncFrame - * @static - * @param {protos.RoomDownsyncFrame} message RoomDownsyncFrame message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - RoomDownsyncFrame.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.id != null && Object.hasOwnProperty.call(message, "id")) - writer.uint32(/* id 1, wireType 0 =*/8).int32(message.id); - if (message.players != null && Object.hasOwnProperty.call(message, "players")) - for (var keys = Object.keys(message.players), i = 0; i < keys.length; ++i) { - writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]); - $root.protos.PlayerDownsync.encode(message.players[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); - } - if (message.countdownNanos != null && Object.hasOwnProperty.call(message, "countdownNanos")) - writer.uint32(/* id 3, wireType 0 =*/24).int64(message.countdownNanos); - return writer; - }; - - /** - * Encodes the specified RoomDownsyncFrame message, length delimited. Does not implicitly {@link protos.RoomDownsyncFrame.verify|verify} messages. - * @function encodeDelimited - * @memberof protos.RoomDownsyncFrame - * @static - * @param {protos.RoomDownsyncFrame} message RoomDownsyncFrame message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - RoomDownsyncFrame.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a RoomDownsyncFrame message from the specified reader or buffer. - * @function decode - * @memberof protos.RoomDownsyncFrame - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - RoomDownsyncFrame.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(), key, value; - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: { - message.id = reader.int32(); - break; - } - case 2: { - if (message.players === $util.emptyObject) - message.players = {}; - var end2 = reader.uint32() + reader.pos; - key = 0; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.int32(); - break; - case 2: - value = $root.protos.PlayerDownsync.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.players[key] = value; - break; - } - case 3: { - message.countdownNanos = reader.int64(); - break; - } - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a RoomDownsyncFrame message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof protos.RoomDownsyncFrame - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - RoomDownsyncFrame.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a RoomDownsyncFrame message. - * @function verify - * @memberof protos.RoomDownsyncFrame - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - RoomDownsyncFrame.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.id != null && message.hasOwnProperty("id")) - if (!$util.isInteger(message.id)) - return "id: integer expected"; - if (message.players != null && message.hasOwnProperty("players")) { - if (!$util.isObject(message.players)) - return "players: object expected"; - var key = Object.keys(message.players); - for (var i = 0; i < key.length; ++i) { - if (!$util.key32Re.test(key[i])) - return "players: integer key{k:int32} expected"; - { - var error = $root.protos.PlayerDownsync.verify(message.players[key[i]]); - if (error) - return "players." + error; - } - } - } - if (message.countdownNanos != null && message.hasOwnProperty("countdownNanos")) - if (!$util.isInteger(message.countdownNanos) && !(message.countdownNanos && $util.isInteger(message.countdownNanos.low) && $util.isInteger(message.countdownNanos.high))) - return "countdownNanos: integer|Long expected"; - return null; - }; - - /** - * Creates a RoomDownsyncFrame message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof protos.RoomDownsyncFrame - * @static - * @param {Object.} object Plain object - * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame - */ - RoomDownsyncFrame.fromObject = function fromObject(object) { - if (object instanceof $root.protos.RoomDownsyncFrame) - return object; - var message = new $root.protos.RoomDownsyncFrame(); - if (object.id != null) - message.id = object.id | 0; - if (object.players) { - if (typeof object.players !== "object") - throw TypeError(".protos.RoomDownsyncFrame.players: object expected"); - message.players = {}; - for (var keys = Object.keys(object.players), i = 0; i < keys.length; ++i) { - if (typeof object.players[keys[i]] !== "object") - throw TypeError(".protos.RoomDownsyncFrame.players: object expected"); - message.players[keys[i]] = $root.protos.PlayerDownsync.fromObject(object.players[keys[i]]); - } - } - if (object.countdownNanos != null) - if ($util.Long) - (message.countdownNanos = $util.Long.fromValue(object.countdownNanos)).unsigned = false; - else if (typeof object.countdownNanos === "string") - message.countdownNanos = parseInt(object.countdownNanos, 10); - else if (typeof object.countdownNanos === "number") - message.countdownNanos = object.countdownNanos; - else if (typeof object.countdownNanos === "object") - message.countdownNanos = new $util.LongBits(object.countdownNanos.low >>> 0, object.countdownNanos.high >>> 0).toNumber(); - return message; - }; - - /** - * Creates a plain object from a RoomDownsyncFrame message. Also converts values to other types if specified. - * @function toObject - * @memberof protos.RoomDownsyncFrame - * @static - * @param {protos.RoomDownsyncFrame} message RoomDownsyncFrame - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - RoomDownsyncFrame.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.objects || options.defaults) - object.players = {}; - if (options.defaults) { - object.id = 0; - if ($util.Long) { - var long = new $util.Long(0, 0, false); - object.countdownNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.countdownNanos = options.longs === String ? "0" : 0; - } - if (message.id != null && message.hasOwnProperty("id")) - object.id = message.id; - var keys2; - if (message.players && (keys2 = Object.keys(message.players)).length) { - object.players = {}; - for (var j = 0; j < keys2.length; ++j) - object.players[keys2[j]] = $root.protos.PlayerDownsync.toObject(message.players[keys2[j]], options); - } - if (message.countdownNanos != null && message.hasOwnProperty("countdownNanos")) - if (typeof message.countdownNanos === "number") - object.countdownNanos = options.longs === String ? String(message.countdownNanos) : message.countdownNanos; - else - object.countdownNanos = options.longs === String ? $util.Long.prototype.toString.call(message.countdownNanos) : options.longs === Number ? new $util.LongBits(message.countdownNanos.low >>> 0, message.countdownNanos.high >>> 0).toNumber() : message.countdownNanos; - return object; - }; - - /** - * Converts this RoomDownsyncFrame to JSON. - * @function toJSON - * @memberof protos.RoomDownsyncFrame - * @instance - * @returns {Object.} JSON object - */ - RoomDownsyncFrame.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Gets the default type url for RoomDownsyncFrame - * @function getTypeUrl - * @memberof protos.RoomDownsyncFrame - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - RoomDownsyncFrame.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.RoomDownsyncFrame"; - }; - - return RoomDownsyncFrame; - })(); - protos.WsReq = (function() { /** @@ -4577,6 +4358,926 @@ $root.protos = (function() { return WsResp; })(); + protos.MeleeBullet = (function() { + + /** + * Properties of a MeleeBullet. + * @memberof protos + * @interface IMeleeBullet + * @property {number|null} [battleLocalId] MeleeBullet battleLocalId + * @property {number|null} [startupFrames] MeleeBullet startupFrames + * @property {number|null} [activeFrames] MeleeBullet activeFrames + * @property {number|null} [recoveryFrames] MeleeBullet recoveryFrames + * @property {number|null} [recoveryFramesOnBlock] MeleeBullet recoveryFramesOnBlock + * @property {number|null} [recoveryFramesOnHit] MeleeBullet recoveryFramesOnHit + * @property {sharedprotos.Vec2D|null} [moveforward] MeleeBullet moveforward + * @property {sharedprotos.Vec2D|null} [hitboxOffset] MeleeBullet hitboxOffset + * @property {sharedprotos.Vec2D|null} [hitboxSize] MeleeBullet hitboxSize + * @property {number|null} [offenderJoinIndex] MeleeBullet offenderJoinIndex + * @property {number|null} [originatedRenderFrameId] MeleeBullet originatedRenderFrameId + * @property {number|null} [hitStunFrames] MeleeBullet hitStunFrames + * @property {number|null} [blockStunFrames] MeleeBullet blockStunFrames + * @property {number|null} [pushback] MeleeBullet pushback + * @property {number|null} [releaseTriggerType] MeleeBullet releaseTriggerType + * @property {number|null} [damage] MeleeBullet damage + */ + + /** + * Constructs a new MeleeBullet. + * @memberof protos + * @classdesc Represents a MeleeBullet. + * @implements IMeleeBullet + * @constructor + * @param {protos.IMeleeBullet=} [properties] Properties to set + */ + function MeleeBullet(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MeleeBullet battleLocalId. + * @member {number} battleLocalId + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.battleLocalId = 0; + + /** + * MeleeBullet startupFrames. + * @member {number} startupFrames + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.startupFrames = 0; + + /** + * MeleeBullet activeFrames. + * @member {number} activeFrames + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.activeFrames = 0; + + /** + * MeleeBullet recoveryFrames. + * @member {number} recoveryFrames + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.recoveryFrames = 0; + + /** + * MeleeBullet recoveryFramesOnBlock. + * @member {number} recoveryFramesOnBlock + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.recoveryFramesOnBlock = 0; + + /** + * MeleeBullet recoveryFramesOnHit. + * @member {number} recoveryFramesOnHit + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.recoveryFramesOnHit = 0; + + /** + * MeleeBullet moveforward. + * @member {sharedprotos.Vec2D|null|undefined} moveforward + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.moveforward = null; + + /** + * MeleeBullet hitboxOffset. + * @member {sharedprotos.Vec2D|null|undefined} hitboxOffset + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.hitboxOffset = null; + + /** + * MeleeBullet hitboxSize. + * @member {sharedprotos.Vec2D|null|undefined} hitboxSize + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.hitboxSize = null; + + /** + * MeleeBullet offenderJoinIndex. + * @member {number} offenderJoinIndex + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.offenderJoinIndex = 0; + + /** + * MeleeBullet originatedRenderFrameId. + * @member {number} originatedRenderFrameId + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.originatedRenderFrameId = 0; + + /** + * MeleeBullet hitStunFrames. + * @member {number} hitStunFrames + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.hitStunFrames = 0; + + /** + * MeleeBullet blockStunFrames. + * @member {number} blockStunFrames + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.blockStunFrames = 0; + + /** + * MeleeBullet pushback. + * @member {number} pushback + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.pushback = 0; + + /** + * MeleeBullet releaseTriggerType. + * @member {number} releaseTriggerType + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.releaseTriggerType = 0; + + /** + * MeleeBullet damage. + * @member {number} damage + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.damage = 0; + + /** + * Creates a new MeleeBullet instance using the specified properties. + * @function create + * @memberof protos.MeleeBullet + * @static + * @param {protos.IMeleeBullet=} [properties] Properties to set + * @returns {protos.MeleeBullet} MeleeBullet instance + */ + MeleeBullet.create = function create(properties) { + return new MeleeBullet(properties); + }; + + /** + * Encodes the specified MeleeBullet message. Does not implicitly {@link protos.MeleeBullet.verify|verify} messages. + * @function encode + * @memberof protos.MeleeBullet + * @static + * @param {protos.MeleeBullet} message MeleeBullet message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MeleeBullet.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.battleLocalId != null && Object.hasOwnProperty.call(message, "battleLocalId")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.battleLocalId); + if (message.startupFrames != null && Object.hasOwnProperty.call(message, "startupFrames")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.startupFrames); + if (message.activeFrames != null && Object.hasOwnProperty.call(message, "activeFrames")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.activeFrames); + if (message.recoveryFrames != null && Object.hasOwnProperty.call(message, "recoveryFrames")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.recoveryFrames); + if (message.recoveryFramesOnBlock != null && Object.hasOwnProperty.call(message, "recoveryFramesOnBlock")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.recoveryFramesOnBlock); + if (message.recoveryFramesOnHit != null && Object.hasOwnProperty.call(message, "recoveryFramesOnHit")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.recoveryFramesOnHit); + if (message.moveforward != null && Object.hasOwnProperty.call(message, "moveforward")) + $root.sharedprotos.Vec2D.encode(message.moveforward, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.hitboxOffset != null && Object.hasOwnProperty.call(message, "hitboxOffset")) + $root.sharedprotos.Vec2D.encode(message.hitboxOffset, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.hitboxSize != null && Object.hasOwnProperty.call(message, "hitboxSize")) + $root.sharedprotos.Vec2D.encode(message.hitboxSize, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); + if (message.offenderJoinIndex != null && Object.hasOwnProperty.call(message, "offenderJoinIndex")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.offenderJoinIndex); + if (message.originatedRenderFrameId != null && Object.hasOwnProperty.call(message, "originatedRenderFrameId")) + writer.uint32(/* id 11, wireType 0 =*/88).int32(message.originatedRenderFrameId); + if (message.hitStunFrames != null && Object.hasOwnProperty.call(message, "hitStunFrames")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.hitStunFrames); + if (message.blockStunFrames != null && Object.hasOwnProperty.call(message, "blockStunFrames")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.blockStunFrames); + if (message.pushback != null && Object.hasOwnProperty.call(message, "pushback")) + writer.uint32(/* id 14, wireType 1 =*/113).double(message.pushback); + if (message.releaseTriggerType != null && Object.hasOwnProperty.call(message, "releaseTriggerType")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.releaseTriggerType); + if (message.damage != null && Object.hasOwnProperty.call(message, "damage")) + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.damage); + return writer; + }; + + /** + * Encodes the specified MeleeBullet message, length delimited. Does not implicitly {@link protos.MeleeBullet.verify|verify} messages. + * @function encodeDelimited + * @memberof protos.MeleeBullet + * @static + * @param {protos.MeleeBullet} message MeleeBullet message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MeleeBullet.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MeleeBullet message from the specified reader or buffer. + * @function decode + * @memberof protos.MeleeBullet + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {protos.MeleeBullet} MeleeBullet + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MeleeBullet.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.MeleeBullet(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.battleLocalId = reader.int32(); + break; + } + case 2: { + message.startupFrames = reader.int32(); + break; + } + case 3: { + message.activeFrames = reader.int32(); + break; + } + case 4: { + message.recoveryFrames = reader.int32(); + break; + } + case 5: { + message.recoveryFramesOnBlock = reader.int32(); + break; + } + case 6: { + message.recoveryFramesOnHit = reader.int32(); + break; + } + case 7: { + message.moveforward = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + } + case 8: { + message.hitboxOffset = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + } + case 9: { + message.hitboxSize = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + } + case 10: { + message.offenderJoinIndex = reader.int32(); + break; + } + case 11: { + message.originatedRenderFrameId = reader.int32(); + break; + } + case 12: { + message.hitStunFrames = reader.int32(); + break; + } + case 13: { + message.blockStunFrames = reader.int32(); + break; + } + case 14: { + message.pushback = reader.double(); + break; + } + case 15: { + message.releaseTriggerType = reader.int32(); + break; + } + case 16: { + message.damage = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MeleeBullet message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof protos.MeleeBullet + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {protos.MeleeBullet} MeleeBullet + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MeleeBullet.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MeleeBullet message. + * @function verify + * @memberof protos.MeleeBullet + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MeleeBullet.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.battleLocalId != null && message.hasOwnProperty("battleLocalId")) + if (!$util.isInteger(message.battleLocalId)) + return "battleLocalId: integer expected"; + if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) + if (!$util.isInteger(message.startupFrames)) + return "startupFrames: integer expected"; + if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) + if (!$util.isInteger(message.activeFrames)) + return "activeFrames: integer expected"; + if (message.recoveryFrames != null && message.hasOwnProperty("recoveryFrames")) + if (!$util.isInteger(message.recoveryFrames)) + return "recoveryFrames: integer expected"; + if (message.recoveryFramesOnBlock != null && message.hasOwnProperty("recoveryFramesOnBlock")) + if (!$util.isInteger(message.recoveryFramesOnBlock)) + return "recoveryFramesOnBlock: integer expected"; + if (message.recoveryFramesOnHit != null && message.hasOwnProperty("recoveryFramesOnHit")) + if (!$util.isInteger(message.recoveryFramesOnHit)) + return "recoveryFramesOnHit: integer expected"; + if (message.moveforward != null && message.hasOwnProperty("moveforward")) { + var error = $root.sharedprotos.Vec2D.verify(message.moveforward); + if (error) + return "moveforward." + error; + } + if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) { + var error = $root.sharedprotos.Vec2D.verify(message.hitboxOffset); + if (error) + return "hitboxOffset." + error; + } + if (message.hitboxSize != null && message.hasOwnProperty("hitboxSize")) { + var error = $root.sharedprotos.Vec2D.verify(message.hitboxSize); + if (error) + return "hitboxSize." + error; + } + if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + if (!$util.isInteger(message.offenderJoinIndex)) + return "offenderJoinIndex: integer expected"; + if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) + if (!$util.isInteger(message.originatedRenderFrameId)) + return "originatedRenderFrameId: integer expected"; + if (message.hitStunFrames != null && message.hasOwnProperty("hitStunFrames")) + if (!$util.isInteger(message.hitStunFrames)) + return "hitStunFrames: integer expected"; + if (message.blockStunFrames != null && message.hasOwnProperty("blockStunFrames")) + if (!$util.isInteger(message.blockStunFrames)) + return "blockStunFrames: integer expected"; + if (message.pushback != null && message.hasOwnProperty("pushback")) + if (typeof message.pushback !== "number") + return "pushback: number expected"; + if (message.releaseTriggerType != null && message.hasOwnProperty("releaseTriggerType")) + if (!$util.isInteger(message.releaseTriggerType)) + return "releaseTriggerType: integer expected"; + if (message.damage != null && message.hasOwnProperty("damage")) + if (!$util.isInteger(message.damage)) + return "damage: integer expected"; + return null; + }; + + /** + * Creates a MeleeBullet message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof protos.MeleeBullet + * @static + * @param {Object.} object Plain object + * @returns {protos.MeleeBullet} MeleeBullet + */ + MeleeBullet.fromObject = function fromObject(object) { + if (object instanceof $root.protos.MeleeBullet) + return object; + var message = new $root.protos.MeleeBullet(); + if (object.battleLocalId != null) + message.battleLocalId = object.battleLocalId | 0; + if (object.startupFrames != null) + message.startupFrames = object.startupFrames | 0; + if (object.activeFrames != null) + message.activeFrames = object.activeFrames | 0; + if (object.recoveryFrames != null) + message.recoveryFrames = object.recoveryFrames | 0; + if (object.recoveryFramesOnBlock != null) + message.recoveryFramesOnBlock = object.recoveryFramesOnBlock | 0; + if (object.recoveryFramesOnHit != null) + message.recoveryFramesOnHit = object.recoveryFramesOnHit | 0; + if (object.moveforward != null) { + if (typeof object.moveforward !== "object") + throw TypeError(".protos.MeleeBullet.moveforward: object expected"); + message.moveforward = $root.sharedprotos.Vec2D.fromObject(object.moveforward); + } + if (object.hitboxOffset != null) { + if (typeof object.hitboxOffset !== "object") + throw TypeError(".protos.MeleeBullet.hitboxOffset: object expected"); + message.hitboxOffset = $root.sharedprotos.Vec2D.fromObject(object.hitboxOffset); + } + if (object.hitboxSize != null) { + if (typeof object.hitboxSize !== "object") + throw TypeError(".protos.MeleeBullet.hitboxSize: object expected"); + message.hitboxSize = $root.sharedprotos.Vec2D.fromObject(object.hitboxSize); + } + if (object.offenderJoinIndex != null) + message.offenderJoinIndex = object.offenderJoinIndex | 0; + if (object.originatedRenderFrameId != null) + message.originatedRenderFrameId = object.originatedRenderFrameId | 0; + if (object.hitStunFrames != null) + message.hitStunFrames = object.hitStunFrames | 0; + if (object.blockStunFrames != null) + message.blockStunFrames = object.blockStunFrames | 0; + if (object.pushback != null) + message.pushback = Number(object.pushback); + if (object.releaseTriggerType != null) + message.releaseTriggerType = object.releaseTriggerType | 0; + if (object.damage != null) + message.damage = object.damage | 0; + return message; + }; + + /** + * Creates a plain object from a MeleeBullet message. Also converts values to other types if specified. + * @function toObject + * @memberof protos.MeleeBullet + * @static + * @param {protos.MeleeBullet} message MeleeBullet + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MeleeBullet.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.battleLocalId = 0; + object.startupFrames = 0; + object.activeFrames = 0; + object.recoveryFrames = 0; + object.recoveryFramesOnBlock = 0; + object.recoveryFramesOnHit = 0; + object.moveforward = null; + object.hitboxOffset = null; + object.hitboxSize = null; + object.offenderJoinIndex = 0; + object.originatedRenderFrameId = 0; + object.hitStunFrames = 0; + object.blockStunFrames = 0; + object.pushback = 0; + object.releaseTriggerType = 0; + object.damage = 0; + } + if (message.battleLocalId != null && message.hasOwnProperty("battleLocalId")) + object.battleLocalId = message.battleLocalId; + if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) + object.startupFrames = message.startupFrames; + if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) + object.activeFrames = message.activeFrames; + if (message.recoveryFrames != null && message.hasOwnProperty("recoveryFrames")) + object.recoveryFrames = message.recoveryFrames; + if (message.recoveryFramesOnBlock != null && message.hasOwnProperty("recoveryFramesOnBlock")) + object.recoveryFramesOnBlock = message.recoveryFramesOnBlock; + if (message.recoveryFramesOnHit != null && message.hasOwnProperty("recoveryFramesOnHit")) + object.recoveryFramesOnHit = message.recoveryFramesOnHit; + if (message.moveforward != null && message.hasOwnProperty("moveforward")) + object.moveforward = $root.sharedprotos.Vec2D.toObject(message.moveforward, options); + if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) + object.hitboxOffset = $root.sharedprotos.Vec2D.toObject(message.hitboxOffset, options); + if (message.hitboxSize != null && message.hasOwnProperty("hitboxSize")) + object.hitboxSize = $root.sharedprotos.Vec2D.toObject(message.hitboxSize, options); + if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + object.offenderJoinIndex = message.offenderJoinIndex; + if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) + object.originatedRenderFrameId = message.originatedRenderFrameId; + if (message.hitStunFrames != null && message.hasOwnProperty("hitStunFrames")) + object.hitStunFrames = message.hitStunFrames; + if (message.blockStunFrames != null && message.hasOwnProperty("blockStunFrames")) + object.blockStunFrames = message.blockStunFrames; + if (message.pushback != null && message.hasOwnProperty("pushback")) + object.pushback = options.json && !isFinite(message.pushback) ? String(message.pushback) : message.pushback; + if (message.releaseTriggerType != null && message.hasOwnProperty("releaseTriggerType")) + object.releaseTriggerType = message.releaseTriggerType; + if (message.damage != null && message.hasOwnProperty("damage")) + object.damage = message.damage; + return object; + }; + + /** + * Converts this MeleeBullet to JSON. + * @function toJSON + * @memberof protos.MeleeBullet + * @instance + * @returns {Object.} JSON object + */ + MeleeBullet.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for MeleeBullet + * @function getTypeUrl + * @memberof protos.MeleeBullet + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + MeleeBullet.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.MeleeBullet"; + }; + + return MeleeBullet; + })(); + + protos.RoomDownsyncFrame = (function() { + + /** + * Properties of a RoomDownsyncFrame. + * @memberof protos + * @interface IRoomDownsyncFrame + * @property {number|null} [id] RoomDownsyncFrame id + * @property {Object.|null} [players] RoomDownsyncFrame players + * @property {number|Long|null} [countdownNanos] RoomDownsyncFrame countdownNanos + * @property {Array.|null} [meleeBullets] RoomDownsyncFrame meleeBullets + */ + + /** + * Constructs a new RoomDownsyncFrame. + * @memberof protos + * @classdesc Represents a RoomDownsyncFrame. + * @implements IRoomDownsyncFrame + * @constructor + * @param {protos.IRoomDownsyncFrame=} [properties] Properties to set + */ + function RoomDownsyncFrame(properties) { + this.players = {}; + this.meleeBullets = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RoomDownsyncFrame id. + * @member {number} id + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.id = 0; + + /** + * RoomDownsyncFrame players. + * @member {Object.} players + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.players = $util.emptyObject; + + /** + * RoomDownsyncFrame countdownNanos. + * @member {number|Long} countdownNanos + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.countdownNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * RoomDownsyncFrame meleeBullets. + * @member {Array.} meleeBullets + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.meleeBullets = $util.emptyArray; + + /** + * Creates a new RoomDownsyncFrame instance using the specified properties. + * @function create + * @memberof protos.RoomDownsyncFrame + * @static + * @param {protos.IRoomDownsyncFrame=} [properties] Properties to set + * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame instance + */ + RoomDownsyncFrame.create = function create(properties) { + return new RoomDownsyncFrame(properties); + }; + + /** + * Encodes the specified RoomDownsyncFrame message. Does not implicitly {@link protos.RoomDownsyncFrame.verify|verify} messages. + * @function encode + * @memberof protos.RoomDownsyncFrame + * @static + * @param {protos.RoomDownsyncFrame} message RoomDownsyncFrame message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RoomDownsyncFrame.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.id); + if (message.players != null && Object.hasOwnProperty.call(message, "players")) + for (var keys = Object.keys(message.players), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]); + $root.protos.PlayerDownsync.encode(message.players[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + if (message.countdownNanos != null && Object.hasOwnProperty.call(message, "countdownNanos")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.countdownNanos); + if (message.meleeBullets != null && message.meleeBullets.length) + for (var i = 0; i < message.meleeBullets.length; ++i) + $root.protos.MeleeBullet.encode(message.meleeBullets[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified RoomDownsyncFrame message, length delimited. Does not implicitly {@link protos.RoomDownsyncFrame.verify|verify} messages. + * @function encodeDelimited + * @memberof protos.RoomDownsyncFrame + * @static + * @param {protos.RoomDownsyncFrame} message RoomDownsyncFrame message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RoomDownsyncFrame.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RoomDownsyncFrame message from the specified reader or buffer. + * @function decode + * @memberof protos.RoomDownsyncFrame + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RoomDownsyncFrame.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(), key, value; + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.id = reader.int32(); + break; + } + case 2: { + if (message.players === $util.emptyObject) + message.players = {}; + var end2 = reader.uint32() + reader.pos; + key = 0; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.int32(); + break; + case 2: + value = $root.protos.PlayerDownsync.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.players[key] = value; + break; + } + case 3: { + message.countdownNanos = reader.int64(); + break; + } + case 4: { + if (!(message.meleeBullets && message.meleeBullets.length)) + message.meleeBullets = []; + message.meleeBullets.push($root.protos.MeleeBullet.decode(reader, reader.uint32())); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RoomDownsyncFrame message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof protos.RoomDownsyncFrame + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RoomDownsyncFrame.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RoomDownsyncFrame message. + * @function verify + * @memberof protos.RoomDownsyncFrame + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RoomDownsyncFrame.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isInteger(message.id)) + return "id: integer expected"; + if (message.players != null && message.hasOwnProperty("players")) { + if (!$util.isObject(message.players)) + return "players: object expected"; + var key = Object.keys(message.players); + for (var i = 0; i < key.length; ++i) { + if (!$util.key32Re.test(key[i])) + return "players: integer key{k:int32} expected"; + { + var error = $root.protos.PlayerDownsync.verify(message.players[key[i]]); + if (error) + return "players." + error; + } + } + } + if (message.countdownNanos != null && message.hasOwnProperty("countdownNanos")) + if (!$util.isInteger(message.countdownNanos) && !(message.countdownNanos && $util.isInteger(message.countdownNanos.low) && $util.isInteger(message.countdownNanos.high))) + return "countdownNanos: integer|Long expected"; + if (message.meleeBullets != null && message.hasOwnProperty("meleeBullets")) { + if (!Array.isArray(message.meleeBullets)) + return "meleeBullets: array expected"; + for (var i = 0; i < message.meleeBullets.length; ++i) { + var error = $root.protos.MeleeBullet.verify(message.meleeBullets[i]); + if (error) + return "meleeBullets." + error; + } + } + return null; + }; + + /** + * Creates a RoomDownsyncFrame message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof protos.RoomDownsyncFrame + * @static + * @param {Object.} object Plain object + * @returns {protos.RoomDownsyncFrame} RoomDownsyncFrame + */ + RoomDownsyncFrame.fromObject = function fromObject(object) { + if (object instanceof $root.protos.RoomDownsyncFrame) + return object; + var message = new $root.protos.RoomDownsyncFrame(); + if (object.id != null) + message.id = object.id | 0; + if (object.players) { + if (typeof object.players !== "object") + throw TypeError(".protos.RoomDownsyncFrame.players: object expected"); + message.players = {}; + for (var keys = Object.keys(object.players), i = 0; i < keys.length; ++i) { + if (typeof object.players[keys[i]] !== "object") + throw TypeError(".protos.RoomDownsyncFrame.players: object expected"); + message.players[keys[i]] = $root.protos.PlayerDownsync.fromObject(object.players[keys[i]]); + } + } + if (object.countdownNanos != null) + if ($util.Long) + (message.countdownNanos = $util.Long.fromValue(object.countdownNanos)).unsigned = false; + else if (typeof object.countdownNanos === "string") + message.countdownNanos = parseInt(object.countdownNanos, 10); + else if (typeof object.countdownNanos === "number") + message.countdownNanos = object.countdownNanos; + else if (typeof object.countdownNanos === "object") + message.countdownNanos = new $util.LongBits(object.countdownNanos.low >>> 0, object.countdownNanos.high >>> 0).toNumber(); + if (object.meleeBullets) { + if (!Array.isArray(object.meleeBullets)) + throw TypeError(".protos.RoomDownsyncFrame.meleeBullets: array expected"); + message.meleeBullets = []; + for (var i = 0; i < object.meleeBullets.length; ++i) { + if (typeof object.meleeBullets[i] !== "object") + throw TypeError(".protos.RoomDownsyncFrame.meleeBullets: object expected"); + message.meleeBullets[i] = $root.protos.MeleeBullet.fromObject(object.meleeBullets[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a RoomDownsyncFrame message. Also converts values to other types if specified. + * @function toObject + * @memberof protos.RoomDownsyncFrame + * @static + * @param {protos.RoomDownsyncFrame} message RoomDownsyncFrame + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RoomDownsyncFrame.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.meleeBullets = []; + if (options.objects || options.defaults) + object.players = {}; + if (options.defaults) { + object.id = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.countdownNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.countdownNanos = options.longs === String ? "0" : 0; + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + var keys2; + if (message.players && (keys2 = Object.keys(message.players)).length) { + object.players = {}; + for (var j = 0; j < keys2.length; ++j) + object.players[keys2[j]] = $root.protos.PlayerDownsync.toObject(message.players[keys2[j]], options); + } + if (message.countdownNanos != null && message.hasOwnProperty("countdownNanos")) + if (typeof message.countdownNanos === "number") + object.countdownNanos = options.longs === String ? String(message.countdownNanos) : message.countdownNanos; + else + object.countdownNanos = options.longs === String ? $util.Long.prototype.toString.call(message.countdownNanos) : options.longs === Number ? new $util.LongBits(message.countdownNanos.low >>> 0, message.countdownNanos.high >>> 0).toNumber() : message.countdownNanos; + if (message.meleeBullets && message.meleeBullets.length) { + object.meleeBullets = []; + for (var j = 0; j < message.meleeBullets.length; ++j) + object.meleeBullets[j] = $root.protos.MeleeBullet.toObject(message.meleeBullets[j], options); + } + return object; + }; + + /** + * Converts this RoomDownsyncFrame to JSON. + * @function toJSON + * @memberof protos.RoomDownsyncFrame + * @instance + * @returns {Object.} JSON object + */ + RoomDownsyncFrame.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for RoomDownsyncFrame + * @function getTypeUrl + * @memberof protos.RoomDownsyncFrame + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + RoomDownsyncFrame.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.RoomDownsyncFrame"; + }; + + return RoomDownsyncFrame; + })(); + return protos; })(); From 58c18ab7ae30949e34bfe9d66f2f0824ee2342d4 Mon Sep 17 00:00:00 2001 From: yflu Date: Wed, 23 Nov 2022 12:30:30 +0800 Subject: [PATCH 3/6] Drafted rollback compatible bullet lifecycle events. --- battle_srv/models/room.go | 5 +- battle_srv/protos/room_downsync_frame.pb.go | 423 +++--- battle_srv/ws/serve.go | 1 + dnmshared/sharedprotos/geometry.pb.go | 2 +- .../pbfiles/room_downsync_frame.proto | 19 +- frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map_1.fire | 2 +- frontend/assets/scripts/AttackingCharacter.js | 1 + frontend/assets/scripts/Map.js | 7 +- frontend/assets/scripts/OfflineMap.js | 179 ++- ...om_downsync_frame_proto_bundle.forcemsg.js | 1270 ++++++----------- 11 files changed, 839 insertions(+), 1072 deletions(-) diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index e91ce66..adfecc1 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -773,9 +773,10 @@ func (pR *Room) OnDismissed() { pR.PlayerSignalToCloseDict = make(map[int32]SignalToCloseConnCbType) pR.JoinIndexBooleanArr = make([]bool, pR.Capacity) pR.Barriers = make(map[int32]*Barrier) - pR.InputsBuffer = NewRingBuffer(1024) + pR.RenderCacheSize = 256 + pR.RenderFrameBuffer = NewRingBuffer(pR.RenderCacheSize) pR.DiscreteInputsBuffer = sync.Map{} - pR.RenderFrameBuffer = NewRingBuffer(1024) + pR.InputsBuffer = NewRingBuffer((pR.RenderCacheSize >> 2)+1) pR.LastAllConfirmedInputFrameId = -1 pR.LastAllConfirmedInputFrameIdWithChange = -1 diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index b84ce1b..86bc8e7 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.4 +// protoc v3.7.1 // source: room_downsync_frame.proto package protos @@ -49,6 +49,7 @@ type BattleColliderInfo struct { WorldToVirtualGridRatio float64 `protobuf:"fixed64,21,opt,name=worldToVirtualGridRatio,proto3" json:"worldToVirtualGridRatio,omitempty"` VirtualGridToWorldRatio float64 `protobuf:"fixed64,22,opt,name=virtualGridToWorldRatio,proto3" json:"virtualGridToWorldRatio,omitempty"` SpAtkLookupFrames int32 `protobuf:"varint,23,opt,name=spAtkLookupFrames,proto3" json:"spAtkLookupFrames,omitempty"` + RenderCacheSize int32 `protobuf:"varint,24,opt,name=renderCacheSize,proto3" json:"renderCacheSize,omitempty"` } func (x *BattleColliderInfo) Reset() { @@ -244,6 +245,13 @@ func (x *BattleColliderInfo) GetSpAtkLookupFrames() int32 { return 0 } +func (x *BattleColliderInfo) GetRenderCacheSize() int32 { + if x != nil { + return x.RenderCacheSize + } + return 0 +} + type PlayerDownsync struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -858,16 +866,17 @@ type MeleeBullet struct { RecoveryFramesOnBlock int32 `protobuf:"varint,5,opt,name=recoveryFramesOnBlock,proto3" json:"recoveryFramesOnBlock,omitempty"` RecoveryFramesOnHit int32 `protobuf:"varint,6,opt,name=recoveryFramesOnHit,proto3" json:"recoveryFramesOnHit,omitempty"` Moveforward *sharedprotos.Vec2D `protobuf:"bytes,7,opt,name=moveforward,proto3" json:"moveforward,omitempty"` - HitboxOffset *sharedprotos.Vec2D `protobuf:"bytes,8,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` + HitboxOffset float64 `protobuf:"fixed64,8,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` HitboxSize *sharedprotos.Vec2D `protobuf:"bytes,9,opt,name=hitboxSize,proto3" json:"hitboxSize,omitempty"` - OffenderJoinIndex int32 `protobuf:"varint,10,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` - OriginatedRenderFrameId int32 `protobuf:"varint,11,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` + OriginatedRenderFrameId int32 `protobuf:"varint,10,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` // for defender - HitStunFrames int32 `protobuf:"varint,12,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` - BlockStunFrames int32 `protobuf:"varint,13,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` - Pushback float64 `protobuf:"fixed64,14,opt,name=pushback,proto3" json:"pushback,omitempty"` - ReleaseTriggerType int32 `protobuf:"varint,15,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge - Damage int32 `protobuf:"varint,16,opt,name=damage,proto3" json:"damage,omitempty"` + HitStunFrames int32 `protobuf:"varint,11,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` + BlockStunFrames int32 `protobuf:"varint,12,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` + Pushback float64 `protobuf:"fixed64,13,opt,name=pushback,proto3" json:"pushback,omitempty"` + ReleaseTriggerType int32 `protobuf:"varint,14,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge + Damage int32 `protobuf:"varint,15,opt,name=damage,proto3" json:"damage,omitempty"` + OffenderJoinIndex int32 `protobuf:"varint,16,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` + OffenderPlayerId int32 `protobuf:"varint,17,opt,name=offenderPlayerId,proto3" json:"offenderPlayerId,omitempty"` } func (x *MeleeBullet) Reset() { @@ -951,11 +960,11 @@ func (x *MeleeBullet) GetMoveforward() *sharedprotos.Vec2D { return nil } -func (x *MeleeBullet) GetHitboxOffset() *sharedprotos.Vec2D { +func (x *MeleeBullet) GetHitboxOffset() float64 { if x != nil { return x.HitboxOffset } - return nil + return 0 } func (x *MeleeBullet) GetHitboxSize() *sharedprotos.Vec2D { @@ -965,13 +974,6 @@ func (x *MeleeBullet) GetHitboxSize() *sharedprotos.Vec2D { return nil } -func (x *MeleeBullet) GetOffenderJoinIndex() int32 { - if x != nil { - return x.OffenderJoinIndex - } - return 0 -} - func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { if x != nil { return x.OriginatedRenderFrameId @@ -1014,6 +1016,20 @@ func (x *MeleeBullet) GetDamage() int32 { return 0 } +func (x *MeleeBullet) GetOffenderJoinIndex() int32 { + if x != nil { + return x.OffenderJoinIndex + } + return 0 +} + +func (x *MeleeBullet) GetOffenderPlayerId() int32 { + if x != nil { + return x.OffenderPlayerId + } + return 0 +} + type RoomDownsyncFrame struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1091,7 +1107,7 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x0a, 0x19, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x1a, 0x0e, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x82, 0x0b, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, + 0x6f, 0x74, 0x6f, 0x22, 0xac, 0x0b, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x54, @@ -1167,178 +1183,182 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, - 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x65, 0x0a, 0x1a, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, - 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, - 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb5, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, - 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, - 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, - 0x69, 0x64, 0x59, 0x12, 0x29, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, - 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, - 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, - 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, - 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x68, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x78, 0x48, 0x70, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x48, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, - 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, - 0x61, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, - 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, - 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, - 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, + 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x5d, 0x0a, 0x16, + 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, 0x1a, 0x53, + 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xb5, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, + 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x29, 0x0a, + 0x03, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, + 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, + 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, + 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, + 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, + 0x0a, 0x02, 0x68, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, + 0x0a, 0x05, 0x6d, 0x61, 0x78, 0x48, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, + 0x61, 0x78, 0x48, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, + 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, + 0x0e, 0x0a, 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, + 0x0e, 0x0a, 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, + 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, + 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, + 0x7c, 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, + 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, + 0x0f, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, + 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, + 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, + 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, - 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, - 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, - 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, - 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, - 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0xce, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, - 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, - 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, - 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, - 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, - 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x37, - 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, - 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2c, 0x0a, 0x11, - 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, - 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, - 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, - 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, - 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, - 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, - 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, - 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, - 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, - 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, - 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, - 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, - 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, + 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, + 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, + 0x63, 0x52, 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, + 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, + 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, + 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, + 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, + 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, + 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, + 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x22, 0xe5, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, + 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x30, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, + 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, + 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, + 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, + 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, + 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, + 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, + 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, + 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, + 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, + 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x0a, + 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x52, 0x6f, + 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x40, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, + 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, + 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, + 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, + 0x5f, 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1383,18 +1403,17 @@ var file_room_downsync_frame_proto_depIdxs = []int32{ 4, // 6: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync 0, // 7: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo 14, // 8: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D - 14, // 9: protos.MeleeBullet.hitboxOffset:type_name -> sharedprotos.Vec2D - 14, // 10: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D - 12, // 11: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry - 8, // 12: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet - 15, // 13: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList - 16, // 14: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList - 1, // 15: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync - 16, // [16:16] is the sub-list for method output_type - 16, // [16:16] is the sub-list for method input_type - 16, // [16:16] is the sub-list for extension type_name - 16, // [16:16] is the sub-list for extension extendee - 0, // [0:16] is the sub-list for field type_name + 14, // 9: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D + 12, // 10: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry + 8, // 11: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet + 15, // 12: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList + 16, // 13: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList + 1, // 14: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_room_downsync_frame_proto_init() } diff --git a/battle_srv/ws/serve.go b/battle_srv/ws/serve.go index 9d5a921..04de98c 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -271,6 +271,7 @@ func Serve(c *gin.Context) { VirtualGridToWorldRatio: pRoom.VirtualGridToWorldRatio, SpAtkLookupFrames: pRoom.SpAtkLookupFrames, + RenderCacheSize: pRoom.RenderCacheSize, } resp := &pb.WsResp{ diff --git a/dnmshared/sharedprotos/geometry.pb.go b/dnmshared/sharedprotos/geometry.pb.go index b96f64b..e3aedc9 100644 --- a/dnmshared/sharedprotos/geometry.pb.go +++ b/dnmshared/sharedprotos/geometry.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.4 +// protoc v3.7.1 // source: geometry.proto package sharedprotos diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index 1242f1b..ce89922 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -31,6 +31,7 @@ message BattleColliderInfo { double virtualGridToWorldRatio = 22; int32 spAtkLookupFrames = 23; + int32 renderCacheSize = 24; } message PlayerDownsync { @@ -108,18 +109,20 @@ message MeleeBullet { int32 recoveryFramesOnBlock = 5; int32 recoveryFramesOnHit = 6; sharedprotos.Vec2D moveforward = 7; - sharedprotos.Vec2D hitboxOffset = 8; + double hitboxOffset = 8; sharedprotos.Vec2D hitboxSize = 9; - int32 offenderJoinIndex = 10; - int32 originatedRenderFrameId = 11; + int32 originatedRenderFrameId = 10; // for defender - int32 hitStunFrames = 12; - int32 blockStunFrames = 13; - double pushback = 14; + int32 hitStunFrames = 11; + int32 blockStunFrames = 12; + double pushback = 13; - int32 releaseTriggerType = 15; // 1: rising-edge, 2: falling-edge - int32 damage = 16; + int32 releaseTriggerType = 14; // 1: rising-edge, 2: falling-edge + int32 damage = 15; + + int32 offenderJoinIndex = 16; + int32 offenderPlayerId = 17; } message RoomDownsyncFrame { diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index 76a6bfa..af774f2 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 216.50635094610968, + 342.07256941030164, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map_1.fire b/frontend/assets/scenes/offline_map_1.fire index 4939b21..cdea69f 100644 --- a/frontend/assets/scenes/offline_map_1.fire +++ b/frontend/assets/scenes/offline_map_1.fire @@ -453,7 +453,7 @@ "array": [ 0, 0, - 216.50635094610968, + 342.93857591513785, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index 9a30f8b..f098c5d 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -4,6 +4,7 @@ window.ATK_CHARACTER_STATE = { Idle1: [0, "Idle1"], Walking: [1, "Walking"], Atk1: [2, "Atk1"], + Atked1: [3, "Atked1"], }; window.ATK_CHARACTER_STATE_ARR = []; diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 8a5e4c3..7011f0d 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -306,10 +306,10 @@ cc.Class({ self.lastUpsyncInputFrameId = -1; self.chaserRenderFrameId = -1; // at any moment, "lastAllConfirmedRenderFrameId <= chaserRenderFrameId <= renderFrameId", but "chaserRenderFrameId" would fluctuate according to "onInputFrameDownsyncBatch" - self.recentRenderCache = new RingBuffer(1024); + self.recentRenderCache = new RingBuffer(self.renderCacheSize); self.selfPlayerInfo = null; // This field is kept for distinguishing "self" and "others". - self.recentInputCache = new RingBuffer(1024); + self.recentInputCache = new RingBuffer((self.renderCacheSize >> 2)+1); self.collisionSys = new collisions.Collisions(); @@ -768,6 +768,8 @@ cc.Class({ const newPlayerCollider = self.collisionSys.createPolygon(x0, y0, pts); const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; + newPlayerCollider.collisionPlayerIndex = collisionPlayerIndex; + newPlayerCollider.playerId = playerRichInfo.id; self.collisionSysMap.set(collisionPlayerIndex, newPlayerCollider); safelyAddChild(self.node, newPlayerNode); @@ -973,6 +975,7 @@ cc.Class({ playerRichInfo.node.setPosition(wpos[0], wpos[1]); playerRichInfo.virtualGridX = immediatePlayerInfo.virtualGridX; playerRichInfo.virtualGridY = immediatePlayerInfo.virtualGridY; + // TODO: check "rdf.players[playerId].characterState" instead, might have to play Atk/Atked anim! if (null != delayedInputFrameForPrevRenderFrame) { const decodedInput = self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[playerRichInfo.joinIndex - 1]); playerRichInfo.scriptIns.scheduleNewDirection(decodedInput, false); diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index a594ca0..20f2b29 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -14,10 +14,7 @@ const PunchAtkConfig = { x: 0, y: 0, }, - hitboxOffset: { - x: 24.0, // should be about the radius of the PlayerCollider - y: 0, - }, + hitboxOffset: 12.0, // should be about the radius of the PlayerCollider hitboxSize: { x: 24.0, y: 24.0, @@ -101,7 +98,6 @@ cc.Class({ self.rollbackEstimatedDt = 0.016667; self.rollbackEstimatedDtMillis = 16.667; self.rollbackEstimatedDtNanos = 16666666; - self.maxChasingRenderFramesPerUpdate = 5; self.worldToVirtualGridRatio = 1000; self.virtualGridToWorldRatio = 1.0 / self.worldToVirtualGridRatio; @@ -256,6 +252,7 @@ cc.Class({ dx: currPlayerDownsync.dir.dx, dy: currPlayerDownsync.dir.dy, }, + characterState: currPlayerDownsync.characterState, speed: currPlayerDownsync.speed, battleState: currPlayerDownsync.battleState, score: currPlayerDownsync.score, @@ -273,10 +270,92 @@ cc.Class({ meleeBullets: [] }; + const bulletPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + const effPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + for (let j in self.playerRichInfoArr) { + const joinIndex = parseInt(j) + 1; + bulletPushbacks[joinIndex - 1] = [0.0, 0.0]; + effPushbacks[joinIndex - 1] = [0.0, 0.0]; + const playerRichInfo = self.playerRichInfoArr[j]; + const playerId = playerRichInfo.id; + const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; + const playerCollider = collisionSysMap.get(collisionPlayerIndex); + const player = currRenderFrame.players[playerId]; + + const newVx = player.virtualGridX; + const newVy = player.virtualGridY; + const newCpos = self.virtualGridToPlayerColliderPos(newVx, newVy, self.playerRichInfoArr[joinIndex - 1]); + playerCollider.x = newCpos[0]; + playerCollider.y = newCpos[1]; + } + + // Check bullet-anything collisions first, because the pushbacks caused by bullets might later be reverted by player-barrier collision + const colliderBullets = new Map(); // Will all be removed at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` due to the need for being rollback-compatible + const removedBulletsAtCurrFrame = new Set(); + for (let k in currRenderFrame.meleeBullets) { + const meleeBullet = currRenderFrame.meleeBullets[k]; + if ( + meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames >= currRenderFrame.id + && + meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames + meleeBullet.activeFrames <= currRenderFrame.id + ) { + const collisionBulletIndex = self.collisionBulletIndexPrefix + melee.battleLocalId; + const collisionOffenderIndex = self.collisionPlayerIndexPrefix + melee.offenderJoinIndex; + const offenderCollider = collisionSysMap.get(collisionOffenderIndex); + const offender = currRenderFrame.players[melee.offenderPlayerId]; + + const x0 = offenderCollider.x + offender.dir.dx * meleeBullet.hitboxOffset, + y0 = offenderCollider.y + offender.dir.dy * meleeBullet.hitboxOffset; + const pts = [[0, 0], [meleeBullet.hitboxSize.x, 0], [meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; + const newBulletCollider = collisionSys.createPolygon(x0, y0, pts); + newBulletCollider.collisionBulletIndex = collisionBulletIndex; + newBulletCollider.pushback = meleeBullet.pushback; + collisionSysMap.set(collisionBulletIndex, newBulletCollider); + colliderBullets.set(collisionBulletIndex, newBulletCollider); + console.log(`A meleeBullet=${JSON.stringify(meleeBullet)} is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended and active frame is not yet ended`); + } + } + + collisionSys.update(); + const result1 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? + + colliderBullets.forEach((collisionBulletIndex, bulletCollider) => { + const potentials = bulletCollider.potentials(); + let shouldRemove = false; + for (const potential of potentials) { + if (null != potential.playerId && potential.playerId == bulletCollider.offenderPlayerId) continue; + if (!bulletCollider.collides(potential, result1)) continue; + if (null != potential.playerId) { + bulletPushbacks[joinIndex - 1][0] += result1.overlap * result1.overlap_x * bulletCollider.pushback; + bulletPushbacks[joinIndex - 1][1] += result1.overlap * result1.overlap_y * bulletCollider.pushback; + const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.playerId]; + thatAckedPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atked1[0]; + const oldFrameToRecover = thatAckedPlayerInNextFrame.framesToRecover; + thatAckedPlayerInNextFrame.framesToRecover = oldFrameToRecover > bulletCollider.hitStunFrames ? oldFrameToRecover : bulletCollider.hitStunFrames; // In case the hit player is already stun, we take the larger "hitStunFrames" + } + shouldRemove = true; + } + if (shouldRemove) { + removedBulletsAtCurrFrame.add(collisionBulletIndex); + } + }); + + for (let k in currRenderFrame.meleeBullets) { + const meleeBullet = currRenderFrame.meleeBullets[k]; + // [WARNING] remove from collisionSys ANYWAY for the convenience of rollback + if (collisionSysMap.has(meleeBullet.collisionBulletIndex)) { + const bulletCollider = collisionSysMap.get(meleeBullet.collisionBulletIndex); + bulletCollider.remove(); + collisionSysMap.delete(meleeBullet.collisionBulletIndex); + } + if (removedBulletsAtCurrFrame.has(meleeBullet)) continue; + toRet.meleeBullets.push(meleeBullet); + } + if (null != delayedInputFrame) { const delayedInputFrameForPrevRenderFrame = self.getCachedInputFrameDownsyncWithPrediction(self._convertToInputFrameId(currRenderFrame.id - 1, self.inputDelayFrames)); const inputList = delayedInputFrame.inputList; - const effPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + // Process player inputs for (let j in self.playerRichInfoArr) { const joinIndex = parseInt(j) + 1; effPushbacks[joinIndex - 1] = [0.0, 0.0]; @@ -285,70 +364,49 @@ cc.Class({ const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; const playerCollider = collisionSysMap.get(collisionPlayerIndex); const player = currRenderFrame.players[playerId]; + if (0 < player.framesToRecover) { + // No need to process inputs for this player + continue; + } const decodedInput = self.ctrl.decodeInput(inputList[joinIndex - 1]); const prevDecodedInput = (null == delayedInputFrameForPrevRenderFrame ? null : self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[joinIndex - 1])); const prevBtnALevel = (null == prevDecodedInput ? 0 : prevDecodedInput.btnALevel); + + const playerInNextFrame = nextRenderFramePlayers[playerId]; if (1 == decodedInput.btnALevel && 0 == prevBtnALevel) { console.log(`playerId=${playerId} triggered a rising-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - if (0 == player.framesToRecover) { - nextRenderFramePlayers[playerId].framesToRecover = PunchAtkConfig.recoveryFrames; - const punch = window.pb.protos.MeleeBullet.create(PunchAtkConfig); - punch.battleLocalId = self.bulletBattleLocalIdCounter++; - punch.offenderJoinIndex = joinIndex; - punch.originatedRenderFrameId = currRenderFrame.id; - toRet.meleeBullets.push(punch); - console.log(`A rising-edge of meleeBullet=${JSON.stringify(punch)} is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - } + nextRenderFramePlayers[playerId].framesToRecover = PunchAtkConfig.recoveryFrames; + const punch = window.pb.protos.MeleeBullet.create(PunchAtkConfig); + punch.battleLocalId = self.bulletBattleLocalIdCounter++; + punch.offenderJoinIndex = joinIndex; + punch.offenderPlayerId = playerId; + punch.originatedRenderFrameId = currRenderFrame.id; + toRet.meleeBullets.push(punch); + console.log(`A rising-edge of meleeBullet=${JSON.stringify(punch)} is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + + playerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atk1[0]; } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - } - - /* - Reset "position" of players in "collisionSys" according to "virtual grid position". The easy part is that we don't have path-dependent-integrals to worry about like that of thermal dynamics. - */ - const newVx = player.virtualGridX + (decodedInput.dx + player.speed * decodedInput.dx); - const newVy = player.virtualGridY + (decodedInput.dy + player.speed * decodedInput.dy); - const newCpos = self.virtualGridToPlayerColliderPos(newVx, newVy, self.playerRichInfoArr[joinIndex - 1]); - playerCollider.x = newCpos[0]; - playerCollider.y = newCpos[1]; - if (0 != decodedInput.dx || 0 != decodedInput.dy) { - // Update directions and thus would eventually update moving animation accordingly - nextRenderFramePlayers[playerId].dir.dx = decodedInput.dx; - nextRenderFramePlayers[playerId].dir.dy = decodedInput.dy; - } - } - - for (let k in currRenderFrame.meleeBullets) { - const meleeBullet = currRenderFrame.meleeBullets[k]; - if (meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames + meleeBullet.activeFrames > currRenderFrame.id) { - // Won't cause any collision - const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; - const bulletCollider = collisionSysMap.get(collisionBulletIndex); - if (null != bulletCollider) { - console.log(`A rising-edge of meleeBullet=${JSON.stringify(meleeBullet)} is removed from collisionSys at renderFrame.id=${currRenderFrame.id} as active frames ended`); - bulletCollider.remove(); + } else { + // No trigger, process movement inputs + if (0 != decodedInput.dx || 0 != decodedInput.dy) { + // Update directions and thus would eventually update moving animation accordingly + playerInNextFrame.dir.dx = decodedInput.dx; + playerInNextFrame.dir.dy = decodedInput.dy; + playerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Walking[0]; + } else { + playerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Idle1[0]; } - continue; + const movement = self.virtualGridToPlayerColliderPos(decodedInput.dx + player.speed * decodedInput.dx, decodedInput.dy + player.speed * decodedInput.dy, self.playerRichInfoArr[joinIndex - 1]); + playerCollider.x += movement[0]; + playerCollider.y += movement[1]; } - if (meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames == currRenderFrame.id) { - // Add meleeBullet to collisionSys (shall we just remove all bullets at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` considering that we might be doing the calculation during rollback? - const collisionBulletIndex = self.collisionBulletIndexPrefix + melee.battleLocalId; - const collisionOffenderIndex = self.collisionPlayerIndexPrefix + melee.offenderJoinIndex; - const offenderCollider = collisionSysMap.get(collisionOffenderIndex); - const x0 = offenderCollider.x + meleeBullet.hitboxOffset.x, - y0 = offenderCollider.y + meleeBullet.hitboxOffset.y; - const pts = [[0, 0], [meleeBullet.hitboxSize.x, 0], [meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; - const newBulletCollider = collisionSys.createPolygon(x0, y0, pts); - collisionSysMap.set(collisionBulletIndex, newBulletCollider); - console.log(`A rising-edge of meleeBullet=${JSON.stringify(meleeBullet)} is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended`); - } - toRet.meleeBullets.push(meleeBullet); } - collisionSys.update(); - const result = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? + collisionSys.update(); // by now all "bulletCollider"s are removed + const result2 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? for (let j in self.playerRichInfoArr) { const joinIndex = parseInt(j) + 1; @@ -358,10 +416,10 @@ cc.Class({ const potentials = playerCollider.potentials(); for (const potential of potentials) { // Test if the player collides with the wall - if (!playerCollider.collides(potential, result)) continue; + if (!playerCollider.collides(potential, result2)) continue; // Push the player out of the wall - effPushbacks[joinIndex - 1][0] += result.overlap * result.overlap_x; - effPushbacks[joinIndex - 1][1] += result.overlap * result.overlap_y; + effPushbacks[joinIndex - 1][0] += result2.overlap * result2.overlap_x; + effPushbacks[joinIndex - 1][1] += result2.overlap * result2.overlap_y; } } @@ -374,6 +432,7 @@ cc.Class({ nextRenderFramePlayers[playerId].virtualGridX = newVpos[0]; nextRenderFramePlayers[playerId].virtualGridY = newVpos[1]; } + } return toRet; diff --git a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index 6eac069..d061163 100644 --- a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js +++ b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js @@ -83,9 +83,9 @@ $root.sharedprotos = (function() { Direction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dx != null && Object.hasOwnProperty.call(message, "dx")) + if (message.dx != null && message.hasOwnProperty("dx")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.dx); - if (message.dy != null && Object.hasOwnProperty.call(message, "dy")) + if (message.dy != null && message.hasOwnProperty("dy")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dy); return writer; }; @@ -121,14 +121,12 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.dx = reader.int32(); - break; - } - case 2: { - message.dy = reader.int32(); - break; - } + case 1: + message.dx = reader.int32(); + break; + case 2: + message.dy = reader.int32(); + break; default: reader.skipType(tag & 7); break; @@ -227,21 +225,6 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for Direction - * @function getTypeUrl - * @memberof sharedprotos.Direction - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - Direction.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/sharedprotos.Direction"; - }; - return Direction; })(); @@ -310,9 +293,9 @@ $root.sharedprotos = (function() { Vec2D.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.x != null && Object.hasOwnProperty.call(message, "x")) + if (message.x != null && message.hasOwnProperty("x")) writer.uint32(/* id 1, wireType 1 =*/9).double(message.x); - if (message.y != null && Object.hasOwnProperty.call(message, "y")) + if (message.y != null && message.hasOwnProperty("y")) writer.uint32(/* id 2, wireType 1 =*/17).double(message.y); return writer; }; @@ -348,14 +331,12 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.x = reader.double(); - break; - } - case 2: { - message.y = reader.double(); - break; - } + case 1: + message.x = reader.double(); + break; + case 2: + message.y = reader.double(); + break; default: reader.skipType(tag & 7); break; @@ -454,21 +435,6 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for Vec2D - * @function getTypeUrl - * @memberof sharedprotos.Vec2D - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - Vec2D.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/sharedprotos.Vec2D"; - }; - return Vec2D; })(); @@ -538,7 +504,7 @@ $root.sharedprotos = (function() { Polygon2D.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.anchor != null && Object.hasOwnProperty.call(message, "anchor")) + if (message.anchor != null && message.hasOwnProperty("anchor")) $root.sharedprotos.Vec2D.encode(message.anchor, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.points != null && message.points.length) for (var i = 0; i < message.points.length; ++i) @@ -577,16 +543,14 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.anchor = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); - break; - } - case 2: { - if (!(message.points && message.points.length)) - message.points = []; - message.points.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); - break; - } + case 1: + message.anchor = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + case 2: + if (!(message.points && message.points.length)) + message.points = []; + message.points.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -707,21 +671,6 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for Polygon2D - * @function getTypeUrl - * @memberof sharedprotos.Polygon2D - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - Polygon2D.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/sharedprotos.Polygon2D"; - }; - return Polygon2D; })(); @@ -819,12 +768,11 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - if (!(message.eles && message.eles.length)) - message.eles = []; - message.eles.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); - break; - } + case 1: + if (!(message.eles && message.eles.length)) + message.eles = []; + message.eles.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -931,21 +879,6 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for Vec2DList - * @function getTypeUrl - * @memberof sharedprotos.Vec2DList - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - Vec2DList.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/sharedprotos.Vec2DList"; - }; - return Vec2DList; })(); @@ -1043,12 +976,11 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - if (!(message.eles && message.eles.length)) - message.eles = []; - message.eles.push($root.sharedprotos.Polygon2D.decode(reader, reader.uint32())); - break; - } + case 1: + if (!(message.eles && message.eles.length)) + message.eles = []; + message.eles.push($root.sharedprotos.Polygon2D.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -1155,21 +1087,6 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for Polygon2DList - * @function getTypeUrl - * @memberof sharedprotos.Polygon2DList - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - Polygon2DList.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/sharedprotos.Polygon2DList"; - }; - return Polygon2DList; })(); @@ -1214,6 +1131,7 @@ $root.protos = (function() { * @property {number|null} [worldToVirtualGridRatio] BattleColliderInfo worldToVirtualGridRatio * @property {number|null} [virtualGridToWorldRatio] BattleColliderInfo virtualGridToWorldRatio * @property {number|null} [spAtkLookupFrames] BattleColliderInfo spAtkLookupFrames + * @property {number|null} [renderCacheSize] BattleColliderInfo renderCacheSize */ /** @@ -1417,6 +1335,14 @@ $root.protos = (function() { */ BattleColliderInfo.prototype.spAtkLookupFrames = 0; + /** + * BattleColliderInfo renderCacheSize. + * @member {number} renderCacheSize + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.renderCacheSize = 0; + /** * Creates a new BattleColliderInfo instance using the specified properties. * @function create @@ -1441,58 +1367,60 @@ $root.protos = (function() { BattleColliderInfo.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.stageName != null && Object.hasOwnProperty.call(message, "stageName")) + if (message.stageName != null && message.hasOwnProperty("stageName")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.stageName); - if (message.strToVec2DListMap != null && Object.hasOwnProperty.call(message, "strToVec2DListMap")) + if (message.strToVec2DListMap != null && message.hasOwnProperty("strToVec2DListMap")) for (var keys = Object.keys(message.strToVec2DListMap), i = 0; i < keys.length; ++i) { writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); $root.sharedprotos.Vec2DList.encode(message.strToVec2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } - if (message.strToPolygon2DListMap != null && Object.hasOwnProperty.call(message, "strToPolygon2DListMap")) + if (message.strToPolygon2DListMap != null && message.hasOwnProperty("strToPolygon2DListMap")) for (var keys = Object.keys(message.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); $root.sharedprotos.Polygon2DList.encode(message.strToPolygon2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } - if (message.stageDiscreteW != null && Object.hasOwnProperty.call(message, "stageDiscreteW")) + if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.stageDiscreteW); - if (message.stageDiscreteH != null && Object.hasOwnProperty.call(message, "stageDiscreteH")) + if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.stageDiscreteH); - if (message.stageTileW != null && Object.hasOwnProperty.call(message, "stageTileW")) + if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.stageTileW); - if (message.stageTileH != null && Object.hasOwnProperty.call(message, "stageTileH")) + if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) writer.uint32(/* id 7, wireType 0 =*/56).int32(message.stageTileH); - if (message.intervalToPing != null && Object.hasOwnProperty.call(message, "intervalToPing")) + if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) writer.uint32(/* id 8, wireType 0 =*/64).int32(message.intervalToPing); - if (message.willKickIfInactiveFor != null && Object.hasOwnProperty.call(message, "willKickIfInactiveFor")) + if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) writer.uint32(/* id 9, wireType 0 =*/72).int32(message.willKickIfInactiveFor); - if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) + if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) writer.uint32(/* id 10, wireType 0 =*/80).int32(message.boundRoomId); - if (message.battleDurationNanos != null && Object.hasOwnProperty.call(message, "battleDurationNanos")) + if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) writer.uint32(/* id 11, wireType 0 =*/88).int64(message.battleDurationNanos); - if (message.serverFps != null && Object.hasOwnProperty.call(message, "serverFps")) + if (message.serverFps != null && message.hasOwnProperty("serverFps")) writer.uint32(/* id 12, wireType 0 =*/96).int32(message.serverFps); - if (message.inputDelayFrames != null && Object.hasOwnProperty.call(message, "inputDelayFrames")) + if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) writer.uint32(/* id 13, wireType 0 =*/104).int32(message.inputDelayFrames); - if (message.inputScaleFrames != null && Object.hasOwnProperty.call(message, "inputScaleFrames")) + if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) writer.uint32(/* id 14, wireType 0 =*/112).uint32(message.inputScaleFrames); - if (message.nstDelayFrames != null && Object.hasOwnProperty.call(message, "nstDelayFrames")) + if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) writer.uint32(/* id 15, wireType 0 =*/120).int32(message.nstDelayFrames); - if (message.inputFrameUpsyncDelayTolerance != null && Object.hasOwnProperty.call(message, "inputFrameUpsyncDelayTolerance")) + if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) writer.uint32(/* id 16, wireType 0 =*/128).int32(message.inputFrameUpsyncDelayTolerance); - if (message.maxChasingRenderFramesPerUpdate != null && Object.hasOwnProperty.call(message, "maxChasingRenderFramesPerUpdate")) + if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) writer.uint32(/* id 17, wireType 0 =*/136).int32(message.maxChasingRenderFramesPerUpdate); - if (message.playerBattleState != null && Object.hasOwnProperty.call(message, "playerBattleState")) + if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) writer.uint32(/* id 18, wireType 0 =*/144).int32(message.playerBattleState); - if (message.rollbackEstimatedDtMillis != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtMillis")) + if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) writer.uint32(/* id 19, wireType 1 =*/153).double(message.rollbackEstimatedDtMillis); - if (message.rollbackEstimatedDtNanos != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtNanos")) + if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) writer.uint32(/* id 20, wireType 0 =*/160).int64(message.rollbackEstimatedDtNanos); - if (message.worldToVirtualGridRatio != null && Object.hasOwnProperty.call(message, "worldToVirtualGridRatio")) + if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) writer.uint32(/* id 21, wireType 1 =*/169).double(message.worldToVirtualGridRatio); - if (message.virtualGridToWorldRatio != null && Object.hasOwnProperty.call(message, "virtualGridToWorldRatio")) + if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) writer.uint32(/* id 22, wireType 1 =*/177).double(message.virtualGridToWorldRatio); - if (message.spAtkLookupFrames != null && Object.hasOwnProperty.call(message, "spAtkLookupFrames")) + if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) writer.uint32(/* id 23, wireType 0 =*/184).int32(message.spAtkLookupFrames); + if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.renderCacheSize); return writer; }; @@ -1523,140 +1451,92 @@ $root.protos = (function() { BattleColliderInfo.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key, value; + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key; while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.stageName = reader.string(); - break; - } - case 2: { - if (message.strToVec2DListMap === $util.emptyObject) - message.strToVec2DListMap = {}; - var end2 = reader.uint32() + reader.pos; - key = ""; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.string(); - break; - case 2: - value = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.strToVec2DListMap[key] = value; - break; - } - case 3: { - if (message.strToPolygon2DListMap === $util.emptyObject) - message.strToPolygon2DListMap = {}; - var end2 = reader.uint32() + reader.pos; - key = ""; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.string(); - break; - case 2: - value = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.strToPolygon2DListMap[key] = value; - break; - } - case 4: { - message.stageDiscreteW = reader.int32(); - break; - } - case 5: { - message.stageDiscreteH = reader.int32(); - break; - } - case 6: { - message.stageTileW = reader.int32(); - break; - } - case 7: { - message.stageTileH = reader.int32(); - break; - } - case 8: { - message.intervalToPing = reader.int32(); - break; - } - case 9: { - message.willKickIfInactiveFor = reader.int32(); - break; - } - case 10: { - message.boundRoomId = reader.int32(); - break; - } - case 11: { - message.battleDurationNanos = reader.int64(); - break; - } - case 12: { - message.serverFps = reader.int32(); - break; - } - case 13: { - message.inputDelayFrames = reader.int32(); - break; - } - case 14: { - message.inputScaleFrames = reader.uint32(); - break; - } - case 15: { - message.nstDelayFrames = reader.int32(); - break; - } - case 16: { - message.inputFrameUpsyncDelayTolerance = reader.int32(); - break; - } - case 17: { - message.maxChasingRenderFramesPerUpdate = reader.int32(); - break; - } - case 18: { - message.playerBattleState = reader.int32(); - break; - } - case 19: { - message.rollbackEstimatedDtMillis = reader.double(); - break; - } - case 20: { - message.rollbackEstimatedDtNanos = reader.int64(); - break; - } - case 21: { - message.worldToVirtualGridRatio = reader.double(); - break; - } - case 22: { - message.virtualGridToWorldRatio = reader.double(); - break; - } - case 23: { - message.spAtkLookupFrames = reader.int32(); - break; - } + case 1: + message.stageName = reader.string(); + break; + case 2: + reader.skip().pos++; + if (message.strToVec2DListMap === $util.emptyObject) + message.strToVec2DListMap = {}; + key = reader.string(); + reader.pos++; + message.strToVec2DListMap[key] = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); + break; + case 3: + reader.skip().pos++; + if (message.strToPolygon2DListMap === $util.emptyObject) + message.strToPolygon2DListMap = {}; + key = reader.string(); + reader.pos++; + message.strToPolygon2DListMap[key] = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); + break; + case 4: + message.stageDiscreteW = reader.int32(); + break; + case 5: + message.stageDiscreteH = reader.int32(); + break; + case 6: + message.stageTileW = reader.int32(); + break; + case 7: + message.stageTileH = reader.int32(); + break; + case 8: + message.intervalToPing = reader.int32(); + break; + case 9: + message.willKickIfInactiveFor = reader.int32(); + break; + case 10: + message.boundRoomId = reader.int32(); + break; + case 11: + message.battleDurationNanos = reader.int64(); + break; + case 12: + message.serverFps = reader.int32(); + break; + case 13: + message.inputDelayFrames = reader.int32(); + break; + case 14: + message.inputScaleFrames = reader.uint32(); + break; + case 15: + message.nstDelayFrames = reader.int32(); + break; + case 16: + message.inputFrameUpsyncDelayTolerance = reader.int32(); + break; + case 17: + message.maxChasingRenderFramesPerUpdate = reader.int32(); + break; + case 18: + message.playerBattleState = reader.int32(); + break; + case 19: + message.rollbackEstimatedDtMillis = reader.double(); + break; + case 20: + message.rollbackEstimatedDtNanos = reader.int64(); + break; + case 21: + message.worldToVirtualGridRatio = reader.double(); + break; + case 22: + message.virtualGridToWorldRatio = reader.double(); + break; + case 23: + message.spAtkLookupFrames = reader.int32(); + break; + case 24: + message.renderCacheSize = reader.int32(); + break; default: reader.skipType(tag & 7); break; @@ -1775,6 +1655,9 @@ $root.protos = (function() { if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) if (!$util.isInteger(message.spAtkLookupFrames)) return "spAtkLookupFrames: integer expected"; + if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + if (!$util.isInteger(message.renderCacheSize)) + return "renderCacheSize: integer expected"; return null; }; @@ -1866,6 +1749,8 @@ $root.protos = (function() { message.virtualGridToWorldRatio = Number(object.virtualGridToWorldRatio); if (object.spAtkLookupFrames != null) message.spAtkLookupFrames = object.spAtkLookupFrames | 0; + if (object.renderCacheSize != null) + message.renderCacheSize = object.renderCacheSize | 0; return message; }; @@ -1916,6 +1801,7 @@ $root.protos = (function() { object.worldToVirtualGridRatio = 0; object.virtualGridToWorldRatio = 0; object.spAtkLookupFrames = 0; + object.renderCacheSize = 0; } if (message.stageName != null && message.hasOwnProperty("stageName")) object.stageName = message.stageName; @@ -1976,6 +1862,8 @@ $root.protos = (function() { object.virtualGridToWorldRatio = options.json && !isFinite(message.virtualGridToWorldRatio) ? String(message.virtualGridToWorldRatio) : message.virtualGridToWorldRatio; if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) object.spAtkLookupFrames = message.spAtkLookupFrames; + if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + object.renderCacheSize = message.renderCacheSize; return object; }; @@ -1990,21 +1878,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for BattleColliderInfo - * @function getTypeUrl - * @memberof protos.BattleColliderInfo - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - BattleColliderInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.BattleColliderInfo"; - }; - return BattleColliderInfo; })(); @@ -2217,41 +2090,41 @@ $root.protos = (function() { PlayerDownsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.id != null && Object.hasOwnProperty.call(message, "id")) + if (message.id != null && message.hasOwnProperty("id")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.id); - if (message.virtualGridX != null && Object.hasOwnProperty.call(message, "virtualGridX")) + if (message.virtualGridX != null && message.hasOwnProperty("virtualGridX")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.virtualGridX); - if (message.virtualGridY != null && Object.hasOwnProperty.call(message, "virtualGridY")) + if (message.virtualGridY != null && message.hasOwnProperty("virtualGridY")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.virtualGridY); - if (message.dir != null && Object.hasOwnProperty.call(message, "dir")) + if (message.dir != null && message.hasOwnProperty("dir")) $root.sharedprotos.Direction.encode(message.dir, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); - if (message.speed != null && Object.hasOwnProperty.call(message, "speed")) + if (message.speed != null && message.hasOwnProperty("speed")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.speed); - if (message.battleState != null && Object.hasOwnProperty.call(message, "battleState")) + if (message.battleState != null && message.hasOwnProperty("battleState")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.battleState); - if (message.joinIndex != null && Object.hasOwnProperty.call(message, "joinIndex")) + if (message.joinIndex != null && message.hasOwnProperty("joinIndex")) writer.uint32(/* id 7, wireType 0 =*/56).int32(message.joinIndex); - if (message.colliderRadius != null && Object.hasOwnProperty.call(message, "colliderRadius")) + if (message.colliderRadius != null && message.hasOwnProperty("colliderRadius")) writer.uint32(/* id 8, wireType 1 =*/65).double(message.colliderRadius); - if (message.removed != null && Object.hasOwnProperty.call(message, "removed")) + if (message.removed != null && message.hasOwnProperty("removed")) writer.uint32(/* id 9, wireType 0 =*/72).bool(message.removed); - if (message.score != null && Object.hasOwnProperty.call(message, "score")) + if (message.score != null && message.hasOwnProperty("score")) writer.uint32(/* id 10, wireType 0 =*/80).int32(message.score); - if (message.lastMoveGmtMillis != null && Object.hasOwnProperty.call(message, "lastMoveGmtMillis")) + if (message.lastMoveGmtMillis != null && message.hasOwnProperty("lastMoveGmtMillis")) writer.uint32(/* id 11, wireType 0 =*/88).int32(message.lastMoveGmtMillis); - if (message.framesToRecover != null && Object.hasOwnProperty.call(message, "framesToRecover")) + if (message.framesToRecover != null && message.hasOwnProperty("framesToRecover")) writer.uint32(/* id 12, wireType 0 =*/96).int32(message.framesToRecover); - if (message.hp != null && Object.hasOwnProperty.call(message, "hp")) + if (message.hp != null && message.hasOwnProperty("hp")) writer.uint32(/* id 13, wireType 0 =*/104).int32(message.hp); - if (message.maxHp != null && Object.hasOwnProperty.call(message, "maxHp")) + if (message.maxHp != null && message.hasOwnProperty("maxHp")) writer.uint32(/* id 14, wireType 0 =*/112).int32(message.maxHp); - if (message.characterState != null && Object.hasOwnProperty.call(message, "characterState")) + if (message.characterState != null && message.hasOwnProperty("characterState")) writer.uint32(/* id 15, wireType 0 =*/120).int32(message.characterState); - if (message.name != null && Object.hasOwnProperty.call(message, "name")) + if (message.name != null && message.hasOwnProperty("name")) writer.uint32(/* id 16, wireType 2 =*/130).string(message.name); - if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) + if (message.displayName != null && message.hasOwnProperty("displayName")) writer.uint32(/* id 17, wireType 2 =*/138).string(message.displayName); - if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) + if (message.avatar != null && message.hasOwnProperty("avatar")) writer.uint32(/* id 18, wireType 2 =*/146).string(message.avatar); return writer; }; @@ -2287,78 +2160,60 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.id = reader.int32(); - break; - } - case 2: { - message.virtualGridX = reader.int32(); - break; - } - case 3: { - message.virtualGridY = reader.int32(); - break; - } - case 4: { - message.dir = $root.sharedprotos.Direction.decode(reader, reader.uint32()); - break; - } - case 5: { - message.speed = reader.int32(); - break; - } - case 6: { - message.battleState = reader.int32(); - break; - } - case 7: { - message.joinIndex = reader.int32(); - break; - } - case 8: { - message.colliderRadius = reader.double(); - break; - } - case 9: { - message.removed = reader.bool(); - break; - } - case 10: { - message.score = reader.int32(); - break; - } - case 11: { - message.lastMoveGmtMillis = reader.int32(); - break; - } - case 12: { - message.framesToRecover = reader.int32(); - break; - } - case 13: { - message.hp = reader.int32(); - break; - } - case 14: { - message.maxHp = reader.int32(); - break; - } - case 15: { - message.characterState = reader.int32(); - break; - } - case 16: { - message.name = reader.string(); - break; - } - case 17: { - message.displayName = reader.string(); - break; - } - case 18: { - message.avatar = reader.string(); - break; - } + case 1: + message.id = reader.int32(); + break; + case 2: + message.virtualGridX = reader.int32(); + break; + case 3: + message.virtualGridY = reader.int32(); + break; + case 4: + message.dir = $root.sharedprotos.Direction.decode(reader, reader.uint32()); + break; + case 5: + message.speed = reader.int32(); + break; + case 6: + message.battleState = reader.int32(); + break; + case 7: + message.joinIndex = reader.int32(); + break; + case 8: + message.colliderRadius = reader.double(); + break; + case 9: + message.removed = reader.bool(); + break; + case 10: + message.score = reader.int32(); + break; + case 11: + message.lastMoveGmtMillis = reader.int32(); + break; + case 12: + message.framesToRecover = reader.int32(); + break; + case 13: + message.hp = reader.int32(); + break; + case 14: + message.maxHp = reader.int32(); + break; + case 15: + message.characterState = reader.int32(); + break; + case 16: + message.name = reader.string(); + break; + case 17: + message.displayName = reader.string(); + break; + case 18: + message.avatar = reader.string(); + break; default: reader.skipType(tag & 7); break; @@ -2590,21 +2445,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for PlayerDownsync - * @function getTypeUrl - * @memberof protos.PlayerDownsync - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - PlayerDownsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.PlayerDownsync"; - }; - return PlayerDownsync; })(); @@ -2682,11 +2522,11 @@ $root.protos = (function() { InputFrameDecoded.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dx != null && Object.hasOwnProperty.call(message, "dx")) + if (message.dx != null && message.hasOwnProperty("dx")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.dx); - if (message.dy != null && Object.hasOwnProperty.call(message, "dy")) + if (message.dy != null && message.hasOwnProperty("dy")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dy); - if (message.btnALevel != null && Object.hasOwnProperty.call(message, "btnALevel")) + if (message.btnALevel != null && message.hasOwnProperty("btnALevel")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.btnALevel); return writer; }; @@ -2722,18 +2562,15 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.dx = reader.int32(); - break; - } - case 2: { - message.dy = reader.int32(); - break; - } - case 3: { - message.btnALevel = reader.int32(); - break; - } + case 1: + message.dx = reader.int32(); + break; + case 2: + message.dy = reader.int32(); + break; + case 3: + message.btnALevel = reader.int32(); + break; default: reader.skipType(tag & 7); break; @@ -2840,21 +2677,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for InputFrameDecoded - * @function getTypeUrl - * @memberof protos.InputFrameDecoded - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - InputFrameDecoded.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.InputFrameDecoded"; - }; - return InputFrameDecoded; })(); @@ -2923,9 +2745,9 @@ $root.protos = (function() { InputFrameUpsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.inputFrameId != null && Object.hasOwnProperty.call(message, "inputFrameId")) + if (message.inputFrameId != null && message.hasOwnProperty("inputFrameId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.inputFrameId); - if (message.encoded != null && Object.hasOwnProperty.call(message, "encoded")) + if (message.encoded != null && message.hasOwnProperty("encoded")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.encoded); return writer; }; @@ -2961,14 +2783,12 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.inputFrameId = reader.int32(); - break; - } - case 2: { - message.encoded = reader.uint64(); - break; - } + case 1: + message.inputFrameId = reader.int32(); + break; + case 2: + message.encoded = reader.uint64(); + break; default: reader.skipType(tag & 7); break; @@ -3081,21 +2901,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for InputFrameUpsync - * @function getTypeUrl - * @memberof protos.InputFrameUpsync - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - InputFrameUpsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.InputFrameUpsync"; - }; - return InputFrameUpsync; })(); @@ -3174,7 +2979,7 @@ $root.protos = (function() { InputFrameDownsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.inputFrameId != null && Object.hasOwnProperty.call(message, "inputFrameId")) + if (message.inputFrameId != null && message.hasOwnProperty("inputFrameId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.inputFrameId); if (message.inputList != null && message.inputList.length) { writer.uint32(/* id 2, wireType 2 =*/18).fork(); @@ -3182,7 +2987,7 @@ $root.protos = (function() { writer.uint64(message.inputList[i]); writer.ldelim(); } - if (message.confirmedList != null && Object.hasOwnProperty.call(message, "confirmedList")) + if (message.confirmedList != null && message.hasOwnProperty("confirmedList")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.confirmedList); return writer; }; @@ -3218,25 +3023,22 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.inputFrameId = reader.int32(); - break; - } - case 2: { - if (!(message.inputList && message.inputList.length)) - message.inputList = []; - if ((tag & 7) === 2) { - var end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) - message.inputList.push(reader.uint64()); - } else + case 1: + message.inputFrameId = reader.int32(); + break; + case 2: + if (!(message.inputList && message.inputList.length)) + message.inputList = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) message.inputList.push(reader.uint64()); - break; - } - case 3: { - message.confirmedList = reader.uint64(); - break; - } + } else + message.inputList.push(reader.uint64()); + break; + case 3: + message.confirmedList = reader.uint64(); + break; default: reader.skipType(tag & 7); break; @@ -3380,21 +3182,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for InputFrameDownsync - * @function getTypeUrl - * @memberof protos.InputFrameDownsync - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - InputFrameDownsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.InputFrameDownsync"; - }; - return InputFrameDownsync; })(); @@ -3454,7 +3241,7 @@ $root.protos = (function() { HeartbeatUpsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.clientTimestamp != null && Object.hasOwnProperty.call(message, "clientTimestamp")) + if (message.clientTimestamp != null && message.hasOwnProperty("clientTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).int64(message.clientTimestamp); return writer; }; @@ -3490,10 +3277,9 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.clientTimestamp = reader.int64(); - break; - } + case 1: + message.clientTimestamp = reader.int64(); + break; default: reader.skipType(tag & 7); break; @@ -3597,21 +3383,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for HeartbeatUpsync - * @function getTypeUrl - * @memberof protos.HeartbeatUpsync - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - HeartbeatUpsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.HeartbeatUpsync"; - }; - return HeartbeatUpsync; })(); @@ -3735,22 +3506,22 @@ $root.protos = (function() { WsReq.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId")) + if (message.msgId != null && message.hasOwnProperty("msgId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.msgId); - if (message.playerId != null && Object.hasOwnProperty.call(message, "playerId")) + if (message.playerId != null && message.hasOwnProperty("playerId")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.playerId); - if (message.act != null && Object.hasOwnProperty.call(message, "act")) + if (message.act != null && message.hasOwnProperty("act")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.act); - if (message.joinIndex != null && Object.hasOwnProperty.call(message, "joinIndex")) + if (message.joinIndex != null && message.hasOwnProperty("joinIndex")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.joinIndex); - if (message.ackingFrameId != null && Object.hasOwnProperty.call(message, "ackingFrameId")) + if (message.ackingFrameId != null && message.hasOwnProperty("ackingFrameId")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.ackingFrameId); - if (message.ackingInputFrameId != null && Object.hasOwnProperty.call(message, "ackingInputFrameId")) + if (message.ackingInputFrameId != null && message.hasOwnProperty("ackingInputFrameId")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.ackingInputFrameId); if (message.inputFrameUpsyncBatch != null && message.inputFrameUpsyncBatch.length) for (var i = 0; i < message.inputFrameUpsyncBatch.length; ++i) $root.protos.InputFrameUpsync.encode(message.inputFrameUpsyncBatch[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); - if (message.hb != null && Object.hasOwnProperty.call(message, "hb")) + if (message.hb != null && message.hasOwnProperty("hb")) $root.protos.HeartbeatUpsync.encode(message.hb, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); return writer; }; @@ -3786,40 +3557,32 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.msgId = reader.int32(); - break; - } - case 2: { - message.playerId = reader.int32(); - break; - } - case 3: { - message.act = reader.int32(); - break; - } - case 4: { - message.joinIndex = reader.int32(); - break; - } - case 5: { - message.ackingFrameId = reader.int32(); - break; - } - case 6: { - message.ackingInputFrameId = reader.int32(); - break; - } - case 7: { - if (!(message.inputFrameUpsyncBatch && message.inputFrameUpsyncBatch.length)) - message.inputFrameUpsyncBatch = []; - message.inputFrameUpsyncBatch.push($root.protos.InputFrameUpsync.decode(reader, reader.uint32())); - break; - } - case 8: { - message.hb = $root.protos.HeartbeatUpsync.decode(reader, reader.uint32()); - break; - } + case 1: + message.msgId = reader.int32(); + break; + case 2: + message.playerId = reader.int32(); + break; + case 3: + message.act = reader.int32(); + break; + case 4: + message.joinIndex = reader.int32(); + break; + case 5: + message.ackingFrameId = reader.int32(); + break; + case 6: + message.ackingInputFrameId = reader.int32(); + break; + case 7: + if (!(message.inputFrameUpsyncBatch && message.inputFrameUpsyncBatch.length)) + message.inputFrameUpsyncBatch = []; + message.inputFrameUpsyncBatch.push($root.protos.InputFrameUpsync.decode(reader, reader.uint32())); + break; + case 8: + message.hb = $root.protos.HeartbeatUpsync.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -3989,21 +3752,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for WsReq - * @function getTypeUrl - * @memberof protos.WsReq - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - WsReq.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.WsReq"; - }; - return WsReq; })(); @@ -4109,18 +3857,18 @@ $root.protos = (function() { WsResp.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.ret != null && Object.hasOwnProperty.call(message, "ret")) + if (message.ret != null && message.hasOwnProperty("ret")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.ret); - if (message.echoedMsgId != null && Object.hasOwnProperty.call(message, "echoedMsgId")) + if (message.echoedMsgId != null && message.hasOwnProperty("echoedMsgId")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.echoedMsgId); - if (message.act != null && Object.hasOwnProperty.call(message, "act")) + if (message.act != null && message.hasOwnProperty("act")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.act); - if (message.rdf != null && Object.hasOwnProperty.call(message, "rdf")) + if (message.rdf != null && message.hasOwnProperty("rdf")) $root.protos.RoomDownsyncFrame.encode(message.rdf, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.inputFrameDownsyncBatch != null && message.inputFrameDownsyncBatch.length) for (var i = 0; i < message.inputFrameDownsyncBatch.length; ++i) $root.protos.InputFrameDownsync.encode(message.inputFrameDownsyncBatch[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); - if (message.bciFrame != null && Object.hasOwnProperty.call(message, "bciFrame")) + if (message.bciFrame != null && message.hasOwnProperty("bciFrame")) $root.protos.BattleColliderInfo.encode(message.bciFrame, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); return writer; }; @@ -4156,32 +3904,26 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.ret = reader.int32(); - break; - } - case 2: { - message.echoedMsgId = reader.int32(); - break; - } - case 3: { - message.act = reader.int32(); - break; - } - case 4: { - message.rdf = $root.protos.RoomDownsyncFrame.decode(reader, reader.uint32()); - break; - } - case 5: { - if (!(message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length)) - message.inputFrameDownsyncBatch = []; - message.inputFrameDownsyncBatch.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32())); - break; - } - case 6: { - message.bciFrame = $root.protos.BattleColliderInfo.decode(reader, reader.uint32()); - break; - } + case 1: + message.ret = reader.int32(); + break; + case 2: + message.echoedMsgId = reader.int32(); + break; + case 3: + message.act = reader.int32(); + break; + case 4: + message.rdf = $root.protos.RoomDownsyncFrame.decode(reader, reader.uint32()); + break; + case 5: + if (!(message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length)) + message.inputFrameDownsyncBatch = []; + message.inputFrameDownsyncBatch.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32())); + break; + case 6: + message.bciFrame = $root.protos.BattleColliderInfo.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -4340,21 +4082,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for WsResp - * @function getTypeUrl - * @memberof protos.WsResp - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - WsResp.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.WsResp"; - }; - return WsResp; })(); @@ -4371,15 +4098,16 @@ $root.protos = (function() { * @property {number|null} [recoveryFramesOnBlock] MeleeBullet recoveryFramesOnBlock * @property {number|null} [recoveryFramesOnHit] MeleeBullet recoveryFramesOnHit * @property {sharedprotos.Vec2D|null} [moveforward] MeleeBullet moveforward - * @property {sharedprotos.Vec2D|null} [hitboxOffset] MeleeBullet hitboxOffset + * @property {number|null} [hitboxOffset] MeleeBullet hitboxOffset * @property {sharedprotos.Vec2D|null} [hitboxSize] MeleeBullet hitboxSize - * @property {number|null} [offenderJoinIndex] MeleeBullet offenderJoinIndex * @property {number|null} [originatedRenderFrameId] MeleeBullet originatedRenderFrameId * @property {number|null} [hitStunFrames] MeleeBullet hitStunFrames * @property {number|null} [blockStunFrames] MeleeBullet blockStunFrames * @property {number|null} [pushback] MeleeBullet pushback * @property {number|null} [releaseTriggerType] MeleeBullet releaseTriggerType * @property {number|null} [damage] MeleeBullet damage + * @property {number|null} [offenderJoinIndex] MeleeBullet offenderJoinIndex + * @property {number|null} [offenderPlayerId] MeleeBullet offenderPlayerId */ /** @@ -4455,11 +4183,11 @@ $root.protos = (function() { /** * MeleeBullet hitboxOffset. - * @member {sharedprotos.Vec2D|null|undefined} hitboxOffset + * @member {number} hitboxOffset * @memberof protos.MeleeBullet * @instance */ - MeleeBullet.prototype.hitboxOffset = null; + MeleeBullet.prototype.hitboxOffset = 0; /** * MeleeBullet hitboxSize. @@ -4469,14 +4197,6 @@ $root.protos = (function() { */ MeleeBullet.prototype.hitboxSize = null; - /** - * MeleeBullet offenderJoinIndex. - * @member {number} offenderJoinIndex - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.offenderJoinIndex = 0; - /** * MeleeBullet originatedRenderFrameId. * @member {number} originatedRenderFrameId @@ -4525,6 +4245,22 @@ $root.protos = (function() { */ MeleeBullet.prototype.damage = 0; + /** + * MeleeBullet offenderJoinIndex. + * @member {number} offenderJoinIndex + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.offenderJoinIndex = 0; + + /** + * MeleeBullet offenderPlayerId. + * @member {number} offenderPlayerId + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.offenderPlayerId = 0; + /** * Creates a new MeleeBullet instance using the specified properties. * @function create @@ -4549,38 +4285,40 @@ $root.protos = (function() { MeleeBullet.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.battleLocalId != null && Object.hasOwnProperty.call(message, "battleLocalId")) + if (message.battleLocalId != null && message.hasOwnProperty("battleLocalId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.battleLocalId); - if (message.startupFrames != null && Object.hasOwnProperty.call(message, "startupFrames")) + if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.startupFrames); - if (message.activeFrames != null && Object.hasOwnProperty.call(message, "activeFrames")) + if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.activeFrames); - if (message.recoveryFrames != null && Object.hasOwnProperty.call(message, "recoveryFrames")) + if (message.recoveryFrames != null && message.hasOwnProperty("recoveryFrames")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.recoveryFrames); - if (message.recoveryFramesOnBlock != null && Object.hasOwnProperty.call(message, "recoveryFramesOnBlock")) + if (message.recoveryFramesOnBlock != null && message.hasOwnProperty("recoveryFramesOnBlock")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.recoveryFramesOnBlock); - if (message.recoveryFramesOnHit != null && Object.hasOwnProperty.call(message, "recoveryFramesOnHit")) + if (message.recoveryFramesOnHit != null && message.hasOwnProperty("recoveryFramesOnHit")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.recoveryFramesOnHit); - if (message.moveforward != null && Object.hasOwnProperty.call(message, "moveforward")) + if (message.moveforward != null && message.hasOwnProperty("moveforward")) $root.sharedprotos.Vec2D.encode(message.moveforward, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); - if (message.hitboxOffset != null && Object.hasOwnProperty.call(message, "hitboxOffset")) - $root.sharedprotos.Vec2D.encode(message.hitboxOffset, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); - if (message.hitboxSize != null && Object.hasOwnProperty.call(message, "hitboxSize")) + if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) + writer.uint32(/* id 8, wireType 1 =*/65).double(message.hitboxOffset); + if (message.hitboxSize != null && message.hasOwnProperty("hitboxSize")) $root.sharedprotos.Vec2D.encode(message.hitboxSize, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); - if (message.offenderJoinIndex != null && Object.hasOwnProperty.call(message, "offenderJoinIndex")) - writer.uint32(/* id 10, wireType 0 =*/80).int32(message.offenderJoinIndex); - if (message.originatedRenderFrameId != null && Object.hasOwnProperty.call(message, "originatedRenderFrameId")) - writer.uint32(/* id 11, wireType 0 =*/88).int32(message.originatedRenderFrameId); - if (message.hitStunFrames != null && Object.hasOwnProperty.call(message, "hitStunFrames")) - writer.uint32(/* id 12, wireType 0 =*/96).int32(message.hitStunFrames); - if (message.blockStunFrames != null && Object.hasOwnProperty.call(message, "blockStunFrames")) - writer.uint32(/* id 13, wireType 0 =*/104).int32(message.blockStunFrames); - if (message.pushback != null && Object.hasOwnProperty.call(message, "pushback")) - writer.uint32(/* id 14, wireType 1 =*/113).double(message.pushback); - if (message.releaseTriggerType != null && Object.hasOwnProperty.call(message, "releaseTriggerType")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.releaseTriggerType); - if (message.damage != null && Object.hasOwnProperty.call(message, "damage")) - writer.uint32(/* id 16, wireType 0 =*/128).int32(message.damage); + if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.originatedRenderFrameId); + if (message.hitStunFrames != null && message.hasOwnProperty("hitStunFrames")) + writer.uint32(/* id 11, wireType 0 =*/88).int32(message.hitStunFrames); + if (message.blockStunFrames != null && message.hasOwnProperty("blockStunFrames")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.blockStunFrames); + if (message.pushback != null && message.hasOwnProperty("pushback")) + writer.uint32(/* id 13, wireType 1 =*/105).double(message.pushback); + if (message.releaseTriggerType != null && message.hasOwnProperty("releaseTriggerType")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.releaseTriggerType); + if (message.damage != null && message.hasOwnProperty("damage")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.damage); + if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.offenderJoinIndex); + if (message.offenderPlayerId != null && message.hasOwnProperty("offenderPlayerId")) + writer.uint32(/* id 17, wireType 0 =*/136).int32(message.offenderPlayerId); return writer; }; @@ -4615,70 +4353,57 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.battleLocalId = reader.int32(); - break; - } - case 2: { - message.startupFrames = reader.int32(); - break; - } - case 3: { - message.activeFrames = reader.int32(); - break; - } - case 4: { - message.recoveryFrames = reader.int32(); - break; - } - case 5: { - message.recoveryFramesOnBlock = reader.int32(); - break; - } - case 6: { - message.recoveryFramesOnHit = reader.int32(); - break; - } - case 7: { - message.moveforward = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); - break; - } - case 8: { - message.hitboxOffset = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); - break; - } - case 9: { - message.hitboxSize = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); - break; - } - case 10: { - message.offenderJoinIndex = reader.int32(); - break; - } - case 11: { - message.originatedRenderFrameId = reader.int32(); - break; - } - case 12: { - message.hitStunFrames = reader.int32(); - break; - } - case 13: { - message.blockStunFrames = reader.int32(); - break; - } - case 14: { - message.pushback = reader.double(); - break; - } - case 15: { - message.releaseTriggerType = reader.int32(); - break; - } - case 16: { - message.damage = reader.int32(); - break; - } + case 1: + message.battleLocalId = reader.int32(); + break; + case 2: + message.startupFrames = reader.int32(); + break; + case 3: + message.activeFrames = reader.int32(); + break; + case 4: + message.recoveryFrames = reader.int32(); + break; + case 5: + message.recoveryFramesOnBlock = reader.int32(); + break; + case 6: + message.recoveryFramesOnHit = reader.int32(); + break; + case 7: + message.moveforward = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + case 8: + message.hitboxOffset = reader.double(); + break; + case 9: + message.hitboxSize = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + case 10: + message.originatedRenderFrameId = reader.int32(); + break; + case 11: + message.hitStunFrames = reader.int32(); + break; + case 12: + message.blockStunFrames = reader.int32(); + break; + case 13: + message.pushback = reader.double(); + break; + case 14: + message.releaseTriggerType = reader.int32(); + break; + case 15: + message.damage = reader.int32(); + break; + case 16: + message.offenderJoinIndex = reader.int32(); + break; + case 17: + message.offenderPlayerId = reader.int32(); + break; default: reader.skipType(tag & 7); break; @@ -4737,19 +4462,14 @@ $root.protos = (function() { if (error) return "moveforward." + error; } - if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) { - var error = $root.sharedprotos.Vec2D.verify(message.hitboxOffset); - if (error) - return "hitboxOffset." + error; - } + if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) + if (typeof message.hitboxOffset !== "number") + return "hitboxOffset: number expected"; if (message.hitboxSize != null && message.hasOwnProperty("hitboxSize")) { var error = $root.sharedprotos.Vec2D.verify(message.hitboxSize); if (error) return "hitboxSize." + error; } - if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) - if (!$util.isInteger(message.offenderJoinIndex)) - return "offenderJoinIndex: integer expected"; if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) if (!$util.isInteger(message.originatedRenderFrameId)) return "originatedRenderFrameId: integer expected"; @@ -4768,6 +4488,12 @@ $root.protos = (function() { if (message.damage != null && message.hasOwnProperty("damage")) if (!$util.isInteger(message.damage)) return "damage: integer expected"; + if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + if (!$util.isInteger(message.offenderJoinIndex)) + return "offenderJoinIndex: integer expected"; + if (message.offenderPlayerId != null && message.hasOwnProperty("offenderPlayerId")) + if (!$util.isInteger(message.offenderPlayerId)) + return "offenderPlayerId: integer expected"; return null; }; @@ -4800,18 +4526,13 @@ $root.protos = (function() { throw TypeError(".protos.MeleeBullet.moveforward: object expected"); message.moveforward = $root.sharedprotos.Vec2D.fromObject(object.moveforward); } - if (object.hitboxOffset != null) { - if (typeof object.hitboxOffset !== "object") - throw TypeError(".protos.MeleeBullet.hitboxOffset: object expected"); - message.hitboxOffset = $root.sharedprotos.Vec2D.fromObject(object.hitboxOffset); - } + if (object.hitboxOffset != null) + message.hitboxOffset = Number(object.hitboxOffset); if (object.hitboxSize != null) { if (typeof object.hitboxSize !== "object") throw TypeError(".protos.MeleeBullet.hitboxSize: object expected"); message.hitboxSize = $root.sharedprotos.Vec2D.fromObject(object.hitboxSize); } - if (object.offenderJoinIndex != null) - message.offenderJoinIndex = object.offenderJoinIndex | 0; if (object.originatedRenderFrameId != null) message.originatedRenderFrameId = object.originatedRenderFrameId | 0; if (object.hitStunFrames != null) @@ -4824,6 +4545,10 @@ $root.protos = (function() { message.releaseTriggerType = object.releaseTriggerType | 0; if (object.damage != null) message.damage = object.damage | 0; + if (object.offenderJoinIndex != null) + message.offenderJoinIndex = object.offenderJoinIndex | 0; + if (object.offenderPlayerId != null) + message.offenderPlayerId = object.offenderPlayerId | 0; return message; }; @@ -4848,15 +4573,16 @@ $root.protos = (function() { object.recoveryFramesOnBlock = 0; object.recoveryFramesOnHit = 0; object.moveforward = null; - object.hitboxOffset = null; + object.hitboxOffset = 0; object.hitboxSize = null; - object.offenderJoinIndex = 0; object.originatedRenderFrameId = 0; object.hitStunFrames = 0; object.blockStunFrames = 0; object.pushback = 0; object.releaseTriggerType = 0; object.damage = 0; + object.offenderJoinIndex = 0; + object.offenderPlayerId = 0; } if (message.battleLocalId != null && message.hasOwnProperty("battleLocalId")) object.battleLocalId = message.battleLocalId; @@ -4873,11 +4599,9 @@ $root.protos = (function() { if (message.moveforward != null && message.hasOwnProperty("moveforward")) object.moveforward = $root.sharedprotos.Vec2D.toObject(message.moveforward, options); if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) - object.hitboxOffset = $root.sharedprotos.Vec2D.toObject(message.hitboxOffset, options); + object.hitboxOffset = options.json && !isFinite(message.hitboxOffset) ? String(message.hitboxOffset) : message.hitboxOffset; if (message.hitboxSize != null && message.hasOwnProperty("hitboxSize")) object.hitboxSize = $root.sharedprotos.Vec2D.toObject(message.hitboxSize, options); - if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) - object.offenderJoinIndex = message.offenderJoinIndex; if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) object.originatedRenderFrameId = message.originatedRenderFrameId; if (message.hitStunFrames != null && message.hasOwnProperty("hitStunFrames")) @@ -4890,6 +4614,10 @@ $root.protos = (function() { object.releaseTriggerType = message.releaseTriggerType; if (message.damage != null && message.hasOwnProperty("damage")) object.damage = message.damage; + if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + object.offenderJoinIndex = message.offenderJoinIndex; + if (message.offenderPlayerId != null && message.hasOwnProperty("offenderPlayerId")) + object.offenderPlayerId = message.offenderPlayerId; return object; }; @@ -4904,21 +4632,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for MeleeBullet - * @function getTypeUrl - * @memberof protos.MeleeBullet - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - MeleeBullet.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.MeleeBullet"; - }; - return MeleeBullet; })(); @@ -5007,14 +4720,14 @@ $root.protos = (function() { RoomDownsyncFrame.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.id != null && Object.hasOwnProperty.call(message, "id")) + if (message.id != null && message.hasOwnProperty("id")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.id); - if (message.players != null && Object.hasOwnProperty.call(message, "players")) + if (message.players != null && message.hasOwnProperty("players")) for (var keys = Object.keys(message.players), i = 0; i < keys.length; ++i) { writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]); $root.protos.PlayerDownsync.encode(message.players[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } - if (message.countdownNanos != null && Object.hasOwnProperty.call(message, "countdownNanos")) + if (message.countdownNanos != null && message.hasOwnProperty("countdownNanos")) writer.uint32(/* id 3, wireType 0 =*/24).int64(message.countdownNanos); if (message.meleeBullets != null && message.meleeBullets.length) for (var i = 0; i < message.meleeBullets.length; ++i) @@ -5049,47 +4762,29 @@ $root.protos = (function() { RoomDownsyncFrame.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(), key, value; + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(), key; while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.id = reader.int32(); - break; - } - case 2: { - if (message.players === $util.emptyObject) - message.players = {}; - var end2 = reader.uint32() + reader.pos; - key = 0; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.int32(); - break; - case 2: - value = $root.protos.PlayerDownsync.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.players[key] = value; - break; - } - case 3: { - message.countdownNanos = reader.int64(); - break; - } - case 4: { - if (!(message.meleeBullets && message.meleeBullets.length)) - message.meleeBullets = []; - message.meleeBullets.push($root.protos.MeleeBullet.decode(reader, reader.uint32())); - break; - } + case 1: + message.id = reader.int32(); + break; + case 2: + reader.skip().pos++; + if (message.players === $util.emptyObject) + message.players = {}; + key = reader.int32(); + reader.pos++; + message.players[key] = $root.protos.PlayerDownsync.decode(reader, reader.uint32()); + break; + case 3: + message.countdownNanos = reader.int64(); + break; + case 4: + if (!(message.meleeBullets && message.meleeBullets.length)) + message.meleeBullets = []; + message.meleeBullets.push($root.protos.MeleeBullet.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -5260,21 +4955,6 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Gets the default type url for RoomDownsyncFrame - * @function getTypeUrl - * @memberof protos.RoomDownsyncFrame - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - RoomDownsyncFrame.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.RoomDownsyncFrame"; - }; - return RoomDownsyncFrame; })(); From becc56f672c23e24b0b706188d0d02b104b18c48 Mon Sep 17 00:00:00 2001 From: genxium Date: Wed, 23 Nov 2022 15:04:32 +0800 Subject: [PATCH 4/6] Minor fix. --- battle_srv/models/room.go | 3 +- battle_srv/ws/serve.go | 2 +- .../pbfiles/room_downsync_frame.proto | 2 + frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map_1.fire | 2 +- frontend/assets/scripts/AttackingCharacter.js | 39 ++-- frontend/assets/scripts/BaseCharacter.js | 17 -- frontend/assets/scripts/Map.js | 176 +++++++++++++++--- frontend/assets/scripts/OfflineMap.js | 88 +++++---- 9 files changed, 231 insertions(+), 100 deletions(-) diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index adfecc1..5400c1e 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -776,7 +776,7 @@ func (pR *Room) OnDismissed() { pR.RenderCacheSize = 256 pR.RenderFrameBuffer = NewRingBuffer(pR.RenderCacheSize) pR.DiscreteInputsBuffer = sync.Map{} - pR.InputsBuffer = NewRingBuffer((pR.RenderCacheSize >> 2)+1) + pR.InputsBuffer = NewRingBuffer((pR.RenderCacheSize >> 2) + 1) pR.LastAllConfirmedInputFrameId = -1 pR.LastAllConfirmedInputFrameIdWithChange = -1 @@ -1161,6 +1161,7 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende // TODO: Write unit-test for this function to compare with its frontend counter part func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputFrame *InputFrameDownsync, currRenderFrame *RoomDownsyncFrame, collisionSysMap map[int32]*resolv.Object) *RoomDownsyncFrame { + // TODO: Derive "nextRenderFramePlayers[*].CharacterState" as the frontend counter-part! nextRenderFramePlayers := make(map[int32]*PlayerDownsync, pR.Capacity) // Make a copy first for playerId, currPlayerDownsync := range currRenderFrame.Players { diff --git a/battle_srv/ws/serve.go b/battle_srv/ws/serve.go index 04de98c..4f6949f 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -271,7 +271,7 @@ func Serve(c *gin.Context) { VirtualGridToWorldRatio: pRoom.VirtualGridToWorldRatio, SpAtkLookupFrames: pRoom.SpAtkLookupFrames, - RenderCacheSize: pRoom.RenderCacheSize, + RenderCacheSize: pRoom.RenderCacheSize, } resp := &pb.WsResp{ diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index ce89922..88ad1cc 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -123,6 +123,8 @@ message MeleeBullet { int32 offenderJoinIndex = 16; int32 offenderPlayerId = 17; + + int32 offenderPlayerId = 17; } message RoomDownsyncFrame { diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index af774f2..5cbb696 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 342.07256941030164, + 210.4441731196186, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map_1.fire b/frontend/assets/scenes/offline_map_1.fire index cdea69f..eda2fde 100644 --- a/frontend/assets/scenes/offline_map_1.fire +++ b/frontend/assets/scenes/offline_map_1.fire @@ -453,7 +453,7 @@ "array": [ 0, 0, - 342.93857591513785, + 210.4441731196186, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index f098c5d..f49086f 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -38,28 +38,29 @@ cc.Class({ onLoad() { BaseCharacter.prototype.onLoad.call(this); - this.characterState = ATK_CHARACTER_STATE.Idle1[0]; }, - scheduleNewDirection(newScheduledDirection, forceAnimSwitch) { - const oldDx = this.activeDirection.dx, oldDy = this.activeDirection.dy; - BaseCharacter.prototype.scheduleNewDirection.call(this, newScheduledDirection, forceAnimSwitch); - if (ATK_CHARACTER_STATE.Atk1[0] == this.characterState) { - return; - } - - let newCharacterState = ATK_CHARACTER_STATE.Idle1[0]; - if (0 != newScheduledDirection.dx || 0 != newScheduledDirection.dy) { - newCharacterState = ATK_CHARACTER_STATE.Walking[0]; - } - - if (newCharacterState != this.characterState) { - this.characterState = newCharacterState; - const newAnimName = window.ATK_CHARACTER_STATE_ARR[newCharacterState][1]; - if (newAnimName != this.animComp.animationName) { - this.animComp.playAnimation(newAnimName); - // console.log(`JoinIndex=${this.joinIndex}, Resetting anim to ${newAnimName}, dir changed: (${oldDx}, ${oldDy}) -> (${newScheduledDirection.dx}, ${newScheduledDirection.dy})`); + updateCharacterAnim(newScheduledDirection, rdfPlayer, forceAnimSwitch) { + if (0 == rdfPlayer.framesToRecover) { + // Update directions + if (forceAnimSwitch || null == this.activeDirection || (null != newScheduledDirection && (newScheduledDirection.dx != this.activeDirection.dx || newScheduledDirection.dy != this.activeDirection.dy))) { + this.activeDirection = newScheduledDirection; + if (this.animComp && this.animComp.node) { + if (0 > newScheduledDirection.dx) { + this.animComp.node.scaleX = (-1.0); + } else if (0 < newScheduledDirection.dx) { + this.animComp.node.scaleX = (1.0); + } + } } } + + // Update per character state + let newCharacterState = rdfPlayer.characterState; + const newAnimName = window.ATK_CHARACTER_STATE_ARR[newCharacterState][1]; + if (newAnimName != this.animComp.animationName) { + this.animComp.playAnimation(newAnimName); + // console.log(`JoinIndex=${this.joinIndex}, Resetting anim to ${newAnimName}, dir changed: (${oldDx}, ${oldDy}) -> (${newScheduledDirection.dx}, ${newScheduledDirection.dy})`); + } }, }); diff --git a/frontend/assets/scripts/BaseCharacter.js b/frontend/assets/scripts/BaseCharacter.js index 3d4cf93..ae3c393 100644 --- a/frontend/assets/scripts/BaseCharacter.js +++ b/frontend/assets/scripts/BaseCharacter.js @@ -23,23 +23,6 @@ module.export = cc.Class({ self.ctrl = joystickInputControllerScriptIns; }, - scheduleNewDirection(newScheduledDirection, forceAnimSwitch) { - if (!newScheduledDirection) { - return; - } - - if (forceAnimSwitch || null == this.activeDirection || (newScheduledDirection.dx != this.activeDirection.dx || newScheduledDirection.dy != this.activeDirection.dy)) { - this.activeDirection = newScheduledDirection; - if (this.animComp && this.animComp.node) { - if (0 > newScheduledDirection.dx) { - this.animComp.node.scaleX = (-1.0); - } else if (0 < newScheduledDirection.dx) { - this.animComp.node.scaleX = (1.0); - } - } - } - }, - update(dt) {}, lateUpdate(dt) {}, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 7011f0d..75b79ef 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -309,7 +309,7 @@ cc.Class({ self.recentRenderCache = new RingBuffer(self.renderCacheSize); self.selfPlayerInfo = null; // This field is kept for distinguishing "self" and "others". - self.recentInputCache = new RingBuffer((self.renderCacheSize >> 2)+1); + self.recentInputCache = new RingBuffer((self.renderCacheSize >> 2) + 1); self.collisionSys = new collisions.Collisions(); @@ -768,18 +768,18 @@ cc.Class({ const newPlayerCollider = self.collisionSys.createPolygon(x0, y0, pts); const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - newPlayerCollider.collisionPlayerIndex = collisionPlayerIndex; - newPlayerCollider.playerId = playerRichInfo.id; + newPlayerCollider.collisionPlayerIndex = parseInt(collisionPlayerIndex); + newPlayerCollider.playerId = parseInt(playerRichInfo.id); self.collisionSysMap.set(collisionPlayerIndex, newPlayerCollider); safelyAddChild(self.node, newPlayerNode); setLocalZOrder(newPlayerNode, 5); newPlayerNode.active = true; - playerScriptIns.scheduleNewDirection({ + playerScriptIns.updateCharacterAnim({ dx: playerRichInfo.dir.dx, dy: playerRichInfo.dir.dy - }, true); + }, playerRichInfo, true); return [newPlayerNode, playerScriptIns]; }, @@ -978,7 +978,9 @@ cc.Class({ // TODO: check "rdf.players[playerId].characterState" instead, might have to play Atk/Atked anim! if (null != delayedInputFrameForPrevRenderFrame) { const decodedInput = self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[playerRichInfo.joinIndex - 1]); - playerRichInfo.scriptIns.scheduleNewDirection(decodedInput, false); + playerRichInfo.scriptIns.updateCharacterAnim(decodedInput, immediatePlayerInfo, false); + } else { + playerRichInfo.scriptIns.updateCharacterAnim(null, immediatePlayerInfo, false); } playerRichInfo.scriptIns.updateSpeed(immediatePlayerInfo.speed); }); @@ -1012,49 +1014,174 @@ cc.Class({ dx: currPlayerDownsync.dir.dx, dy: currPlayerDownsync.dir.dy, }, + characterState: currPlayerDownsync.characterState, speed: currPlayerDownsync.speed, battleState: currPlayerDownsync.battleState, score: currPlayerDownsync.score, removed: currPlayerDownsync.removed, joinIndex: currPlayerDownsync.joinIndex, + framesToRecover: (0 < currPlayerDownsync.framesToRecover ? currPlayerDownsync.framesToRecover - 1 : 0), + hp: currPlayerDownsync.hp, + maxHp: currPlayerDownsync.maxHp, }; } const toRet = { id: currRenderFrame.id + 1, players: nextRenderFramePlayers, + meleeBullets: [] }; + const bulletPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + const effPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + for (let j in self.playerRichInfoArr) { + const joinIndex = parseInt(j) + 1; + bulletPushbacks[joinIndex - 1] = [0.0, 0.0]; + effPushbacks[joinIndex - 1] = [0.0, 0.0]; + const playerRichInfo = self.playerRichInfoArr[j]; + const playerId = playerRichInfo.id; + const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; + const playerCollider = collisionSysMap.get(collisionPlayerIndex); + const player = currRenderFrame.players[playerId]; + + const newVx = player.virtualGridX; + const newVy = player.virtualGridY; + const newCpos = self.virtualGridToPlayerColliderPos(newVx, newVy, self.playerRichInfoArr[joinIndex - 1]); + playerCollider.x = newCpos[0]; + playerCollider.y = newCpos[1]; + } + + // Check bullet-anything collisions first, because the pushbacks caused by bullets might later be reverted by player-barrier collision + const colliderBullets = new Map(); // Will all be removed at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` due to the need for being rollback-compatible + const removedBulletsAtCurrFrame = new Set(); + for (let k in currRenderFrame.meleeBullets) { + const meleeBullet = currRenderFrame.meleeBullets[k]; + if ( + meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames <= currRenderFrame.id + && + meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames + meleeBullet.activeFrames > currRenderFrame.id + ) { + const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; + const collisionOffenderIndex = self.collisionPlayerIndexPrefix + meleeBullet.offenderJoinIndex; + const offenderCollider = collisionSysMap.get(collisionOffenderIndex); + const offender = currRenderFrame.players[meleeBullet.offenderPlayerId]; + + const xfac = Math.sign(offender.dir.dx), + yfac = 0; // By now, straight Punch offset doesn't respect "y-axis" + const x0 = offenderCollider.x + xfac * meleeBullet.hitboxOffset, + y0 = offenderCollider.y + yfac * meleeBullet.hitboxOffset; + const pts = [[0, 0], [xfac * meleeBullet.hitboxSize.x, 0], [xfac * meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; + const newBulletCollider = collisionSys.createPolygon(x0, y0, pts); + newBulletCollider.collisionBulletIndex = collisionBulletIndex; + newBulletCollider.offenderPlayerId = meleeBullet.offenderPlayerId; + newBulletCollider.pushback = meleeBullet.pushback; + newBulletCollider.hitStunFrames = meleeBullet.hitStunFrames; + collisionSysMap.set(collisionBulletIndex, newBulletCollider); + colliderBullets.set(collisionBulletIndex, newBulletCollider); + console.log(`A meleeBullet=${JSON.stringify(meleeBullet)} is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended and active frame is not yet ended`); + } + } + + collisionSys.update(); + const result1 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? + + colliderBullets.forEach((bulletCollider, collisionBulletIndex) => { + const potentials = bulletCollider.potentials(); + let shouldRemove = false; + for (const potential of potentials) { + if (null != potential.playerId && potential.playerId == bulletCollider.offenderPlayerId) continue; + if (!bulletCollider.collides(potential, result1)) continue; + if (null != potential.playerId) { + const joinIndex = potential.collisionPlayerIndex - self.collisionPlayerIndexPrefix; + bulletPushbacks[joinIndex - 1][0] += result1.overlap_x * bulletCollider.pushback; + bulletPushbacks[joinIndex - 1][1] += result1.overlap_y * bulletCollider.pushback; + const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.playerId]; + thatAckedPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atked1[0]; + const oldFrameToRecover = thatAckedPlayerInNextFrame.framesToRecover; + thatAckedPlayerInNextFrame.framesToRecover = oldFrameToRecover > bulletCollider.hitStunFrames ? oldFrameToRecover : bulletCollider.hitStunFrames; // In case the hit player is already stun, we take the larger "hitStunFrames" + } + shouldRemove = true; + } + if (shouldRemove) { + removedBulletsAtCurrFrame.add(collisionBulletIndex); + } + }); + + for (let k in currRenderFrame.meleeBullets) { + const meleeBullet = currRenderFrame.meleeBullets[k]; + // [WARNING] remove from collisionSys ANYWAY for the convenience of rollback + const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; + if (collisionSysMap.has(collisionBulletIndex)) { + const bulletCollider = collisionSysMap.get(collisionBulletIndex); + bulletCollider.remove(); + collisionSysMap.delete(collisionBulletIndex); + } + if (removedBulletsAtCurrFrame.has(collisionBulletIndex)) continue; + toRet.meleeBullets.push(meleeBullet); + } + if (null != delayedInputFrame) { + const delayedInputFrameForPrevRenderFrame = self.getCachedInputFrameDownsyncWithPrediction(self._convertToInputFrameId(currRenderFrame.id - 1, self.inputDelayFrames)); const inputList = delayedInputFrame.inputList; - const effPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + // Process player inputs for (let j in self.playerRichInfoArr) { const joinIndex = parseInt(j) + 1; effPushbacks[joinIndex - 1] = [0.0, 0.0]; - const playerId = self.playerRichInfoArr[j].id; + const playerRichInfo = self.playerRichInfoArr[j]; + const playerId = playerRichInfo.id; const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; const playerCollider = collisionSysMap.get(collisionPlayerIndex); const player = currRenderFrame.players[playerId]; + if (0 < nextRenderFramePlayers[playerId].framesToRecover) { + // No need to process inputs for this player, but there might be bullet pushbacks on this player + if (0 != bulletPushbacks[joinIndex - 1][0] || 0 != bulletPushbacks[joinIndex - 1][1]) { + playerCollider.x += bulletPushbacks[joinIndex - 1][0]; + playerCollider.y += bulletPushbacks[joinIndex - 1][1]; + console.log(`playerId=${playerId}, joinIndex=${joinIndex} is pushbacked back by ${bulletPushbacks[joinIndex - 1]} by bullet impacts, now its framesToRecover is ${player.framesToRecover}`); + } + continue; + } const decodedInput = self.ctrl.decodeInput(inputList[joinIndex - 1]); - /* - Reset "position" of players in "collisionSys" according to "virtual grid position". The easy part is that we don't have path-dependent-integrals to worry about like that of thermal dynamics. + const prevDecodedInput = (null == delayedInputFrameForPrevRenderFrame ? null : self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[joinIndex - 1])); + const prevBtnALevel = (null == prevDecodedInput ? 0 : prevDecodedInput.btnALevel); + + if (1 == decodedInput.btnALevel && 0 == prevBtnALevel) { + console.log(`playerId=${playerId} triggered a rising-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + // The online map is not yet ready for bullet shooting! + /* + nextRenderFramePlayers[playerId].framesToRecover = PunchAtkConfig.recoveryFrames; + const punch = window.pb.protos.MeleeBullet.create(PunchAtkConfig); + punch.battleLocalId = self.bulletBattleLocalIdCounter++; + punch.offenderJoinIndex = joinIndex; + punch.offenderPlayerId = playerId; + punch.originatedRenderFrameId = currRenderFrame.id; + toRet.meleeBullets.push(punch); + console.log(`A rising-edge of meleeBullet=${JSON.stringify(punch)} is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + + nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Atk1[0]; */ - const newVx = player.virtualGridX + (decodedInput.dx + player.speed * decodedInput.dx); - const newVy = player.virtualGridY + (decodedInput.dy + player.speed * decodedInput.dy); - const newCpos = self.virtualGridToPlayerColliderPos(newVx, newVy, self.playerRichInfoArr[joinIndex - 1]); - playerCollider.x = newCpos[0]; - playerCollider.y = newCpos[1]; - if (0 != decodedInput.dx || 0 != decodedInput.dy) { - // Update directions and thus would eventually update moving animation accordingly - nextRenderFramePlayers[playerId].dir.dx = decodedInput.dx; - nextRenderFramePlayers[playerId].dir.dy = decodedInput.dy; + } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { + console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + } else { + // No trigger, process movement inputs + if (0 != decodedInput.dx || 0 != decodedInput.dy) { + // Update directions and thus would eventually update moving animation accordingly + nextRenderFramePlayers[playerId].dir.dx = decodedInput.dx; + nextRenderFramePlayers[playerId].dir.dy = decodedInput.dy; + nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Walking[0]; + } else { + nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Idle1[0]; + } + const movement = self.virtualGridToWorldPos(decodedInput.dx + player.speed * decodedInput.dx, decodedInput.dy + player.speed * decodedInput.dy); + playerCollider.x += movement[0]; + playerCollider.y += movement[1]; } } - collisionSys.update(); - const result = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? + collisionSys.update(); // by now all "bulletCollider"s are removed + const result2 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? for (let j in self.playerRichInfoArr) { const joinIndex = parseInt(j) + 1; @@ -1064,10 +1191,10 @@ cc.Class({ const potentials = playerCollider.potentials(); for (const potential of potentials) { // Test if the player collides with the wall - if (!playerCollider.collides(potential, result)) continue; + if (!playerCollider.collides(potential, result2)) continue; // Push the player out of the wall - effPushbacks[joinIndex - 1][0] += result.overlap * result.overlap_x; - effPushbacks[joinIndex - 1][1] += result.overlap * result.overlap_y; + effPushbacks[joinIndex - 1][0] += result2.overlap * result2.overlap_x; + effPushbacks[joinIndex - 1][1] += result2.overlap * result2.overlap_y; } } @@ -1080,6 +1207,7 @@ cc.Class({ nextRenderFramePlayers[playerId].virtualGridX = newVpos[0]; nextRenderFramePlayers[playerId].virtualGridY = newVpos[1]; } + } return toRet; diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 20f2b29..c77dd49 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -5,25 +5,25 @@ const OnlineMap = require('./Map'); const PunchAtkConfig = { // for offender - startupFrames: 2, - activeFrames: 2, - recoveryFrames: 4, // usually but not always "startupFrames+activeFrames" - recoveryFramesOnBlock: 4, // usually but not always the same as "recoveryFrames" - recoveryFramesOnHit: 4, // usually but not always the same as "recoveryFrames" + startupFrames: 18, + activeFrames: 42, + recoveryFrames: 60, // usually but not always "startupFrames+activeFrames" + recoveryFramesOnBlock: 60, // usually but not always the same as "recoveryFrames" + recoveryFramesOnHit: 60, // usually but not always the same as "recoveryFrames" moveforward: { x: 0, y: 0, }, hitboxOffset: 12.0, // should be about the radius of the PlayerCollider hitboxSize: { - x: 24.0, - y: 24.0, + x: 32.0, + y: 32.0, }, // for defender - hitStunFrames: 0, - blockStunFrames: 0, - pushback: 10.0, + hitStunFrames: 18, + blockStunFrames: 9, + pushback: 11.0, releaseTriggerType: 1, // 1: rising-edge, 2: falling-edge damage: 5 }; @@ -58,16 +58,18 @@ cc.Class({ const newPlayerCollider = self.collisionSys.createPolygon(x0, y0, pts); const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; + newPlayerCollider.collisionPlayerIndex = parseInt(collisionPlayerIndex); + newPlayerCollider.playerId = parseInt(playerRichInfo.id); self.collisionSysMap.set(collisionPlayerIndex, newPlayerCollider); safelyAddChild(self.node, newPlayerNode); setLocalZOrder(newPlayerNode, 5); newPlayerNode.active = true; - playerScriptIns.scheduleNewDirection({ + playerScriptIns.updateCharacterAnim({ dx: playerRichInfo.dir.dx, dy: playerRichInfo.dir.dy - }, true); + }, playerRichInfo, true); return [newPlayerNode, playerScriptIns]; }, @@ -178,6 +180,8 @@ cc.Class({ virtualGridY: 0, speed: 2 * self.worldToVirtualGridRatio, colliderRadius: 12, + characterState: window.ATK_CHARACTER_STATE.Idle1[0], + framesToRecover: 0, dir: { dx: 0, dy: 0 @@ -190,6 +194,8 @@ cc.Class({ virtualGridY: 40 * self.worldToVirtualGridRatio, speed: 2 * self.worldToVirtualGridRatio, colliderRadius: 12, + characterState: window.ATK_CHARACTER_STATE.Idle1[0], + framesToRecover: 0, dir: { dx: 0, dy: 0 @@ -295,21 +301,25 @@ cc.Class({ for (let k in currRenderFrame.meleeBullets) { const meleeBullet = currRenderFrame.meleeBullets[k]; if ( - meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames >= currRenderFrame.id + meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames <= currRenderFrame.id && - meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames + meleeBullet.activeFrames <= currRenderFrame.id + meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames + meleeBullet.activeFrames > currRenderFrame.id ) { - const collisionBulletIndex = self.collisionBulletIndexPrefix + melee.battleLocalId; - const collisionOffenderIndex = self.collisionPlayerIndexPrefix + melee.offenderJoinIndex; + const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; + const collisionOffenderIndex = self.collisionPlayerIndexPrefix + meleeBullet.offenderJoinIndex; const offenderCollider = collisionSysMap.get(collisionOffenderIndex); - const offender = currRenderFrame.players[melee.offenderPlayerId]; + const offender = currRenderFrame.players[meleeBullet.offenderPlayerId]; - const x0 = offenderCollider.x + offender.dir.dx * meleeBullet.hitboxOffset, - y0 = offenderCollider.y + offender.dir.dy * meleeBullet.hitboxOffset; - const pts = [[0, 0], [meleeBullet.hitboxSize.x, 0], [meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; + const xfac = Math.sign(offender.dir.dx), + yfac = 0; // By now, straight Punch offset doesn't respect "y-axis" + const x0 = offenderCollider.x + xfac * meleeBullet.hitboxOffset, + y0 = offenderCollider.y + yfac * meleeBullet.hitboxOffset; + const pts = [[0, 0], [xfac * meleeBullet.hitboxSize.x, 0], [xfac * meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; const newBulletCollider = collisionSys.createPolygon(x0, y0, pts); newBulletCollider.collisionBulletIndex = collisionBulletIndex; + newBulletCollider.offenderPlayerId = meleeBullet.offenderPlayerId; newBulletCollider.pushback = meleeBullet.pushback; + newBulletCollider.hitStunFrames = meleeBullet.hitStunFrames; collisionSysMap.set(collisionBulletIndex, newBulletCollider); colliderBullets.set(collisionBulletIndex, newBulletCollider); console.log(`A meleeBullet=${JSON.stringify(meleeBullet)} is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended and active frame is not yet ended`); @@ -319,15 +329,16 @@ cc.Class({ collisionSys.update(); const result1 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? - colliderBullets.forEach((collisionBulletIndex, bulletCollider) => { + colliderBullets.forEach((bulletCollider, collisionBulletIndex) => { const potentials = bulletCollider.potentials(); let shouldRemove = false; for (const potential of potentials) { if (null != potential.playerId && potential.playerId == bulletCollider.offenderPlayerId) continue; if (!bulletCollider.collides(potential, result1)) continue; if (null != potential.playerId) { - bulletPushbacks[joinIndex - 1][0] += result1.overlap * result1.overlap_x * bulletCollider.pushback; - bulletPushbacks[joinIndex - 1][1] += result1.overlap * result1.overlap_y * bulletCollider.pushback; + const joinIndex = potential.collisionPlayerIndex - self.collisionPlayerIndexPrefix; + bulletPushbacks[joinIndex - 1][0] += result1.overlap_x * bulletCollider.pushback; + bulletPushbacks[joinIndex - 1][1] += result1.overlap_y * bulletCollider.pushback; const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.playerId]; thatAckedPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atked1[0]; const oldFrameToRecover = thatAckedPlayerInNextFrame.framesToRecover; @@ -343,12 +354,13 @@ cc.Class({ for (let k in currRenderFrame.meleeBullets) { const meleeBullet = currRenderFrame.meleeBullets[k]; // [WARNING] remove from collisionSys ANYWAY for the convenience of rollback - if (collisionSysMap.has(meleeBullet.collisionBulletIndex)) { - const bulletCollider = collisionSysMap.get(meleeBullet.collisionBulletIndex); + const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; + if (collisionSysMap.has(collisionBulletIndex)) { + const bulletCollider = collisionSysMap.get(collisionBulletIndex); bulletCollider.remove(); - collisionSysMap.delete(meleeBullet.collisionBulletIndex); + collisionSysMap.delete(collisionBulletIndex); } - if (removedBulletsAtCurrFrame.has(meleeBullet)) continue; + if (removedBulletsAtCurrFrame.has(collisionBulletIndex)) continue; toRet.meleeBullets.push(meleeBullet); } @@ -364,8 +376,13 @@ cc.Class({ const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; const playerCollider = collisionSysMap.get(collisionPlayerIndex); const player = currRenderFrame.players[playerId]; - if (0 < player.framesToRecover) { - // No need to process inputs for this player + if (0 < nextRenderFramePlayers[playerId].framesToRecover) { + // No need to process inputs for this player, but there might be bullet pushbacks on this player + if (0 != bulletPushbacks[joinIndex - 1][0] || 0 != bulletPushbacks[joinIndex - 1][1]) { + playerCollider.x += bulletPushbacks[joinIndex - 1][0]; + playerCollider.y += bulletPushbacks[joinIndex - 1][1]; + console.log(`playerId=${playerId}, joinIndex=${joinIndex} is pushbacked back by ${bulletPushbacks[joinIndex - 1]} by bullet impacts, now its framesToRecover is ${player.framesToRecover}`); + } continue; } @@ -374,7 +391,6 @@ cc.Class({ const prevDecodedInput = (null == delayedInputFrameForPrevRenderFrame ? null : self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[joinIndex - 1])); const prevBtnALevel = (null == prevDecodedInput ? 0 : prevDecodedInput.btnALevel); - const playerInNextFrame = nextRenderFramePlayers[playerId]; if (1 == decodedInput.btnALevel && 0 == prevBtnALevel) { console.log(`playerId=${playerId} triggered a rising-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); nextRenderFramePlayers[playerId].framesToRecover = PunchAtkConfig.recoveryFrames; @@ -386,20 +402,20 @@ cc.Class({ toRet.meleeBullets.push(punch); console.log(`A rising-edge of meleeBullet=${JSON.stringify(punch)} is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - playerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atk1[0]; + nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Atk1[0]; } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); } else { // No trigger, process movement inputs if (0 != decodedInput.dx || 0 != decodedInput.dy) { // Update directions and thus would eventually update moving animation accordingly - playerInNextFrame.dir.dx = decodedInput.dx; - playerInNextFrame.dir.dy = decodedInput.dy; - playerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Walking[0]; + nextRenderFramePlayers[playerId].dir.dx = decodedInput.dx; + nextRenderFramePlayers[playerId].dir.dy = decodedInput.dy; + nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Walking[0]; } else { - playerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Idle1[0]; + nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Idle1[0]; } - const movement = self.virtualGridToPlayerColliderPos(decodedInput.dx + player.speed * decodedInput.dx, decodedInput.dy + player.speed * decodedInput.dy, self.playerRichInfoArr[joinIndex - 1]); + const movement = self.virtualGridToWorldPos(decodedInput.dx + player.speed * decodedInput.dx, decodedInput.dy + player.speed * decodedInput.dy); playerCollider.x += movement[0]; playerCollider.y += movement[1]; } From fdc296531aa538a27fda07852064e7b644609140 Mon Sep 17 00:00:00 2001 From: genxium Date: Wed, 23 Nov 2022 22:11:28 +0800 Subject: [PATCH 5/6] A broken commit during backend bullet adaptation. --- battle_srv/models/pb_type_convert.go | 13 +- battle_srv/models/player.go | 8 +- battle_srv/models/room.go | 145 +- battle_srv/protos/room_downsync_frame.pb.go | 405 +++--- dnmshared/sharedprotos/geometry.pb.go | 2 +- frontend/assets/resources/map/dungeon/map.tmx | 181 ++- .../assets/resources/map/dungeon/tiles2.tsx | 4 + .../resources/map/dungeon/tiles2.tsx.meta | 5 + .../pbfiles/room_downsync_frame.proto | 33 +- frontend/assets/scenes/offline_map_1.fire | 1 + frontend/assets/scripts/Map.js | 133 +- frontend/assets/scripts/OfflineMap.js | 273 +--- ...om_downsync_frame_proto_bundle.forcemsg.js | 1251 +++++++++++------ 13 files changed, 1373 insertions(+), 1081 deletions(-) create mode 100644 frontend/assets/resources/map/dungeon/tiles2.tsx create mode 100644 frontend/assets/resources/map/dungeon/tiles2.tsx.meta diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index 52684aa..e854df8 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -2,7 +2,6 @@ package models import ( . "battle_srv/protos" - . "dnmshared/sharedprotos" ) func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) map[int32]*PlayerDownsync { @@ -13,13 +12,11 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) map[int32] for k, last := range modelInstances { toRet[k] = &PlayerDownsync{ - Id: last.Id, - VirtualGridX: last.VirtualGridX, - VirtualGridY: last.VirtualGridY, - Dir: &Direction{ - Dx: last.Dir.Dx, - Dy: last.Dir.Dy, - }, + Id: last.Id, + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, ColliderRadius: last.ColliderRadius, Speed: last.Speed, BattleState: last.BattleState, diff --git a/battle_srv/models/player.go b/battle_srv/models/player.go index e545faa..12e6648 100644 --- a/battle_srv/models/player.go +++ b/battle_srv/models/player.go @@ -4,7 +4,6 @@ import ( . "battle_srv/protos" "battle_srv/storage" . "dnmshared" - . "dnmshared/sharedprotos" "fmt" sq "github.com/Masterminds/squirrel" "github.com/jmoiron/sqlx" @@ -64,12 +63,7 @@ func GetPlayerById(id int) (*Player, error) { func getPlayer(cond sq.Eq) (*Player, error) { p := Player{} - pd := PlayerDownsync{ - Dir: &Direction{ - Dx: 0, - Dy: 0, - }, - } + pd := PlayerDownsync{} query, args, err := sq.Select("*").From("player").Where(cond).Limit(1).ToSql() if err != nil { return nil, err diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 5400c1e..0c535d7 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -54,6 +54,7 @@ const ( COLLISION_PLAYER_INDEX_PREFIX = (1 << 17) COLLISION_BARRIER_INDEX_PREFIX = (1 << 16) + COLLISION_BULLET_INDEX_PREFIX = (1 << 15) ) const ( @@ -1147,13 +1148,6 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende } nextRenderFrame := pR.applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputFrame, currRenderFrame, pR.CollisionSysMap) - // Update in the latest player pointers - for playerId, playerDownsync := range nextRenderFrame.Players { - pR.Players[playerId].VirtualGridX = playerDownsync.VirtualGridX - pR.Players[playerId].VirtualGridY = playerDownsync.VirtualGridY - pR.Players[playerId].Dir.Dx = playerDownsync.Dir.Dx - pR.Players[playerId].Dir.Dy = playerDownsync.Dir.Dy - } pR.RenderFrameBuffer.Put(nextRenderFrame) pR.CurDynamicsRenderFrameId++ } @@ -1166,18 +1160,23 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF // Make a copy first for playerId, currPlayerDownsync := range currRenderFrame.Players { nextRenderFramePlayers[playerId] = &PlayerDownsync{ - Id: playerId, - VirtualGridX: currPlayerDownsync.VirtualGridX, - VirtualGridY: currPlayerDownsync.VirtualGridY, - Dir: &Direction{ - Dx: currPlayerDownsync.Dir.Dx, - Dy: currPlayerDownsync.Dir.Dy, - }, - Speed: currPlayerDownsync.Speed, - BattleState: currPlayerDownsync.BattleState, - Score: currPlayerDownsync.Score, - Removed: currPlayerDownsync.Removed, - JoinIndex: currPlayerDownsync.JoinIndex, + Id: playerId, + VirtualGridX: currPlayerDownsync.VirtualGridX, + VirtualGridY: currPlayerDownsync.VirtualGridY, + DirX: currPlayerDownsync.DirX, + DirY: currPlayerDownsync.DirY, + CharacterState: currPlayerDownsync.CharacterState, + Speed: currPlayerDownsync.Speed, + BattleState: currPlayerDownsync.BattleState, + Score: currPlayerDownsync.Score, + Removed: currPlayerDownsync.Removed, + JoinIndex: currPlayerDownsync.JoinIndex, + FramesToRecover: currPlayerDownsync.FramesToRecover - 1, + Hp: currPlayerDownsync.Hp, + MaxHp: currPlayerDownsync.MaxHp, + } + if nextRenderFramePlayers[playerId].FramesToRecover < 0 { + nextRenderFramePlayers[playerId].FramesToRecover = 0 } } @@ -1185,29 +1184,113 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF Id: currRenderFrame.Id + 1, Players: nextRenderFramePlayers, CountdownNanos: (pR.BattleDurationNanos - int64(currRenderFrame.Id)*pR.RollbackEstimatedDtNanos), + MeleeBullets: make([]*MeleeBullet, 0), // Is there any better way to reduce malloc/free impact, e.g. smart prediction for fixed memory allocation? + } + + bulletPushbacks := make([]Vec2D, pR.Capacity) // Guaranteed determinism regardless of traversal order + effPushbacks := make([]Vec2D, pR.Capacity) // Guaranteed determinism regardless of traversal order + + // Reset playerCollider position from the "virtual grid position" + for playerId, player := range pR.Players { + joinIndex := player.JoinIndex + bulletPushbacks[joinIndex-1].X, bulletPushbacks[joinIndex-1].Y = float64(0), float64(0) + effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y = float64(0), float64(0) + currPlayerDownsync := currRenderFrame.Players[playerId] + newVx, newVy := currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY + collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex + playerCollider := collisionSysMap[collisionPlayerIndex] + playerCollider.X, playerCollider.Y = VirtualGridToPolygonColliderAnchorPos(newVx, newVy, player.ColliderRadius, player.ColliderRadius, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, pR.VirtualGridToWorldRatio) + } + + // Check bullet-anything collisions first, because the pushbacks caused by bullets might later be reverted by player-barrier collision + bulletColliders := make(map[int32]*resolv.Object, 0) // Will all be removed at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` due to the need for being rollback-compatible + removedBulletsAtCurrFrame := make(map[int32]int32, 0) + for _, meleeBullet := range currRenderFrame.MeleeBullets { + if (meleeBullet.OriginatedRenderFrameId+meleeBullet.StartupFrames <= currRenderFrame.Id) && (meleeBullet.OriginatedRenderFrameId+meleeBullet.StartupFrames+meleeBullet.ActiveFrames > currRenderFrame.Id) { + collisionBulletIndex := COLLISION_BULLET_INDEX_PREFIX + meleeBullet.BattleLocalId + collisionOffenderIndex := COLLISION_PLAYER_INDEX_PREFIX + meleeBullet.OffenderJoinIndex + offenderCollider := collisionSysMap[collisionOffenderIndex] + offender := currRenderFrame.Players[meleeBullet.OffenderPlayerId] + + xfac, yfac := float64(1.0), float64(0) // By now, straight Punch offset doesn't respect "y-axis" + if 0 > offender.DirX { + xfac = float64(-1.0) + } + offenderWx, offenderWy := PolygonColliderAnchorToWorldPos(offenderCollider.X, offenderCollider.Y, offender.ColliderRadius, offender.ColliderRadius, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY) + + bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy+yfac*meleeBullet.HitboxOffset + + newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, xfac*meleeBullet.HitboxSize.X, meleeBullet.HitboxSize.Y, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, "MeleeBullet") + // newBulletCollider.collisionBulletIndex = collisionBulletIndex + // newBulletCollider.offenderPlayerId = meleeBullet.offenderPlayerId + // newBulletCollider.pushback = meleeBullet.pushback + // newBulletCollider.hitStunFrames = meleeBullet.hitStunFrames + collisionSysMap[collisionBulletIndex] = newBulletCollider + bulletColliders[collisionBulletIndex] = newBulletCollider + newBulletCollider.Update() + } + } + + // for _, bulletCollider := range bulletColliders { + // shouldRemove := false + // if collision := bulletCollider.Check(0, 0); collision != nil { + // bulletShape := bulletCollider.Shape.(*resolv.ConvexPolygon) + // for _, obj := range collision.Objects { + // bShape := obj.Shape.(*resolv.ConvexPolygon) + // if overlapped, pushbackX, pushbackY, overlapResult := CalcPushbacks(0, 0, bulletShape, bShape); overlapped { + // bulletPushbacks[joinIndex-1].X += pushbackX + // bulletPushbacks[joinIndex-1].Y += pushbackY + // } + // } + // shouldRemove = true + // } + // if shouldRemove { + // removedBulletsAtCurrFrame[bulletCollider.CollisionBulletIndex] = 1 + // } + // } + + for _, meleeBullet := range currRenderFrame.MeleeBullets { + collisionBulletIndex := COLLISION_BULLET_INDEX_PREFIX + meleeBullet.BattleLocalId + if bulletCollider, existent := collisionSysMap[collisionBulletIndex]; existent { + bulletCollider.Space.Remove(bulletCollider) + delete(collisionSysMap, collisionBulletIndex) + } + if _, existent := removedBulletsAtCurrFrame[collisionBulletIndex]; existent { + continue + } + toRet.MeleeBullets = append(toRet.MeleeBullets, meleeBullet) } if nil != delayedInputFrame { inputList := delayedInputFrame.InputList - effPushbacks := make([]Vec2D, pR.Capacity) // Guaranteed determinism regardless of traversal order + // Process player inputs for playerId, player := range pR.Players { joinIndex := player.JoinIndex - effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y = float64(0), float64(0) - currPlayerDownsync := currRenderFrame.Players[playerId] - decodedInput := pR.decodeInput(inputList[joinIndex-1]) - proposedVirtualGridDx, proposedVirtualGridDy := (decodedInput.Dx + decodedInput.Dx*currPlayerDownsync.Speed), (decodedInput.Dy + decodedInput.Dy*currPlayerDownsync.Speed) - newVx, newVy := (currPlayerDownsync.VirtualGridX + proposedVirtualGridDx), (currPlayerDownsync.VirtualGridY + proposedVirtualGridDy) - // Reset playerCollider position from the "virtual grid position" collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex playerCollider := collisionSysMap[collisionPlayerIndex] - playerCollider.X, playerCollider.Y = VirtualGridToPolygonColliderAnchorPos(newVx, newVy, player.ColliderRadius, player.ColliderRadius, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, pR.VirtualGridToWorldRatio) + if 0 < nextRenderFramePlayers[playerId].FramesToRecover { + // No need to process inputs for this player, but there might be bullet pushbacks on this player + playerCollider.X += bulletPushbacks[joinIndex-1].X + playerCollider.Y += bulletPushbacks[joinIndex-1].Y + continue + } + currPlayerDownsync := currRenderFrame.Players[playerId] + decodedInput := pR.decodeInput(inputList[joinIndex-1]) + + if 0 != decodedInput.Dx || 0 != decodedInput.Dy { + nextRenderFramePlayers[playerId].DirX = decodedInput.Dx + nextRenderFramePlayers[playerId].DirY = decodedInput.Dy + nextRenderFramePlayers[playerId].CharacterState = 1 + } else { + nextRenderFramePlayers[playerId].CharacterState = 0 + } + + movementX, movementY := VirtualGridToWorldPos(decodedInput.Dx+decodedInput.Dx*currPlayerDownsync.Speed, decodedInput.Dy+decodedInput.Dy*currPlayerDownsync.Speed, pR.VirtualGridToWorldRatio) + playerCollider.X += movementX + playerCollider.Y += movementY // Update in the collision system playerCollider.Update() - if 0 != decodedInput.Dx || 0 != decodedInput.Dy { - nextRenderFramePlayers[playerId].Dir.Dx = decodedInput.Dx - nextRenderFramePlayers[playerId].Dir.Dy = decodedInput.Dy - } } // handle pushbacks upon collision after all movements treated as simultaneous diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index 86bc8e7..9a37967 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.7.1 +// protoc v3.21.4 // source: room_downsync_frame.proto package protos @@ -257,24 +257,25 @@ type PlayerDownsync struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` - VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` - Dir *sharedprotos.Direction `protobuf:"bytes,4,opt,name=dir,proto3" json:"dir,omitempty"` - Speed int32 `protobuf:"varint,5,opt,name=speed,proto3" json:"speed,omitempty"` // in terms of virtual grid units - BattleState int32 `protobuf:"varint,6,opt,name=battleState,proto3" json:"battleState,omitempty"` - JoinIndex int32 `protobuf:"varint,7,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` - ColliderRadius float64 `protobuf:"fixed64,8,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` - Removed bool `protobuf:"varint,9,opt,name=removed,proto3" json:"removed,omitempty"` - Score int32 `protobuf:"varint,10,opt,name=score,proto3" json:"score,omitempty"` - LastMoveGmtMillis int32 `protobuf:"varint,11,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` - FramesToRecover int32 `protobuf:"varint,12,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` - Hp int32 `protobuf:"varint,13,opt,name=hp,proto3" json:"hp,omitempty"` - MaxHp int32 `protobuf:"varint,14,opt,name=maxHp,proto3" json:"maxHp,omitempty"` - CharacterState int32 `protobuf:"varint,15,opt,name=characterState,proto3" json:"characterState,omitempty"` - Name string `protobuf:"bytes,16,opt,name=name,proto3" json:"name,omitempty"` - DisplayName string `protobuf:"bytes,17,opt,name=displayName,proto3" json:"displayName,omitempty"` - Avatar string `protobuf:"bytes,18,opt,name=avatar,proto3" json:"avatar,omitempty"` + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` + VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` + DirX int32 `protobuf:"varint,4,opt,name=dirX,proto3" json:"dirX,omitempty"` + DirY int32 `protobuf:"varint,5,opt,name=dirY,proto3" json:"dirY,omitempty"` + Speed int32 `protobuf:"varint,6,opt,name=speed,proto3" json:"speed,omitempty"` // in terms of virtual grid units + BattleState int32 `protobuf:"varint,7,opt,name=battleState,proto3" json:"battleState,omitempty"` + JoinIndex int32 `protobuf:"varint,8,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` + ColliderRadius float64 `protobuf:"fixed64,9,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` + Removed bool `protobuf:"varint,10,opt,name=removed,proto3" json:"removed,omitempty"` + Score int32 `protobuf:"varint,11,opt,name=score,proto3" json:"score,omitempty"` + LastMoveGmtMillis int32 `protobuf:"varint,12,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` + FramesToRecover int32 `protobuf:"varint,13,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` + Hp int32 `protobuf:"varint,14,opt,name=hp,proto3" json:"hp,omitempty"` + MaxHp int32 `protobuf:"varint,15,opt,name=maxHp,proto3" json:"maxHp,omitempty"` + CharacterState int32 `protobuf:"varint,16,opt,name=characterState,proto3" json:"characterState,omitempty"` + Name string `protobuf:"bytes,17,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,18,opt,name=displayName,proto3" json:"displayName,omitempty"` + Avatar string `protobuf:"bytes,19,opt,name=avatar,proto3" json:"avatar,omitempty"` } func (x *PlayerDownsync) Reset() { @@ -330,11 +331,18 @@ func (x *PlayerDownsync) GetVirtualGridY() int32 { return 0 } -func (x *PlayerDownsync) GetDir() *sharedprotos.Direction { +func (x *PlayerDownsync) GetDirX() int32 { if x != nil { - return x.Dir + return x.DirX } - return nil + return 0 +} + +func (x *PlayerDownsync) GetDirY() int32 { + if x != nil { + return x.DirY + } + return 0 } func (x *PlayerDownsync) GetSpeed() int32 { @@ -1198,167 +1206,166 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xb5, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, + 0x38, 0x01, 0x22, 0xb2, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x29, 0x0a, - 0x03, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, - 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, - 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, - 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, - 0x0a, 0x02, 0x68, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, - 0x0a, 0x05, 0x6d, 0x61, 0x78, 0x48, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, - 0x61, 0x78, 0x48, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, - 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, - 0x0e, 0x0a, 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, - 0x0e, 0x0a, 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, - 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, - 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, - 0x7c, 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, - 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, - 0x0f, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, - 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, - 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, - 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, - 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, - 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, - 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, - 0x63, 0x52, 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, - 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, - 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, - 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, - 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, - 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, - 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x22, 0xe5, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, - 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x30, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, - 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, - 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, - 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, - 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, - 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, - 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, - 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, - 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x0a, - 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x52, 0x6f, - 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x40, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, - 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, - 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, - 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, - 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, - 0x5f, 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x69, 0x72, 0x58, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, + 0x58, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x59, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x64, 0x69, 0x72, 0x59, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x62, + 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x63, + 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, + 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, + 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x68, + 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, + 0x61, 0x78, 0x48, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x48, + 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, + 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, + 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, 0x02, + 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, + 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, + 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x12, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, + 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, + 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, 0x0a, + 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, 0x65, + 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, 0x69, + 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, + 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, + 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x02, + 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, + 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, + 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0xe5, + 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, + 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x13, + 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, + 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x12, 0x35, + 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x68, 0x69, 0x74, + 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x68, 0x69, 0x74, + 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, + 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, + 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, + 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, + 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, + 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, 0x68, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x10, 0x6f, 0x66, + 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, + 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, + 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, + 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, + 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, + 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, + 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, + 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x1a, + 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, + 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1388,32 +1395,30 @@ var file_room_downsync_frame_proto_goTypes = []interface{}{ nil, // 10: protos.BattleColliderInfo.StrToVec2DListMapEntry nil, // 11: protos.BattleColliderInfo.StrToPolygon2DListMapEntry nil, // 12: protos.RoomDownsyncFrame.PlayersEntry - (*sharedprotos.Direction)(nil), // 13: sharedprotos.Direction - (*sharedprotos.Vec2D)(nil), // 14: sharedprotos.Vec2D - (*sharedprotos.Vec2DList)(nil), // 15: sharedprotos.Vec2DList - (*sharedprotos.Polygon2DList)(nil), // 16: sharedprotos.Polygon2DList + (*sharedprotos.Vec2D)(nil), // 13: sharedprotos.Vec2D + (*sharedprotos.Vec2DList)(nil), // 14: sharedprotos.Vec2DList + (*sharedprotos.Polygon2DList)(nil), // 15: sharedprotos.Polygon2DList } var file_room_downsync_frame_proto_depIdxs = []int32{ 10, // 0: protos.BattleColliderInfo.strToVec2DListMap:type_name -> protos.BattleColliderInfo.StrToVec2DListMapEntry 11, // 1: protos.BattleColliderInfo.strToPolygon2DListMap:type_name -> protos.BattleColliderInfo.StrToPolygon2DListMapEntry - 13, // 2: protos.PlayerDownsync.dir:type_name -> sharedprotos.Direction - 3, // 3: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync - 5, // 4: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync - 9, // 5: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame - 4, // 6: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync - 0, // 7: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo - 14, // 8: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D - 14, // 9: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D - 12, // 10: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry - 8, // 11: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet - 15, // 12: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList - 16, // 13: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList - 1, // 14: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync - 15, // [15:15] is the sub-list for method output_type - 15, // [15:15] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 3, // 2: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync + 5, // 3: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync + 9, // 4: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame + 4, // 5: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync + 0, // 6: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo + 13, // 7: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D + 13, // 8: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D + 12, // 9: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry + 8, // 10: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet + 14, // 11: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList + 15, // 12: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList + 1, // 13: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync + 14, // [14:14] is the sub-list for method output_type + 14, // [14:14] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_room_downsync_frame_proto_init() } diff --git a/dnmshared/sharedprotos/geometry.pb.go b/dnmshared/sharedprotos/geometry.pb.go index e3aedc9..b96f64b 100644 --- a/dnmshared/sharedprotos/geometry.pb.go +++ b/dnmshared/sharedprotos/geometry.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.7.1 +// protoc v3.21.4 // source: geometry.proto package sharedprotos diff --git a/frontend/assets/resources/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index 3f6bc43..60573ed 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -1,17 +1,18 @@ - + - + + - eJzt0jEOwjAUREGLkiLmALRU3In7HwMKkFCUCCwiNrKnmCbVvh8fSikHAAAA/qruYEOr84Zd+vM9re0v+vXr1z9S/7f0l3KZ9dXZ91r67QeAXxyf0jv0Z/tvO9iS7F+T3ucG+Xuk96RvkN4CMJLaIL0VttLy7r19euHdA+zX6YP0vlR3z/3ax2tfarw+TAO0L/VPb3ruXvv3o7z7lv70zuQN0vtgz+6DDSsZ + eJzt2q1u22AYhuEo1UhBtYFWKh/bmRRMRYNFPZPxwcKi7jznSInkWk7teG5ex88FLhQD570d5/PP1WazuQIAAAAAAAAAAAAAAAAAgAmu96r3g/N5bjn0fw5U3aGy/3bv0P+p8XDEdoX0f9//GP3Xp93/YaD/9QJa6f95/fvov26773671zeb7jmhupX+5+2fQH/9qztU9v8yQXUz/fXXX3/9a/ovgf7666+//vrrf1n9/4zc7tue/uvq/9Z4PfLZ7vnz38ZP/cv7T53p4Z7i7/+kv/7667/bl/sO/dff/77T3+9ff/3r+38dMGf/Nv1r+w917+v/0vh1okN/67/l9B/b/nFj/X8pxvYf236r/0UZ6t/X+Efj5kj7bv+uxxPpX9e/r/1NS7f7Z/S/a3zXfzH9Pzrvt/vPTf/l9p+yRjyV/ufvP+YY6M5yzr5D5uy/XUCLJfafa8YfmdJe//X0r6Z/9jGgv/7661/doqp/9fyrpV//Vc+/mv7Z9M+mfzb9s+mfTf9s+mfTP5v+2fTPpn82/bPpn03/bPpn0z+b/tn0z6Z/Nv2z6Z/N+9/Z9M+mfzb//9n0z6Z/Nv2z6Z9N/2z6Z9M/m/7Z0vtT3wEAAAAAAAAAAAAAAAA4v39IY4NC - + - + @@ -19,71 +20,149 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/assets/resources/map/dungeon/tiles2.tsx b/frontend/assets/resources/map/dungeon/tiles2.tsx new file mode 100644 index 0000000..6016271 --- /dev/null +++ b/frontend/assets/resources/map/dungeon/tiles2.tsx @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/assets/resources/map/dungeon/tiles2.tsx.meta b/frontend/assets/resources/map/dungeon/tiles2.tsx.meta new file mode 100644 index 0000000..9092881 --- /dev/null +++ b/frontend/assets/resources/map/dungeon/tiles2.tsx.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.0.0", + "uuid": "2e53500f-f9c8-4b5b-b74c-f2adbc2ec34d", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index 88ad1cc..ca476a8 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -38,22 +38,23 @@ message PlayerDownsync { int32 id = 1; int32 virtualGridX = 2; int32 virtualGridY = 3; - sharedprotos.Direction dir = 4; - int32 speed = 5; // in terms of virtual grid units - int32 battleState = 6; - int32 joinIndex = 7; - double colliderRadius = 8; - bool removed = 9; - int32 score = 10; - int32 lastMoveGmtMillis = 11; - int32 framesToRecover = 12; - int32 hp = 13; - int32 maxHp = 14; - int32 characterState = 15; + int32 dirX = 4; + int32 dirY = 5; + int32 speed = 6; // in terms of virtual grid units + int32 battleState = 7; + int32 joinIndex = 8; + double colliderRadius = 9; + bool removed = 10; + int32 score = 11; + int32 lastMoveGmtMillis = 12; + int32 framesToRecover = 13; + int32 hp = 14; + int32 maxHp = 15; + int32 characterState = 16; - string name = 16; - string displayName = 17; - string avatar = 18; + string name = 17; + string displayName = 18; + string avatar = 19; } message InputFrameDecoded { @@ -123,8 +124,6 @@ message MeleeBullet { int32 offenderJoinIndex = 16; int32 offenderPlayerId = 17; - - int32 offenderPlayerId = 17; } message RoomDownsyncFrame { diff --git a/frontend/assets/scenes/offline_map_1.fire b/frontend/assets/scenes/offline_map_1.fire index eda2fde..0ac0a62 100644 --- a/frontend/assets/scenes/offline_map_1.fire +++ b/frontend/assets/scenes/offline_map_1.fire @@ -277,6 +277,7 @@ "forceBigEndianFloatingNumDecoding": false, "renderFrameIdLagTolerance": 4, "jigglingEps1D": 0.001, + "bulletTriggerEnabled": true, "_id": "4b+kZ46VhC0LCBixXEK2dk" }, { diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 75b79ef..8cf2031 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -95,6 +95,9 @@ cc.Class({ type: cc.Float, default: 1e-3 }, + bulletTriggerEnabled: { + default: false + }, }, _inputFrameIdDebuggable(inputFrameId) { @@ -321,10 +324,10 @@ cc.Class({ self.battleState = ALL_BATTLE_STATES.WAITING; + self.countdownNanos = null; if (self.countdownLabel) { self.countdownLabel.string = ""; } - self.countdownNanos = null; if (self.findingPlayerNode) { const findingPlayerScriptIns = self.findingPlayerNode.getComponent("FindingPlayer"); findingPlayerScriptIns.init(); @@ -741,17 +744,15 @@ cc.Class({ self.playersInfoNode.getComponent("PlayersInfo").clearInfo(); }, - spawnPlayerNode(joinIndex, vx, vy, playerRichInfo) { + spawnPlayerNode(joinIndex, vx, vy, playerDownsyncInfo) { const self = this; const newPlayerNode = cc.instantiate(self.controlledCharacterPrefab) const playerScriptIns = newPlayerNode.getComponent("ControlledCharacter"); - playerScriptIns.joinIndex = joinIndex; - if (1 == joinIndex) { playerScriptIns.setSpecies("SoldierWaterGhost"); } else if (2 == joinIndex) { playerScriptIns.setSpecies("SoldierFireGhost"); - if (0 == playerRichInfo.dir.dx && 0 == playerRichInfo.dir.dy) { + if (0 == playerDownsyncInfo.dirX && 0 == playerDownsyncInfo.dirY) { playerScriptIns.animComp.node.scaleX = (-1.0); } } @@ -760,16 +761,15 @@ cc.Class({ newPlayerNode.setPosition(cc.v2(wpos[0], wpos[1])); playerScriptIns.mapNode = self.node; - const cpos = self.virtualGridToPlayerColliderPos(vx, vy, playerRichInfo); - const d = playerRichInfo.colliderRadius * 2, + const cpos = self.virtualGridToPlayerColliderPos(vx, vy, playerDownsyncInfo); + const d = playerDownsyncInfo.colliderRadius * 2, x0 = cpos[0], y0 = cpos[1]; let pts = [[0, 0], [d, 0], [d, d], [0, d]]; const newPlayerCollider = self.collisionSys.createPolygon(x0, y0, pts); const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - newPlayerCollider.collisionPlayerIndex = parseInt(collisionPlayerIndex); - newPlayerCollider.playerId = parseInt(playerRichInfo.id); + newPlayerCollider.data = playerDownsyncInfo; self.collisionSysMap.set(collisionPlayerIndex, newPlayerCollider); safelyAddChild(self.node, newPlayerNode); @@ -777,9 +777,9 @@ cc.Class({ newPlayerNode.active = true; playerScriptIns.updateCharacterAnim({ - dx: playerRichInfo.dir.dx, - dy: playerRichInfo.dir.dy - }, playerRichInfo, true); + dx: playerDownsyncInfo.dirX, + dy: playerDownsyncInfo.dirY, + }, playerDownsyncInfo, true); return [newPlayerNode, playerScriptIns]; }, @@ -973,8 +973,6 @@ cc.Class({ const dy = (wpos[1] - playerRichInfo.node.y); //const justJiggling = (self.jigglingEps1D >= Math.abs(dx) && self.jigglingEps1D >= Math.abs(dy)); playerRichInfo.node.setPosition(wpos[0], wpos[1]); - playerRichInfo.virtualGridX = immediatePlayerInfo.virtualGridX; - playerRichInfo.virtualGridY = immediatePlayerInfo.virtualGridY; // TODO: check "rdf.players[playerId].characterState" instead, might have to play Atk/Atked anim! if (null != delayedInputFrameForPrevRenderFrame) { const decodedInput = self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[playerRichInfo.joinIndex - 1]); @@ -1003,17 +1001,15 @@ cc.Class({ // TODO: Write unit-test for this function to compare with its backend counter part applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputFrame, currRenderFrame, collisionSys, collisionSysMap) { const self = this; - const nextRenderFramePlayers = {} + const nextRenderFramePlayers = {}; for (let playerId in currRenderFrame.players) { const currPlayerDownsync = currRenderFrame.players[playerId]; nextRenderFramePlayers[playerId] = { id: playerId, virtualGridX: currPlayerDownsync.virtualGridX, virtualGridY: currPlayerDownsync.virtualGridY, - dir: { - dx: currPlayerDownsync.dir.dx, - dy: currPlayerDownsync.dir.dy, - }, + dirX: currPlayerDownsync.dirX, + dirY: currPlayerDownsync.dirY, characterState: currPlayerDownsync.characterState, speed: currPlayerDownsync.speed, battleState: currPlayerDownsync.battleState, @@ -1034,6 +1030,8 @@ cc.Class({ const bulletPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order const effPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order + + // Reset playerCollider position from the "virtual grid position" for (let j in self.playerRichInfoArr) { const joinIndex = parseInt(j) + 1; bulletPushbacks[joinIndex - 1] = [0.0, 0.0]; @@ -1042,17 +1040,17 @@ cc.Class({ const playerId = playerRichInfo.id; const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; const playerCollider = collisionSysMap.get(collisionPlayerIndex); - const player = currRenderFrame.players[playerId]; + const currPlayerDownsync = currRenderFrame.players[playerId]; - const newVx = player.virtualGridX; - const newVy = player.virtualGridY; + const newVx = currPlayerDownsync.virtualGridX; + const newVy = currPlayerDownsync.virtualGridY; const newCpos = self.virtualGridToPlayerColliderPos(newVx, newVy, self.playerRichInfoArr[joinIndex - 1]); playerCollider.x = newCpos[0]; playerCollider.y = newCpos[1]; } // Check bullet-anything collisions first, because the pushbacks caused by bullets might later be reverted by player-barrier collision - const colliderBullets = new Map(); // Will all be removed at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` due to the need for being rollback-compatible + const bulletColliders = new Map(); // Will all be removed at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` due to the need for being rollback-compatible const removedBulletsAtCurrFrame = new Set(); for (let k in currRenderFrame.meleeBullets) { const meleeBullet = currRenderFrame.meleeBullets[k]; @@ -1066,39 +1064,39 @@ cc.Class({ const offenderCollider = collisionSysMap.get(collisionOffenderIndex); const offender = currRenderFrame.players[meleeBullet.offenderPlayerId]; - const xfac = Math.sign(offender.dir.dx), - yfac = 0; // By now, straight Punch offset doesn't respect "y-axis" + let xfac = 1, + yfac = 0; // By now, straight Punch offset doesn't respect "y-axis" + if (0 > offender.dirX) { + xfac = -1; + } const x0 = offenderCollider.x + xfac * meleeBullet.hitboxOffset, y0 = offenderCollider.y + yfac * meleeBullet.hitboxOffset; const pts = [[0, 0], [xfac * meleeBullet.hitboxSize.x, 0], [xfac * meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; const newBulletCollider = collisionSys.createPolygon(x0, y0, pts); - newBulletCollider.collisionBulletIndex = collisionBulletIndex; - newBulletCollider.offenderPlayerId = meleeBullet.offenderPlayerId; - newBulletCollider.pushback = meleeBullet.pushback; - newBulletCollider.hitStunFrames = meleeBullet.hitStunFrames; + newBulletCollider.data = meleeBullet; collisionSysMap.set(collisionBulletIndex, newBulletCollider); - colliderBullets.set(collisionBulletIndex, newBulletCollider); - console.log(`A meleeBullet=${JSON.stringify(meleeBullet)} is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended and active frame is not yet ended`); + bulletColliders.set(collisionBulletIndex, newBulletCollider); + // console.log(`A meleeBullet is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended and active frame is not yet ended: ${JSON.stringify(meleeBullet)}`); } } collisionSys.update(); const result1 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? - colliderBullets.forEach((bulletCollider, collisionBulletIndex) => { + bulletColliders.forEach((bulletCollider, collisionBulletIndex) => { const potentials = bulletCollider.potentials(); let shouldRemove = false; for (const potential of potentials) { - if (null != potential.playerId && potential.playerId == bulletCollider.offenderPlayerId) continue; + if (null != potential.data && potential.data.joinIndex == bulletCollider.data.offenderJoinIndex) continue; if (!bulletCollider.collides(potential, result1)) continue; - if (null != potential.playerId) { - const joinIndex = potential.collisionPlayerIndex - self.collisionPlayerIndexPrefix; - bulletPushbacks[joinIndex - 1][0] += result1.overlap_x * bulletCollider.pushback; - bulletPushbacks[joinIndex - 1][1] += result1.overlap_y * bulletCollider.pushback; - const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.playerId]; + if (null != potential.data && null !== potential.data.joinIndex) { + const joinIndex = potential.data.joinIndex; + bulletPushbacks[joinIndex - 1][0] += bulletCollider.data.pushback; // Only for straight punch, there's no y-pushback + bulletPushbacks[joinIndex - 1][1] += 0; + const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.data.id]; thatAckedPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atked1[0]; const oldFrameToRecover = thatAckedPlayerInNextFrame.framesToRecover; - thatAckedPlayerInNextFrame.framesToRecover = oldFrameToRecover > bulletCollider.hitStunFrames ? oldFrameToRecover : bulletCollider.hitStunFrames; // In case the hit player is already stun, we take the larger "hitStunFrames" + thatAckedPlayerInNextFrame.framesToRecover = (oldFrameToRecover > bulletCollider.data.hitStunFrames ? oldFrameToRecover : bulletCollider.data.hitStunFrames); // In case the hit player is already stun, we extend it } shouldRemove = true; } @@ -1107,9 +1105,9 @@ cc.Class({ } }); + // [WARNING] Remove bullets from collisionSys ANYWAY for the convenience of rollback for (let k in currRenderFrame.meleeBullets) { const meleeBullet = currRenderFrame.meleeBullets[k]; - // [WARNING] remove from collisionSys ANYWAY for the convenience of rollback const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; if (collisionSysMap.has(collisionBulletIndex)) { const bulletCollider = collisionSysMap.get(collisionBulletIndex); @@ -1120,10 +1118,10 @@ cc.Class({ toRet.meleeBullets.push(meleeBullet); } + // Process player inputs if (null != delayedInputFrame) { const delayedInputFrameForPrevRenderFrame = self.getCachedInputFrameDownsyncWithPrediction(self._convertToInputFrameId(currRenderFrame.id - 1, self.inputDelayFrames)); const inputList = delayedInputFrame.inputList; - // Process player inputs for (let j in self.playerRichInfoArr) { const joinIndex = parseInt(j) + 1; effPushbacks[joinIndex - 1] = [0.0, 0.0]; @@ -1131,13 +1129,14 @@ cc.Class({ const playerId = playerRichInfo.id; const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; const playerCollider = collisionSysMap.get(collisionPlayerIndex); - const player = currRenderFrame.players[playerId]; - if (0 < nextRenderFramePlayers[playerId].framesToRecover) { + const currPlayerDownsync = currRenderFrame.players[playerId]; + const thatPlayerInNextFrame = nextRenderFramePlayers[playerId]; + if (0 < thatPlayerInNextFrame.framesToRecover) { // No need to process inputs for this player, but there might be bullet pushbacks on this player + playerCollider.x += bulletPushbacks[joinIndex - 1][0]; + playerCollider.y += bulletPushbacks[joinIndex - 1][1]; if (0 != bulletPushbacks[joinIndex - 1][0] || 0 != bulletPushbacks[joinIndex - 1][1]) { - playerCollider.x += bulletPushbacks[joinIndex - 1][0]; - playerCollider.y += bulletPushbacks[joinIndex - 1][1]; - console.log(`playerId=${playerId}, joinIndex=${joinIndex} is pushbacked back by ${bulletPushbacks[joinIndex - 1]} by bullet impacts, now its framesToRecover is ${player.framesToRecover}`); + console.log(`playerId=${playerId}, joinIndex=${joinIndex} is pushbacked back by ${bulletPushbacks[joinIndex - 1]} by bullet impacts, now its framesToRecover is ${currPlayerDownsync.framesToRecover}`); } continue; } @@ -1148,33 +1147,32 @@ cc.Class({ const prevBtnALevel = (null == prevDecodedInput ? 0 : prevDecodedInput.btnALevel); if (1 == decodedInput.btnALevel && 0 == prevBtnALevel) { - console.log(`playerId=${playerId} triggered a rising-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - // The online map is not yet ready for bullet shooting! - /* - nextRenderFramePlayers[playerId].framesToRecover = PunchAtkConfig.recoveryFrames; - const punch = window.pb.protos.MeleeBullet.create(PunchAtkConfig); - punch.battleLocalId = self.bulletBattleLocalIdCounter++; - punch.offenderJoinIndex = joinIndex; - punch.offenderPlayerId = playerId; - punch.originatedRenderFrameId = currRenderFrame.id; - toRet.meleeBullets.push(punch); - console.log(`A rising-edge of meleeBullet=${JSON.stringify(punch)} is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + // console.log(`playerId=${playerId} triggered a rising-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + if (self.bulletTriggerEnabled) { + thatPlayerInNextFrame.framesToRecover = window.PunchAtkConfig.recoveryFrames; + const punch = window.pb.protos.MeleeBullet.create(window.PunchAtkConfig); + punch.battleLocalId = self.bulletBattleLocalIdCounter++; + punch.offenderJoinIndex = joinIndex; + punch.offenderPlayerId = playerId; + punch.originatedRenderFrameId = currRenderFrame.id; + toRet.meleeBullets.push(punch); + console.log(`A rising-edge of meleeBullet is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}: ${JSON.stringify(punch)}`); - nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Atk1[0]; - */ + thatPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atk1[0]; + } } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { - console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); + // console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); } else { // No trigger, process movement inputs if (0 != decodedInput.dx || 0 != decodedInput.dy) { // Update directions and thus would eventually update moving animation accordingly - nextRenderFramePlayers[playerId].dir.dx = decodedInput.dx; - nextRenderFramePlayers[playerId].dir.dy = decodedInput.dy; - nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Walking[0]; + thatPlayerInNextFrame.dirX = decodedInput.dx; + thatPlayerInNextFrame.dirY = decodedInput.dy; + thatPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Walking[0]; } else { - nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Idle1[0]; + thatPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Idle1[0]; } - const movement = self.virtualGridToWorldPos(decodedInput.dx + player.speed * decodedInput.dx, decodedInput.dy + player.speed * decodedInput.dy); + const movement = self.virtualGridToWorldPos(decodedInput.dx + currPlayerDownsync.speed * decodedInput.dx, decodedInput.dy + currPlayerDownsync.speed * decodedInput.dy); playerCollider.x += movement[0]; playerCollider.y += movement[1]; } @@ -1204,8 +1202,9 @@ cc.Class({ const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; const playerCollider = collisionSysMap.get(collisionPlayerIndex); const newVpos = self.playerColliderAnchorToVirtualGridPos(playerCollider.x - effPushbacks[joinIndex - 1][0], playerCollider.y - effPushbacks[joinIndex - 1][1], self.playerRichInfoArr[j]); - nextRenderFramePlayers[playerId].virtualGridX = newVpos[0]; - nextRenderFramePlayers[playerId].virtualGridY = newVpos[1]; + const thatPlayerInNextFrame = nextRenderFramePlayers[playerId]; + thatPlayerInNextFrame.virtualGridX = newVpos[0]; + thatPlayerInNextFrame.virtualGridY = newVpos[1]; } } diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index c77dd49..7787e4b 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -3,27 +3,27 @@ i18n.init(window.language); // languageID should be equal to the one we input in const OnlineMap = require('./Map'); -const PunchAtkConfig = { +window.PunchAtkConfig = { // for offender startupFrames: 18, activeFrames: 42, - recoveryFrames: 60, // usually but not always "startupFrames+activeFrames" - recoveryFramesOnBlock: 60, // usually but not always the same as "recoveryFrames" - recoveryFramesOnHit: 60, // usually but not always the same as "recoveryFrames" + recoveryFrames: 61, // usually but not always "startupFrames+activeFrames", I hereby set it to be 1 frame more than the actual animation to avoid critical transition, i.e. when the animation is 1 frame from ending but "rdfPlayer.framesToRecover" is already counted 0 and the player triggers an other same attack, making an effective bullet trigger but no animation is played due to same animName is still playing + recoveryFramesOnBlock: 61, + recoveryFramesOnHit: 61, moveforward: { x: 0, y: 0, }, hitboxOffset: 12.0, // should be about the radius of the PlayerCollider hitboxSize: { - x: 32.0, + x: 45.0, y: 32.0, }, // for defender hitStunFrames: 18, blockStunFrames: 9, - pushback: 11.0, + pushback: 22.0, releaseTriggerType: 1, // 1: rising-edge, 2: falling-edge damage: 5 }; @@ -35,45 +35,6 @@ cc.Class({ console.warn("+++++++ Map onDestroy()"); }, - spawnPlayerNode(joinIndex, vx, vy, playerRichInfo) { - const self = this; - const newPlayerNode = cc.instantiate(self.controlledCharacterPrefab) - const playerScriptIns = newPlayerNode.getComponent("ControlledCharacter"); - if (1 == joinIndex) { - playerScriptIns.setSpecies("SoldierWaterGhost"); - } else if (2 == joinIndex) { - playerScriptIns.setSpecies("SoldierFireGhost"); - playerScriptIns.animComp.node.scaleX = (-1.0); - } - const wpos = self.virtualGridToWorldPos(vx, vy); - - newPlayerNode.setPosition(cc.v2(wpos[0], wpos[1])); - - playerScriptIns.mapNode = self.node; - const cpos = self.virtualGridToPlayerColliderPos(vx, vy, playerRichInfo); - const d = playerRichInfo.colliderRadius * 2, - x0 = cpos[0], - y0 = cpos[1]; - let pts = [[0, 0], [d, 0], [d, d], [0, d]]; - - const newPlayerCollider = self.collisionSys.createPolygon(x0, y0, pts); - const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - newPlayerCollider.collisionPlayerIndex = parseInt(collisionPlayerIndex); - newPlayerCollider.playerId = parseInt(playerRichInfo.id); - self.collisionSysMap.set(collisionPlayerIndex, newPlayerCollider); - - safelyAddChild(self.node, newPlayerNode); - setLocalZOrder(newPlayerNode, 5); - - newPlayerNode.active = true; - playerScriptIns.updateCharacterAnim({ - dx: playerRichInfo.dir.dx, - dy: playerRichInfo.dir.dy - }, playerRichInfo, true); - - return [newPlayerNode, playerScriptIns]; - }, - onLoad() { const self = this; window.mapIns = self; @@ -182,10 +143,8 @@ cc.Class({ colliderRadius: 12, characterState: window.ATK_CHARACTER_STATE.Idle1[0], framesToRecover: 0, - dir: { - dx: 0, - dy: 0 - } + dirX: 0, + dirY: 0, }, 11: { id: 11, @@ -196,10 +155,8 @@ cc.Class({ colliderRadius: 12, characterState: window.ATK_CHARACTER_STATE.Idle1[0], framesToRecover: 0, - dir: { - dx: 0, - dy: 0 - } + dirX: 0, + dirY: 0, }, } }; @@ -243,214 +200,4 @@ cc.Class({ } } }, - - // Overriding this function to test experimental dynamics - applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputFrame, currRenderFrame, collisionSys, collisionSysMap) { - const self = this; - const nextRenderFramePlayers = {} - for (let playerId in currRenderFrame.players) { - const currPlayerDownsync = currRenderFrame.players[playerId]; - nextRenderFramePlayers[playerId] = { - id: playerId, - virtualGridX: currPlayerDownsync.virtualGridX, - virtualGridY: currPlayerDownsync.virtualGridY, - dir: { - dx: currPlayerDownsync.dir.dx, - dy: currPlayerDownsync.dir.dy, - }, - characterState: currPlayerDownsync.characterState, - speed: currPlayerDownsync.speed, - battleState: currPlayerDownsync.battleState, - score: currPlayerDownsync.score, - removed: currPlayerDownsync.removed, - joinIndex: currPlayerDownsync.joinIndex, - framesToRecover: (0 < currPlayerDownsync.framesToRecover ? currPlayerDownsync.framesToRecover - 1 : 0), - hp: currPlayerDownsync.hp, - maxHp: currPlayerDownsync.maxHp, - }; - } - - const toRet = { - id: currRenderFrame.id + 1, - players: nextRenderFramePlayers, - meleeBullets: [] - }; - - const bulletPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order - const effPushbacks = new Array(self.playerRichInfoArr.length); // Guaranteed determinism regardless of traversal order - for (let j in self.playerRichInfoArr) { - const joinIndex = parseInt(j) + 1; - bulletPushbacks[joinIndex - 1] = [0.0, 0.0]; - effPushbacks[joinIndex - 1] = [0.0, 0.0]; - const playerRichInfo = self.playerRichInfoArr[j]; - const playerId = playerRichInfo.id; - const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - const playerCollider = collisionSysMap.get(collisionPlayerIndex); - const player = currRenderFrame.players[playerId]; - - const newVx = player.virtualGridX; - const newVy = player.virtualGridY; - const newCpos = self.virtualGridToPlayerColliderPos(newVx, newVy, self.playerRichInfoArr[joinIndex - 1]); - playerCollider.x = newCpos[0]; - playerCollider.y = newCpos[1]; - } - - // Check bullet-anything collisions first, because the pushbacks caused by bullets might later be reverted by player-barrier collision - const colliderBullets = new Map(); // Will all be removed at the end of `applyInputFrameDownsyncDynamicsOnSingleRenderFrame` due to the need for being rollback-compatible - const removedBulletsAtCurrFrame = new Set(); - for (let k in currRenderFrame.meleeBullets) { - const meleeBullet = currRenderFrame.meleeBullets[k]; - if ( - meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames <= currRenderFrame.id - && - meleeBullet.originatedRenderFrameId + meleeBullet.startupFrames + meleeBullet.activeFrames > currRenderFrame.id - ) { - const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; - const collisionOffenderIndex = self.collisionPlayerIndexPrefix + meleeBullet.offenderJoinIndex; - const offenderCollider = collisionSysMap.get(collisionOffenderIndex); - const offender = currRenderFrame.players[meleeBullet.offenderPlayerId]; - - const xfac = Math.sign(offender.dir.dx), - yfac = 0; // By now, straight Punch offset doesn't respect "y-axis" - const x0 = offenderCollider.x + xfac * meleeBullet.hitboxOffset, - y0 = offenderCollider.y + yfac * meleeBullet.hitboxOffset; - const pts = [[0, 0], [xfac * meleeBullet.hitboxSize.x, 0], [xfac * meleeBullet.hitboxSize.x, meleeBullet.hitboxSize.y], [0, meleeBullet.hitboxSize.y]]; - const newBulletCollider = collisionSys.createPolygon(x0, y0, pts); - newBulletCollider.collisionBulletIndex = collisionBulletIndex; - newBulletCollider.offenderPlayerId = meleeBullet.offenderPlayerId; - newBulletCollider.pushback = meleeBullet.pushback; - newBulletCollider.hitStunFrames = meleeBullet.hitStunFrames; - collisionSysMap.set(collisionBulletIndex, newBulletCollider); - colliderBullets.set(collisionBulletIndex, newBulletCollider); - console.log(`A meleeBullet=${JSON.stringify(meleeBullet)} is added to collisionSys at renderFrame.id=${currRenderFrame.id} as start-up frames ended and active frame is not yet ended`); - } - } - - collisionSys.update(); - const result1 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? - - colliderBullets.forEach((bulletCollider, collisionBulletIndex) => { - const potentials = bulletCollider.potentials(); - let shouldRemove = false; - for (const potential of potentials) { - if (null != potential.playerId && potential.playerId == bulletCollider.offenderPlayerId) continue; - if (!bulletCollider.collides(potential, result1)) continue; - if (null != potential.playerId) { - const joinIndex = potential.collisionPlayerIndex - self.collisionPlayerIndexPrefix; - bulletPushbacks[joinIndex - 1][0] += result1.overlap_x * bulletCollider.pushback; - bulletPushbacks[joinIndex - 1][1] += result1.overlap_y * bulletCollider.pushback; - const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.playerId]; - thatAckedPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atked1[0]; - const oldFrameToRecover = thatAckedPlayerInNextFrame.framesToRecover; - thatAckedPlayerInNextFrame.framesToRecover = oldFrameToRecover > bulletCollider.hitStunFrames ? oldFrameToRecover : bulletCollider.hitStunFrames; // In case the hit player is already stun, we take the larger "hitStunFrames" - } - shouldRemove = true; - } - if (shouldRemove) { - removedBulletsAtCurrFrame.add(collisionBulletIndex); - } - }); - - for (let k in currRenderFrame.meleeBullets) { - const meleeBullet = currRenderFrame.meleeBullets[k]; - // [WARNING] remove from collisionSys ANYWAY for the convenience of rollback - const collisionBulletIndex = self.collisionBulletIndexPrefix + meleeBullet.battleLocalId; - if (collisionSysMap.has(collisionBulletIndex)) { - const bulletCollider = collisionSysMap.get(collisionBulletIndex); - bulletCollider.remove(); - collisionSysMap.delete(collisionBulletIndex); - } - if (removedBulletsAtCurrFrame.has(collisionBulletIndex)) continue; - toRet.meleeBullets.push(meleeBullet); - } - - if (null != delayedInputFrame) { - const delayedInputFrameForPrevRenderFrame = self.getCachedInputFrameDownsyncWithPrediction(self._convertToInputFrameId(currRenderFrame.id - 1, self.inputDelayFrames)); - const inputList = delayedInputFrame.inputList; - // Process player inputs - for (let j in self.playerRichInfoArr) { - const joinIndex = parseInt(j) + 1; - effPushbacks[joinIndex - 1] = [0.0, 0.0]; - const playerRichInfo = self.playerRichInfoArr[j]; - const playerId = playerRichInfo.id; - const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - const playerCollider = collisionSysMap.get(collisionPlayerIndex); - const player = currRenderFrame.players[playerId]; - if (0 < nextRenderFramePlayers[playerId].framesToRecover) { - // No need to process inputs for this player, but there might be bullet pushbacks on this player - if (0 != bulletPushbacks[joinIndex - 1][0] || 0 != bulletPushbacks[joinIndex - 1][1]) { - playerCollider.x += bulletPushbacks[joinIndex - 1][0]; - playerCollider.y += bulletPushbacks[joinIndex - 1][1]; - console.log(`playerId=${playerId}, joinIndex=${joinIndex} is pushbacked back by ${bulletPushbacks[joinIndex - 1]} by bullet impacts, now its framesToRecover is ${player.framesToRecover}`); - } - continue; - } - - const decodedInput = self.ctrl.decodeInput(inputList[joinIndex - 1]); - - const prevDecodedInput = (null == delayedInputFrameForPrevRenderFrame ? null : self.ctrl.decodeInput(delayedInputFrameForPrevRenderFrame.inputList[joinIndex - 1])); - const prevBtnALevel = (null == prevDecodedInput ? 0 : prevDecodedInput.btnALevel); - - if (1 == decodedInput.btnALevel && 0 == prevBtnALevel) { - console.log(`playerId=${playerId} triggered a rising-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - nextRenderFramePlayers[playerId].framesToRecover = PunchAtkConfig.recoveryFrames; - const punch = window.pb.protos.MeleeBullet.create(PunchAtkConfig); - punch.battleLocalId = self.bulletBattleLocalIdCounter++; - punch.offenderJoinIndex = joinIndex; - punch.offenderPlayerId = playerId; - punch.originatedRenderFrameId = currRenderFrame.id; - toRet.meleeBullets.push(punch); - console.log(`A rising-edge of meleeBullet=${JSON.stringify(punch)} is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - - nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Atk1[0]; - } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { - console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); - } else { - // No trigger, process movement inputs - if (0 != decodedInput.dx || 0 != decodedInput.dy) { - // Update directions and thus would eventually update moving animation accordingly - nextRenderFramePlayers[playerId].dir.dx = decodedInput.dx; - nextRenderFramePlayers[playerId].dir.dy = decodedInput.dy; - nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Walking[0]; - } else { - nextRenderFramePlayers[playerId].characterState = window.ATK_CHARACTER_STATE.Idle1[0]; - } - const movement = self.virtualGridToWorldPos(decodedInput.dx + player.speed * decodedInput.dx, decodedInput.dy + player.speed * decodedInput.dy); - playerCollider.x += movement[0]; - playerCollider.y += movement[1]; - } - } - - collisionSys.update(); // by now all "bulletCollider"s are removed - const result2 = collisionSys.createResult(); // Can I reuse a "self.collisionSysResult" object throughout the whole battle? - - for (let j in self.playerRichInfoArr) { - const joinIndex = parseInt(j) + 1; - const playerId = self.playerRichInfoArr[j].id; - const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - const playerCollider = collisionSysMap.get(collisionPlayerIndex); - const potentials = playerCollider.potentials(); - for (const potential of potentials) { - // Test if the player collides with the wall - if (!playerCollider.collides(potential, result2)) continue; - // Push the player out of the wall - effPushbacks[joinIndex - 1][0] += result2.overlap * result2.overlap_x; - effPushbacks[joinIndex - 1][1] += result2.overlap * result2.overlap_y; - } - } - - for (let j in self.playerRichInfoArr) { - const joinIndex = parseInt(j) + 1; - const playerId = self.playerRichInfoArr[j].id; - const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - const playerCollider = collisionSysMap.get(collisionPlayerIndex); - const newVpos = self.playerColliderAnchorToVirtualGridPos(playerCollider.x - effPushbacks[joinIndex - 1][0], playerCollider.y - effPushbacks[joinIndex - 1][1], self.playerRichInfoArr[j]); - nextRenderFramePlayers[playerId].virtualGridX = newVpos[0]; - nextRenderFramePlayers[playerId].virtualGridY = newVpos[1]; - } - - } - - return toRet; - }, }); diff --git a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index d061163..c42318d 100644 --- a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js +++ b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js @@ -83,9 +83,9 @@ $root.sharedprotos = (function() { Direction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dx != null && message.hasOwnProperty("dx")) + if (message.dx != null && Object.hasOwnProperty.call(message, "dx")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.dx); - if (message.dy != null && message.hasOwnProperty("dy")) + if (message.dy != null && Object.hasOwnProperty.call(message, "dy")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dy); return writer; }; @@ -121,12 +121,14 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.dx = reader.int32(); - break; - case 2: - message.dy = reader.int32(); - break; + case 1: { + message.dx = reader.int32(); + break; + } + case 2: { + message.dy = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -225,6 +227,21 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Direction + * @function getTypeUrl + * @memberof sharedprotos.Direction + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Direction.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/sharedprotos.Direction"; + }; + return Direction; })(); @@ -293,9 +310,9 @@ $root.sharedprotos = (function() { Vec2D.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.x != null && message.hasOwnProperty("x")) + if (message.x != null && Object.hasOwnProperty.call(message, "x")) writer.uint32(/* id 1, wireType 1 =*/9).double(message.x); - if (message.y != null && message.hasOwnProperty("y")) + if (message.y != null && Object.hasOwnProperty.call(message, "y")) writer.uint32(/* id 2, wireType 1 =*/17).double(message.y); return writer; }; @@ -331,12 +348,14 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.x = reader.double(); - break; - case 2: - message.y = reader.double(); - break; + case 1: { + message.x = reader.double(); + break; + } + case 2: { + message.y = reader.double(); + break; + } default: reader.skipType(tag & 7); break; @@ -435,6 +454,21 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Vec2D + * @function getTypeUrl + * @memberof sharedprotos.Vec2D + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Vec2D.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/sharedprotos.Vec2D"; + }; + return Vec2D; })(); @@ -504,7 +538,7 @@ $root.sharedprotos = (function() { Polygon2D.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.anchor != null && message.hasOwnProperty("anchor")) + if (message.anchor != null && Object.hasOwnProperty.call(message, "anchor")) $root.sharedprotos.Vec2D.encode(message.anchor, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.points != null && message.points.length) for (var i = 0; i < message.points.length; ++i) @@ -543,14 +577,16 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.anchor = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); - break; - case 2: - if (!(message.points && message.points.length)) - message.points = []; - message.points.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); - break; + case 1: { + message.anchor = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + } + case 2: { + if (!(message.points && message.points.length)) + message.points = []; + message.points.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); + break; + } default: reader.skipType(tag & 7); break; @@ -671,6 +707,21 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Polygon2D + * @function getTypeUrl + * @memberof sharedprotos.Polygon2D + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Polygon2D.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/sharedprotos.Polygon2D"; + }; + return Polygon2D; })(); @@ -768,11 +819,12 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (!(message.eles && message.eles.length)) - message.eles = []; - message.eles.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); - break; + case 1: { + if (!(message.eles && message.eles.length)) + message.eles = []; + message.eles.push($root.sharedprotos.Vec2D.decode(reader, reader.uint32())); + break; + } default: reader.skipType(tag & 7); break; @@ -879,6 +931,21 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Vec2DList + * @function getTypeUrl + * @memberof sharedprotos.Vec2DList + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Vec2DList.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/sharedprotos.Vec2DList"; + }; + return Vec2DList; })(); @@ -976,11 +1043,12 @@ $root.sharedprotos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (!(message.eles && message.eles.length)) - message.eles = []; - message.eles.push($root.sharedprotos.Polygon2D.decode(reader, reader.uint32())); - break; + case 1: { + if (!(message.eles && message.eles.length)) + message.eles = []; + message.eles.push($root.sharedprotos.Polygon2D.decode(reader, reader.uint32())); + break; + } default: reader.skipType(tag & 7); break; @@ -1087,6 +1155,21 @@ $root.sharedprotos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Polygon2DList + * @function getTypeUrl + * @memberof sharedprotos.Polygon2DList + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Polygon2DList.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/sharedprotos.Polygon2DList"; + }; + return Polygon2DList; })(); @@ -1367,59 +1450,59 @@ $root.protos = (function() { BattleColliderInfo.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.stageName != null && message.hasOwnProperty("stageName")) + if (message.stageName != null && Object.hasOwnProperty.call(message, "stageName")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.stageName); - if (message.strToVec2DListMap != null && message.hasOwnProperty("strToVec2DListMap")) + if (message.strToVec2DListMap != null && Object.hasOwnProperty.call(message, "strToVec2DListMap")) for (var keys = Object.keys(message.strToVec2DListMap), i = 0; i < keys.length; ++i) { writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); $root.sharedprotos.Vec2DList.encode(message.strToVec2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } - if (message.strToPolygon2DListMap != null && message.hasOwnProperty("strToPolygon2DListMap")) + if (message.strToPolygon2DListMap != null && Object.hasOwnProperty.call(message, "strToPolygon2DListMap")) for (var keys = Object.keys(message.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); $root.sharedprotos.Polygon2DList.encode(message.strToPolygon2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } - if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) + if (message.stageDiscreteW != null && Object.hasOwnProperty.call(message, "stageDiscreteW")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.stageDiscreteW); - if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) + if (message.stageDiscreteH != null && Object.hasOwnProperty.call(message, "stageDiscreteH")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.stageDiscreteH); - if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) + if (message.stageTileW != null && Object.hasOwnProperty.call(message, "stageTileW")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.stageTileW); - if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) + if (message.stageTileH != null && Object.hasOwnProperty.call(message, "stageTileH")) writer.uint32(/* id 7, wireType 0 =*/56).int32(message.stageTileH); - if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) + if (message.intervalToPing != null && Object.hasOwnProperty.call(message, "intervalToPing")) writer.uint32(/* id 8, wireType 0 =*/64).int32(message.intervalToPing); - if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) + if (message.willKickIfInactiveFor != null && Object.hasOwnProperty.call(message, "willKickIfInactiveFor")) writer.uint32(/* id 9, wireType 0 =*/72).int32(message.willKickIfInactiveFor); - if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) + if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) writer.uint32(/* id 10, wireType 0 =*/80).int32(message.boundRoomId); - if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) + if (message.battleDurationNanos != null && Object.hasOwnProperty.call(message, "battleDurationNanos")) writer.uint32(/* id 11, wireType 0 =*/88).int64(message.battleDurationNanos); - if (message.serverFps != null && message.hasOwnProperty("serverFps")) + if (message.serverFps != null && Object.hasOwnProperty.call(message, "serverFps")) writer.uint32(/* id 12, wireType 0 =*/96).int32(message.serverFps); - if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) + if (message.inputDelayFrames != null && Object.hasOwnProperty.call(message, "inputDelayFrames")) writer.uint32(/* id 13, wireType 0 =*/104).int32(message.inputDelayFrames); - if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) + if (message.inputScaleFrames != null && Object.hasOwnProperty.call(message, "inputScaleFrames")) writer.uint32(/* id 14, wireType 0 =*/112).uint32(message.inputScaleFrames); - if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) + if (message.nstDelayFrames != null && Object.hasOwnProperty.call(message, "nstDelayFrames")) writer.uint32(/* id 15, wireType 0 =*/120).int32(message.nstDelayFrames); - if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) + if (message.inputFrameUpsyncDelayTolerance != null && Object.hasOwnProperty.call(message, "inputFrameUpsyncDelayTolerance")) writer.uint32(/* id 16, wireType 0 =*/128).int32(message.inputFrameUpsyncDelayTolerance); - if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) + if (message.maxChasingRenderFramesPerUpdate != null && Object.hasOwnProperty.call(message, "maxChasingRenderFramesPerUpdate")) writer.uint32(/* id 17, wireType 0 =*/136).int32(message.maxChasingRenderFramesPerUpdate); - if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) + if (message.playerBattleState != null && Object.hasOwnProperty.call(message, "playerBattleState")) writer.uint32(/* id 18, wireType 0 =*/144).int32(message.playerBattleState); - if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) + if (message.rollbackEstimatedDtMillis != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtMillis")) writer.uint32(/* id 19, wireType 1 =*/153).double(message.rollbackEstimatedDtMillis); - if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) + if (message.rollbackEstimatedDtNanos != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtNanos")) writer.uint32(/* id 20, wireType 0 =*/160).int64(message.rollbackEstimatedDtNanos); - if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) + if (message.worldToVirtualGridRatio != null && Object.hasOwnProperty.call(message, "worldToVirtualGridRatio")) writer.uint32(/* id 21, wireType 1 =*/169).double(message.worldToVirtualGridRatio); - if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) + if (message.virtualGridToWorldRatio != null && Object.hasOwnProperty.call(message, "virtualGridToWorldRatio")) writer.uint32(/* id 22, wireType 1 =*/177).double(message.virtualGridToWorldRatio); - if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) + if (message.spAtkLookupFrames != null && Object.hasOwnProperty.call(message, "spAtkLookupFrames")) writer.uint32(/* id 23, wireType 0 =*/184).int32(message.spAtkLookupFrames); - if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + if (message.renderCacheSize != null && Object.hasOwnProperty.call(message, "renderCacheSize")) writer.uint32(/* id 24, wireType 0 =*/192).int32(message.renderCacheSize); return writer; }; @@ -1451,92 +1534,144 @@ $root.protos = (function() { BattleColliderInfo.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key; + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key, value; while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.stageName = reader.string(); - break; - case 2: - reader.skip().pos++; - if (message.strToVec2DListMap === $util.emptyObject) - message.strToVec2DListMap = {}; - key = reader.string(); - reader.pos++; - message.strToVec2DListMap[key] = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); - break; - case 3: - reader.skip().pos++; - if (message.strToPolygon2DListMap === $util.emptyObject) - message.strToPolygon2DListMap = {}; - key = reader.string(); - reader.pos++; - message.strToPolygon2DListMap[key] = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); - break; - case 4: - message.stageDiscreteW = reader.int32(); - break; - case 5: - message.stageDiscreteH = reader.int32(); - break; - case 6: - message.stageTileW = reader.int32(); - break; - case 7: - message.stageTileH = reader.int32(); - break; - case 8: - message.intervalToPing = reader.int32(); - break; - case 9: - message.willKickIfInactiveFor = reader.int32(); - break; - case 10: - message.boundRoomId = reader.int32(); - break; - case 11: - message.battleDurationNanos = reader.int64(); - break; - case 12: - message.serverFps = reader.int32(); - break; - case 13: - message.inputDelayFrames = reader.int32(); - break; - case 14: - message.inputScaleFrames = reader.uint32(); - break; - case 15: - message.nstDelayFrames = reader.int32(); - break; - case 16: - message.inputFrameUpsyncDelayTolerance = reader.int32(); - break; - case 17: - message.maxChasingRenderFramesPerUpdate = reader.int32(); - break; - case 18: - message.playerBattleState = reader.int32(); - break; - case 19: - message.rollbackEstimatedDtMillis = reader.double(); - break; - case 20: - message.rollbackEstimatedDtNanos = reader.int64(); - break; - case 21: - message.worldToVirtualGridRatio = reader.double(); - break; - case 22: - message.virtualGridToWorldRatio = reader.double(); - break; - case 23: - message.spAtkLookupFrames = reader.int32(); - break; - case 24: - message.renderCacheSize = reader.int32(); - break; + case 1: { + message.stageName = reader.string(); + break; + } + case 2: { + if (message.strToVec2DListMap === $util.emptyObject) + message.strToVec2DListMap = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.strToVec2DListMap[key] = value; + break; + } + case 3: { + if (message.strToPolygon2DListMap === $util.emptyObject) + message.strToPolygon2DListMap = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.strToPolygon2DListMap[key] = value; + break; + } + case 4: { + message.stageDiscreteW = reader.int32(); + break; + } + case 5: { + message.stageDiscreteH = reader.int32(); + break; + } + case 6: { + message.stageTileW = reader.int32(); + break; + } + case 7: { + message.stageTileH = reader.int32(); + break; + } + case 8: { + message.intervalToPing = reader.int32(); + break; + } + case 9: { + message.willKickIfInactiveFor = reader.int32(); + break; + } + case 10: { + message.boundRoomId = reader.int32(); + break; + } + case 11: { + message.battleDurationNanos = reader.int64(); + break; + } + case 12: { + message.serverFps = reader.int32(); + break; + } + case 13: { + message.inputDelayFrames = reader.int32(); + break; + } + case 14: { + message.inputScaleFrames = reader.uint32(); + break; + } + case 15: { + message.nstDelayFrames = reader.int32(); + break; + } + case 16: { + message.inputFrameUpsyncDelayTolerance = reader.int32(); + break; + } + case 17: { + message.maxChasingRenderFramesPerUpdate = reader.int32(); + break; + } + case 18: { + message.playerBattleState = reader.int32(); + break; + } + case 19: { + message.rollbackEstimatedDtMillis = reader.double(); + break; + } + case 20: { + message.rollbackEstimatedDtNanos = reader.int64(); + break; + } + case 21: { + message.worldToVirtualGridRatio = reader.double(); + break; + } + case 22: { + message.virtualGridToWorldRatio = reader.double(); + break; + } + case 23: { + message.spAtkLookupFrames = reader.int32(); + break; + } + case 24: { + message.renderCacheSize = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -1878,6 +2013,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for BattleColliderInfo + * @function getTypeUrl + * @memberof protos.BattleColliderInfo + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + BattleColliderInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.BattleColliderInfo"; + }; + return BattleColliderInfo; })(); @@ -1890,7 +2040,8 @@ $root.protos = (function() { * @property {number|null} [id] PlayerDownsync id * @property {number|null} [virtualGridX] PlayerDownsync virtualGridX * @property {number|null} [virtualGridY] PlayerDownsync virtualGridY - * @property {sharedprotos.Direction|null} [dir] PlayerDownsync dir + * @property {number|null} [dirX] PlayerDownsync dirX + * @property {number|null} [dirY] PlayerDownsync dirY * @property {number|null} [speed] PlayerDownsync speed * @property {number|null} [battleState] PlayerDownsync battleState * @property {number|null} [joinIndex] PlayerDownsync joinIndex @@ -1947,12 +2098,20 @@ $root.protos = (function() { PlayerDownsync.prototype.virtualGridY = 0; /** - * PlayerDownsync dir. - * @member {sharedprotos.Direction|null|undefined} dir + * PlayerDownsync dirX. + * @member {number} dirX * @memberof protos.PlayerDownsync * @instance */ - PlayerDownsync.prototype.dir = null; + PlayerDownsync.prototype.dirX = 0; + + /** + * PlayerDownsync dirY. + * @member {number} dirY + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.dirY = 0; /** * PlayerDownsync speed. @@ -2090,42 +2249,44 @@ $root.protos = (function() { PlayerDownsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.id != null && message.hasOwnProperty("id")) + if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.id); - if (message.virtualGridX != null && message.hasOwnProperty("virtualGridX")) + if (message.virtualGridX != null && Object.hasOwnProperty.call(message, "virtualGridX")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.virtualGridX); - if (message.virtualGridY != null && message.hasOwnProperty("virtualGridY")) + if (message.virtualGridY != null && Object.hasOwnProperty.call(message, "virtualGridY")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.virtualGridY); - if (message.dir != null && message.hasOwnProperty("dir")) - $root.sharedprotos.Direction.encode(message.dir, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); - if (message.speed != null && message.hasOwnProperty("speed")) - writer.uint32(/* id 5, wireType 0 =*/40).int32(message.speed); - if (message.battleState != null && message.hasOwnProperty("battleState")) - writer.uint32(/* id 6, wireType 0 =*/48).int32(message.battleState); - if (message.joinIndex != null && message.hasOwnProperty("joinIndex")) - writer.uint32(/* id 7, wireType 0 =*/56).int32(message.joinIndex); - if (message.colliderRadius != null && message.hasOwnProperty("colliderRadius")) - writer.uint32(/* id 8, wireType 1 =*/65).double(message.colliderRadius); - if (message.removed != null && message.hasOwnProperty("removed")) - writer.uint32(/* id 9, wireType 0 =*/72).bool(message.removed); - if (message.score != null && message.hasOwnProperty("score")) - writer.uint32(/* id 10, wireType 0 =*/80).int32(message.score); - if (message.lastMoveGmtMillis != null && message.hasOwnProperty("lastMoveGmtMillis")) - writer.uint32(/* id 11, wireType 0 =*/88).int32(message.lastMoveGmtMillis); - if (message.framesToRecover != null && message.hasOwnProperty("framesToRecover")) - writer.uint32(/* id 12, wireType 0 =*/96).int32(message.framesToRecover); - if (message.hp != null && message.hasOwnProperty("hp")) - writer.uint32(/* id 13, wireType 0 =*/104).int32(message.hp); - if (message.maxHp != null && message.hasOwnProperty("maxHp")) - writer.uint32(/* id 14, wireType 0 =*/112).int32(message.maxHp); - if (message.characterState != null && message.hasOwnProperty("characterState")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.characterState); - if (message.name != null && message.hasOwnProperty("name")) - writer.uint32(/* id 16, wireType 2 =*/130).string(message.name); - if (message.displayName != null && message.hasOwnProperty("displayName")) - writer.uint32(/* id 17, wireType 2 =*/138).string(message.displayName); - if (message.avatar != null && message.hasOwnProperty("avatar")) - writer.uint32(/* id 18, wireType 2 =*/146).string(message.avatar); + if (message.dirX != null && Object.hasOwnProperty.call(message, "dirX")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.dirX); + if (message.dirY != null && Object.hasOwnProperty.call(message, "dirY")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.dirY); + if (message.speed != null && Object.hasOwnProperty.call(message, "speed")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.speed); + if (message.battleState != null && Object.hasOwnProperty.call(message, "battleState")) + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.battleState); + if (message.joinIndex != null && Object.hasOwnProperty.call(message, "joinIndex")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.joinIndex); + if (message.colliderRadius != null && Object.hasOwnProperty.call(message, "colliderRadius")) + writer.uint32(/* id 9, wireType 1 =*/73).double(message.colliderRadius); + if (message.removed != null && Object.hasOwnProperty.call(message, "removed")) + writer.uint32(/* id 10, wireType 0 =*/80).bool(message.removed); + if (message.score != null && Object.hasOwnProperty.call(message, "score")) + writer.uint32(/* id 11, wireType 0 =*/88).int32(message.score); + if (message.lastMoveGmtMillis != null && Object.hasOwnProperty.call(message, "lastMoveGmtMillis")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.lastMoveGmtMillis); + if (message.framesToRecover != null && Object.hasOwnProperty.call(message, "framesToRecover")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.framesToRecover); + if (message.hp != null && Object.hasOwnProperty.call(message, "hp")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.hp); + if (message.maxHp != null && Object.hasOwnProperty.call(message, "maxHp")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.maxHp); + if (message.characterState != null && Object.hasOwnProperty.call(message, "characterState")) + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.characterState); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 17, wireType 2 =*/138).string(message.name); + if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) + writer.uint32(/* id 18, wireType 2 =*/146).string(message.displayName); + if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) + writer.uint32(/* id 19, wireType 2 =*/154).string(message.avatar); return writer; }; @@ -2160,60 +2321,82 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.id = reader.int32(); - break; - case 2: - message.virtualGridX = reader.int32(); - break; - case 3: - message.virtualGridY = reader.int32(); - break; - case 4: - message.dir = $root.sharedprotos.Direction.decode(reader, reader.uint32()); - break; - case 5: - message.speed = reader.int32(); - break; - case 6: - message.battleState = reader.int32(); - break; - case 7: - message.joinIndex = reader.int32(); - break; - case 8: - message.colliderRadius = reader.double(); - break; - case 9: - message.removed = reader.bool(); - break; - case 10: - message.score = reader.int32(); - break; - case 11: - message.lastMoveGmtMillis = reader.int32(); - break; - case 12: - message.framesToRecover = reader.int32(); - break; - case 13: - message.hp = reader.int32(); - break; - case 14: - message.maxHp = reader.int32(); - break; - case 15: - message.characterState = reader.int32(); - break; - case 16: - message.name = reader.string(); - break; - case 17: - message.displayName = reader.string(); - break; - case 18: - message.avatar = reader.string(); - break; + case 1: { + message.id = reader.int32(); + break; + } + case 2: { + message.virtualGridX = reader.int32(); + break; + } + case 3: { + message.virtualGridY = reader.int32(); + break; + } + case 4: { + message.dirX = reader.int32(); + break; + } + case 5: { + message.dirY = reader.int32(); + break; + } + case 6: { + message.speed = reader.int32(); + break; + } + case 7: { + message.battleState = reader.int32(); + break; + } + case 8: { + message.joinIndex = reader.int32(); + break; + } + case 9: { + message.colliderRadius = reader.double(); + break; + } + case 10: { + message.removed = reader.bool(); + break; + } + case 11: { + message.score = reader.int32(); + break; + } + case 12: { + message.lastMoveGmtMillis = reader.int32(); + break; + } + case 13: { + message.framesToRecover = reader.int32(); + break; + } + case 14: { + message.hp = reader.int32(); + break; + } + case 15: { + message.maxHp = reader.int32(); + break; + } + case 16: { + message.characterState = reader.int32(); + break; + } + case 17: { + message.name = reader.string(); + break; + } + case 18: { + message.displayName = reader.string(); + break; + } + case 19: { + message.avatar = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -2258,11 +2441,12 @@ $root.protos = (function() { if (message.virtualGridY != null && message.hasOwnProperty("virtualGridY")) if (!$util.isInteger(message.virtualGridY)) return "virtualGridY: integer expected"; - if (message.dir != null && message.hasOwnProperty("dir")) { - var error = $root.sharedprotos.Direction.verify(message.dir); - if (error) - return "dir." + error; - } + if (message.dirX != null && message.hasOwnProperty("dirX")) + if (!$util.isInteger(message.dirX)) + return "dirX: integer expected"; + if (message.dirY != null && message.hasOwnProperty("dirY")) + if (!$util.isInteger(message.dirY)) + return "dirY: integer expected"; if (message.speed != null && message.hasOwnProperty("speed")) if (!$util.isInteger(message.speed)) return "speed: integer expected"; @@ -2326,11 +2510,10 @@ $root.protos = (function() { message.virtualGridX = object.virtualGridX | 0; if (object.virtualGridY != null) message.virtualGridY = object.virtualGridY | 0; - if (object.dir != null) { - if (typeof object.dir !== "object") - throw TypeError(".protos.PlayerDownsync.dir: object expected"); - message.dir = $root.sharedprotos.Direction.fromObject(object.dir); - } + if (object.dirX != null) + message.dirX = object.dirX | 0; + if (object.dirY != null) + message.dirY = object.dirY | 0; if (object.speed != null) message.speed = object.speed | 0; if (object.battleState != null) @@ -2379,7 +2562,8 @@ $root.protos = (function() { object.id = 0; object.virtualGridX = 0; object.virtualGridY = 0; - object.dir = null; + object.dirX = 0; + object.dirY = 0; object.speed = 0; object.battleState = 0; object.joinIndex = 0; @@ -2401,8 +2585,10 @@ $root.protos = (function() { object.virtualGridX = message.virtualGridX; if (message.virtualGridY != null && message.hasOwnProperty("virtualGridY")) object.virtualGridY = message.virtualGridY; - if (message.dir != null && message.hasOwnProperty("dir")) - object.dir = $root.sharedprotos.Direction.toObject(message.dir, options); + if (message.dirX != null && message.hasOwnProperty("dirX")) + object.dirX = message.dirX; + if (message.dirY != null && message.hasOwnProperty("dirY")) + object.dirY = message.dirY; if (message.speed != null && message.hasOwnProperty("speed")) object.speed = message.speed; if (message.battleState != null && message.hasOwnProperty("battleState")) @@ -2445,6 +2631,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for PlayerDownsync + * @function getTypeUrl + * @memberof protos.PlayerDownsync + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PlayerDownsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.PlayerDownsync"; + }; + return PlayerDownsync; })(); @@ -2522,11 +2723,11 @@ $root.protos = (function() { InputFrameDecoded.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dx != null && message.hasOwnProperty("dx")) + if (message.dx != null && Object.hasOwnProperty.call(message, "dx")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.dx); - if (message.dy != null && message.hasOwnProperty("dy")) + if (message.dy != null && Object.hasOwnProperty.call(message, "dy")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dy); - if (message.btnALevel != null && message.hasOwnProperty("btnALevel")) + if (message.btnALevel != null && Object.hasOwnProperty.call(message, "btnALevel")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.btnALevel); return writer; }; @@ -2562,15 +2763,18 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.dx = reader.int32(); - break; - case 2: - message.dy = reader.int32(); - break; - case 3: - message.btnALevel = reader.int32(); - break; + case 1: { + message.dx = reader.int32(); + break; + } + case 2: { + message.dy = reader.int32(); + break; + } + case 3: { + message.btnALevel = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -2677,6 +2881,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for InputFrameDecoded + * @function getTypeUrl + * @memberof protos.InputFrameDecoded + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + InputFrameDecoded.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.InputFrameDecoded"; + }; + return InputFrameDecoded; })(); @@ -2745,9 +2964,9 @@ $root.protos = (function() { InputFrameUpsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.inputFrameId != null && message.hasOwnProperty("inputFrameId")) + if (message.inputFrameId != null && Object.hasOwnProperty.call(message, "inputFrameId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.inputFrameId); - if (message.encoded != null && message.hasOwnProperty("encoded")) + if (message.encoded != null && Object.hasOwnProperty.call(message, "encoded")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.encoded); return writer; }; @@ -2783,12 +3002,14 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.inputFrameId = reader.int32(); - break; - case 2: - message.encoded = reader.uint64(); - break; + case 1: { + message.inputFrameId = reader.int32(); + break; + } + case 2: { + message.encoded = reader.uint64(); + break; + } default: reader.skipType(tag & 7); break; @@ -2901,6 +3122,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for InputFrameUpsync + * @function getTypeUrl + * @memberof protos.InputFrameUpsync + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + InputFrameUpsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.InputFrameUpsync"; + }; + return InputFrameUpsync; })(); @@ -2979,7 +3215,7 @@ $root.protos = (function() { InputFrameDownsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.inputFrameId != null && message.hasOwnProperty("inputFrameId")) + if (message.inputFrameId != null && Object.hasOwnProperty.call(message, "inputFrameId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.inputFrameId); if (message.inputList != null && message.inputList.length) { writer.uint32(/* id 2, wireType 2 =*/18).fork(); @@ -2987,7 +3223,7 @@ $root.protos = (function() { writer.uint64(message.inputList[i]); writer.ldelim(); } - if (message.confirmedList != null && message.hasOwnProperty("confirmedList")) + if (message.confirmedList != null && Object.hasOwnProperty.call(message, "confirmedList")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.confirmedList); return writer; }; @@ -3023,22 +3259,25 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.inputFrameId = reader.int32(); - break; - case 2: - if (!(message.inputList && message.inputList.length)) - message.inputList = []; - if ((tag & 7) === 2) { - var end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) + case 1: { + message.inputFrameId = reader.int32(); + break; + } + case 2: { + if (!(message.inputList && message.inputList.length)) + message.inputList = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.inputList.push(reader.uint64()); + } else message.inputList.push(reader.uint64()); - } else - message.inputList.push(reader.uint64()); - break; - case 3: - message.confirmedList = reader.uint64(); - break; + break; + } + case 3: { + message.confirmedList = reader.uint64(); + break; + } default: reader.skipType(tag & 7); break; @@ -3182,6 +3421,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for InputFrameDownsync + * @function getTypeUrl + * @memberof protos.InputFrameDownsync + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + InputFrameDownsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.InputFrameDownsync"; + }; + return InputFrameDownsync; })(); @@ -3241,7 +3495,7 @@ $root.protos = (function() { HeartbeatUpsync.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.clientTimestamp != null && message.hasOwnProperty("clientTimestamp")) + if (message.clientTimestamp != null && Object.hasOwnProperty.call(message, "clientTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).int64(message.clientTimestamp); return writer; }; @@ -3277,9 +3531,10 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.clientTimestamp = reader.int64(); - break; + case 1: { + message.clientTimestamp = reader.int64(); + break; + } default: reader.skipType(tag & 7); break; @@ -3383,6 +3638,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for HeartbeatUpsync + * @function getTypeUrl + * @memberof protos.HeartbeatUpsync + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + HeartbeatUpsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.HeartbeatUpsync"; + }; + return HeartbeatUpsync; })(); @@ -3506,22 +3776,22 @@ $root.protos = (function() { WsReq.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.msgId != null && message.hasOwnProperty("msgId")) + if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.msgId); - if (message.playerId != null && message.hasOwnProperty("playerId")) + if (message.playerId != null && Object.hasOwnProperty.call(message, "playerId")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.playerId); - if (message.act != null && message.hasOwnProperty("act")) + if (message.act != null && Object.hasOwnProperty.call(message, "act")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.act); - if (message.joinIndex != null && message.hasOwnProperty("joinIndex")) + if (message.joinIndex != null && Object.hasOwnProperty.call(message, "joinIndex")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.joinIndex); - if (message.ackingFrameId != null && message.hasOwnProperty("ackingFrameId")) + if (message.ackingFrameId != null && Object.hasOwnProperty.call(message, "ackingFrameId")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.ackingFrameId); - if (message.ackingInputFrameId != null && message.hasOwnProperty("ackingInputFrameId")) + if (message.ackingInputFrameId != null && Object.hasOwnProperty.call(message, "ackingInputFrameId")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.ackingInputFrameId); if (message.inputFrameUpsyncBatch != null && message.inputFrameUpsyncBatch.length) for (var i = 0; i < message.inputFrameUpsyncBatch.length; ++i) $root.protos.InputFrameUpsync.encode(message.inputFrameUpsyncBatch[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); - if (message.hb != null && message.hasOwnProperty("hb")) + if (message.hb != null && Object.hasOwnProperty.call(message, "hb")) $root.protos.HeartbeatUpsync.encode(message.hb, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); return writer; }; @@ -3557,32 +3827,40 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.msgId = reader.int32(); - break; - case 2: - message.playerId = reader.int32(); - break; - case 3: - message.act = reader.int32(); - break; - case 4: - message.joinIndex = reader.int32(); - break; - case 5: - message.ackingFrameId = reader.int32(); - break; - case 6: - message.ackingInputFrameId = reader.int32(); - break; - case 7: - if (!(message.inputFrameUpsyncBatch && message.inputFrameUpsyncBatch.length)) - message.inputFrameUpsyncBatch = []; - message.inputFrameUpsyncBatch.push($root.protos.InputFrameUpsync.decode(reader, reader.uint32())); - break; - case 8: - message.hb = $root.protos.HeartbeatUpsync.decode(reader, reader.uint32()); - break; + case 1: { + message.msgId = reader.int32(); + break; + } + case 2: { + message.playerId = reader.int32(); + break; + } + case 3: { + message.act = reader.int32(); + break; + } + case 4: { + message.joinIndex = reader.int32(); + break; + } + case 5: { + message.ackingFrameId = reader.int32(); + break; + } + case 6: { + message.ackingInputFrameId = reader.int32(); + break; + } + case 7: { + if (!(message.inputFrameUpsyncBatch && message.inputFrameUpsyncBatch.length)) + message.inputFrameUpsyncBatch = []; + message.inputFrameUpsyncBatch.push($root.protos.InputFrameUpsync.decode(reader, reader.uint32())); + break; + } + case 8: { + message.hb = $root.protos.HeartbeatUpsync.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -3752,6 +4030,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for WsReq + * @function getTypeUrl + * @memberof protos.WsReq + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + WsReq.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.WsReq"; + }; + return WsReq; })(); @@ -3857,18 +4150,18 @@ $root.protos = (function() { WsResp.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.ret != null && message.hasOwnProperty("ret")) + if (message.ret != null && Object.hasOwnProperty.call(message, "ret")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.ret); - if (message.echoedMsgId != null && message.hasOwnProperty("echoedMsgId")) + if (message.echoedMsgId != null && Object.hasOwnProperty.call(message, "echoedMsgId")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.echoedMsgId); - if (message.act != null && message.hasOwnProperty("act")) + if (message.act != null && Object.hasOwnProperty.call(message, "act")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.act); - if (message.rdf != null && message.hasOwnProperty("rdf")) + if (message.rdf != null && Object.hasOwnProperty.call(message, "rdf")) $root.protos.RoomDownsyncFrame.encode(message.rdf, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.inputFrameDownsyncBatch != null && message.inputFrameDownsyncBatch.length) for (var i = 0; i < message.inputFrameDownsyncBatch.length; ++i) $root.protos.InputFrameDownsync.encode(message.inputFrameDownsyncBatch[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); - if (message.bciFrame != null && message.hasOwnProperty("bciFrame")) + if (message.bciFrame != null && Object.hasOwnProperty.call(message, "bciFrame")) $root.protos.BattleColliderInfo.encode(message.bciFrame, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); return writer; }; @@ -3904,26 +4197,32 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.ret = reader.int32(); - break; - case 2: - message.echoedMsgId = reader.int32(); - break; - case 3: - message.act = reader.int32(); - break; - case 4: - message.rdf = $root.protos.RoomDownsyncFrame.decode(reader, reader.uint32()); - break; - case 5: - if (!(message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length)) - message.inputFrameDownsyncBatch = []; - message.inputFrameDownsyncBatch.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32())); - break; - case 6: - message.bciFrame = $root.protos.BattleColliderInfo.decode(reader, reader.uint32()); - break; + case 1: { + message.ret = reader.int32(); + break; + } + case 2: { + message.echoedMsgId = reader.int32(); + break; + } + case 3: { + message.act = reader.int32(); + break; + } + case 4: { + message.rdf = $root.protos.RoomDownsyncFrame.decode(reader, reader.uint32()); + break; + } + case 5: { + if (!(message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length)) + message.inputFrameDownsyncBatch = []; + message.inputFrameDownsyncBatch.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32())); + break; + } + case 6: { + message.bciFrame = $root.protos.BattleColliderInfo.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -4082,6 +4381,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for WsResp + * @function getTypeUrl + * @memberof protos.WsResp + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + WsResp.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.WsResp"; + }; + return WsResp; })(); @@ -4285,39 +4599,39 @@ $root.protos = (function() { MeleeBullet.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.battleLocalId != null && message.hasOwnProperty("battleLocalId")) + if (message.battleLocalId != null && Object.hasOwnProperty.call(message, "battleLocalId")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.battleLocalId); - if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) + if (message.startupFrames != null && Object.hasOwnProperty.call(message, "startupFrames")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.startupFrames); - if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) + if (message.activeFrames != null && Object.hasOwnProperty.call(message, "activeFrames")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.activeFrames); - if (message.recoveryFrames != null && message.hasOwnProperty("recoveryFrames")) + if (message.recoveryFrames != null && Object.hasOwnProperty.call(message, "recoveryFrames")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.recoveryFrames); - if (message.recoveryFramesOnBlock != null && message.hasOwnProperty("recoveryFramesOnBlock")) + if (message.recoveryFramesOnBlock != null && Object.hasOwnProperty.call(message, "recoveryFramesOnBlock")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.recoveryFramesOnBlock); - if (message.recoveryFramesOnHit != null && message.hasOwnProperty("recoveryFramesOnHit")) + if (message.recoveryFramesOnHit != null && Object.hasOwnProperty.call(message, "recoveryFramesOnHit")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.recoveryFramesOnHit); - if (message.moveforward != null && message.hasOwnProperty("moveforward")) + if (message.moveforward != null && Object.hasOwnProperty.call(message, "moveforward")) $root.sharedprotos.Vec2D.encode(message.moveforward, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); - if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) + if (message.hitboxOffset != null && Object.hasOwnProperty.call(message, "hitboxOffset")) writer.uint32(/* id 8, wireType 1 =*/65).double(message.hitboxOffset); - if (message.hitboxSize != null && message.hasOwnProperty("hitboxSize")) + if (message.hitboxSize != null && Object.hasOwnProperty.call(message, "hitboxSize")) $root.sharedprotos.Vec2D.encode(message.hitboxSize, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); - if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) + if (message.originatedRenderFrameId != null && Object.hasOwnProperty.call(message, "originatedRenderFrameId")) writer.uint32(/* id 10, wireType 0 =*/80).int32(message.originatedRenderFrameId); - if (message.hitStunFrames != null && message.hasOwnProperty("hitStunFrames")) + if (message.hitStunFrames != null && Object.hasOwnProperty.call(message, "hitStunFrames")) writer.uint32(/* id 11, wireType 0 =*/88).int32(message.hitStunFrames); - if (message.blockStunFrames != null && message.hasOwnProperty("blockStunFrames")) + if (message.blockStunFrames != null && Object.hasOwnProperty.call(message, "blockStunFrames")) writer.uint32(/* id 12, wireType 0 =*/96).int32(message.blockStunFrames); - if (message.pushback != null && message.hasOwnProperty("pushback")) + if (message.pushback != null && Object.hasOwnProperty.call(message, "pushback")) writer.uint32(/* id 13, wireType 1 =*/105).double(message.pushback); - if (message.releaseTriggerType != null && message.hasOwnProperty("releaseTriggerType")) + if (message.releaseTriggerType != null && Object.hasOwnProperty.call(message, "releaseTriggerType")) writer.uint32(/* id 14, wireType 0 =*/112).int32(message.releaseTriggerType); - if (message.damage != null && message.hasOwnProperty("damage")) + if (message.damage != null && Object.hasOwnProperty.call(message, "damage")) writer.uint32(/* id 15, wireType 0 =*/120).int32(message.damage); - if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + if (message.offenderJoinIndex != null && Object.hasOwnProperty.call(message, "offenderJoinIndex")) writer.uint32(/* id 16, wireType 0 =*/128).int32(message.offenderJoinIndex); - if (message.offenderPlayerId != null && message.hasOwnProperty("offenderPlayerId")) + if (message.offenderPlayerId != null && Object.hasOwnProperty.call(message, "offenderPlayerId")) writer.uint32(/* id 17, wireType 0 =*/136).int32(message.offenderPlayerId); return writer; }; @@ -4353,57 +4667,74 @@ $root.protos = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.battleLocalId = reader.int32(); - break; - case 2: - message.startupFrames = reader.int32(); - break; - case 3: - message.activeFrames = reader.int32(); - break; - case 4: - message.recoveryFrames = reader.int32(); - break; - case 5: - message.recoveryFramesOnBlock = reader.int32(); - break; - case 6: - message.recoveryFramesOnHit = reader.int32(); - break; - case 7: - message.moveforward = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); - break; - case 8: - message.hitboxOffset = reader.double(); - break; - case 9: - message.hitboxSize = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); - break; - case 10: - message.originatedRenderFrameId = reader.int32(); - break; - case 11: - message.hitStunFrames = reader.int32(); - break; - case 12: - message.blockStunFrames = reader.int32(); - break; - case 13: - message.pushback = reader.double(); - break; - case 14: - message.releaseTriggerType = reader.int32(); - break; - case 15: - message.damage = reader.int32(); - break; - case 16: - message.offenderJoinIndex = reader.int32(); - break; - case 17: - message.offenderPlayerId = reader.int32(); - break; + case 1: { + message.battleLocalId = reader.int32(); + break; + } + case 2: { + message.startupFrames = reader.int32(); + break; + } + case 3: { + message.activeFrames = reader.int32(); + break; + } + case 4: { + message.recoveryFrames = reader.int32(); + break; + } + case 5: { + message.recoveryFramesOnBlock = reader.int32(); + break; + } + case 6: { + message.recoveryFramesOnHit = reader.int32(); + break; + } + case 7: { + message.moveforward = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + } + case 8: { + message.hitboxOffset = reader.double(); + break; + } + case 9: { + message.hitboxSize = $root.sharedprotos.Vec2D.decode(reader, reader.uint32()); + break; + } + case 10: { + message.originatedRenderFrameId = reader.int32(); + break; + } + case 11: { + message.hitStunFrames = reader.int32(); + break; + } + case 12: { + message.blockStunFrames = reader.int32(); + break; + } + case 13: { + message.pushback = reader.double(); + break; + } + case 14: { + message.releaseTriggerType = reader.int32(); + break; + } + case 15: { + message.damage = reader.int32(); + break; + } + case 16: { + message.offenderJoinIndex = reader.int32(); + break; + } + case 17: { + message.offenderPlayerId = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -4632,6 +4963,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for MeleeBullet + * @function getTypeUrl + * @memberof protos.MeleeBullet + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + MeleeBullet.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.MeleeBullet"; + }; + return MeleeBullet; })(); @@ -4720,14 +5066,14 @@ $root.protos = (function() { RoomDownsyncFrame.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.id != null && message.hasOwnProperty("id")) + if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.id); - if (message.players != null && message.hasOwnProperty("players")) + if (message.players != null && Object.hasOwnProperty.call(message, "players")) for (var keys = Object.keys(message.players), i = 0; i < keys.length; ++i) { writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]); $root.protos.PlayerDownsync.encode(message.players[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } - if (message.countdownNanos != null && message.hasOwnProperty("countdownNanos")) + if (message.countdownNanos != null && Object.hasOwnProperty.call(message, "countdownNanos")) writer.uint32(/* id 3, wireType 0 =*/24).int64(message.countdownNanos); if (message.meleeBullets != null && message.meleeBullets.length) for (var i = 0; i < message.meleeBullets.length; ++i) @@ -4762,29 +5108,47 @@ $root.protos = (function() { RoomDownsyncFrame.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(), key; + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(), key, value; while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.id = reader.int32(); - break; - case 2: - reader.skip().pos++; - if (message.players === $util.emptyObject) - message.players = {}; - key = reader.int32(); - reader.pos++; - message.players[key] = $root.protos.PlayerDownsync.decode(reader, reader.uint32()); - break; - case 3: - message.countdownNanos = reader.int64(); - break; - case 4: - if (!(message.meleeBullets && message.meleeBullets.length)) - message.meleeBullets = []; - message.meleeBullets.push($root.protos.MeleeBullet.decode(reader, reader.uint32())); - break; + case 1: { + message.id = reader.int32(); + break; + } + case 2: { + if (message.players === $util.emptyObject) + message.players = {}; + var end2 = reader.uint32() + reader.pos; + key = 0; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.int32(); + break; + case 2: + value = $root.protos.PlayerDownsync.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.players[key] = value; + break; + } + case 3: { + message.countdownNanos = reader.int64(); + break; + } + case 4: { + if (!(message.meleeBullets && message.meleeBullets.length)) + message.meleeBullets = []; + message.meleeBullets.push($root.protos.MeleeBullet.decode(reader, reader.uint32())); + break; + } default: reader.skipType(tag & 7); break; @@ -4955,6 +5319,21 @@ $root.protos = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for RoomDownsyncFrame + * @function getTypeUrl + * @memberof protos.RoomDownsyncFrame + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + RoomDownsyncFrame.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.RoomDownsyncFrame"; + }; + return RoomDownsyncFrame; })(); From 24d5ad9dc884ff167d34100d5aa328fbe2fcda5d Mon Sep 17 00:00:00 2001 From: genxium Date: Thu, 24 Nov 2022 17:48:07 +0800 Subject: [PATCH 6/6] Drafted backend handling of melee attack. --- battle_srv/models/room.go | 159 +- battle_srv/protos/room_downsync_frame.pb.go | 2197 +++++++++-------- dnmshared/resolv_helper.go | 4 + .../pbfiles/room_downsync_frame.proto | 62 +- frontend/assets/scenes/default_map.fire | 4 +- frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map_1.fire | 2 +- frontend/assets/scripts/Map.js | 15 +- ...om_downsync_frame_proto_bundle.forcemsg.js | 1760 ++++++------- 9 files changed, 2197 insertions(+), 2008 deletions(-) diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 0c535d7..8ab649f 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -62,6 +62,13 @@ const ( MAGIC_LAST_SENT_INPUT_FRAME_ID_READDED = -2 ) +const ( + ATK_CHARACTER_STATE_IDLE1 = 0 + ATK_CHARACTER_STATE_WALKING = 1 + ATK_CHARACTER_STATE_ATK1 = 2 + ATK_CHARACTER_STATE_ATKED1 = 3 +) + // These directions are chosen such that when speed is changed to "(speedX+delta, speedY+delta)" for any of them, the direction is unchanged. var DIRECTION_DECODER = [][]int32{ {0, 0}, @@ -166,7 +173,8 @@ type Room struct { LastRenderFrameIdTriggeredAt int64 PlayerDefaultSpeed int32 - BattleColliderInfo // Compositing to send centralized magic numbers + BulletBattleLocalIdCounter int32 + BattleColliderInfo // Compositing to send centralized magic numbers } func (pR *Room) updateScore() { @@ -353,6 +361,7 @@ func (pR *Room) InputsBufferString(allDetails bool) string { break } f := tmp.(*InputFrameDownsync) + //s = append(s, fmt.Sprintf("{inputFrameId: %v, inputList: %v, &inputList: %p, confirmedList: %v}", f.InputFrameId, f.InputList, &(f.InputList), f.ConfirmedList)) s = append(s, fmt.Sprintf("{inputFrameId: %v, inputList: %v, confirmedList: %v}", f.InputFrameId, f.InputList, f.ConfirmedList)) } @@ -618,7 +627,6 @@ func (pR *Room) OnBattleCmdReceived(pReq *WsReq) { Logger.Debug(fmt.Sprintf("Omitting obsolete inputFrameUpsync: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false))) continue } - bufIndex := pR.toDiscreteInputsBufferIndex(clientInputFrameId, pReq.JoinIndex) pR.DiscreteInputsBuffer.Store(bufIndex, inputFrameUpsync) @@ -763,6 +771,7 @@ func (pR *Room) Dismiss() { func (pR *Room) OnDismissed() { // Always instantiates new HeapRAM blocks and let the old blocks die out due to not being retained by any root reference. + pR.BulletBattleLocalIdCounter = 0 pR.WorldToVirtualGridRatio = float64(1000) pR.VirtualGridToWorldRatio = float64(1.0) / pR.WorldToVirtualGridRatio // this is a one-off computation, should avoid division in iterations pR.SpAtkLookupFrames = 5 @@ -774,7 +783,7 @@ func (pR *Room) OnDismissed() { pR.PlayerSignalToCloseDict = make(map[int32]SignalToCloseConnCbType) pR.JoinIndexBooleanArr = make([]bool, pR.Capacity) pR.Barriers = make(map[int32]*Barrier) - pR.RenderCacheSize = 256 + pR.RenderCacheSize = 512 pR.RenderFrameBuffer = NewRingBuffer(pR.RenderCacheSize) pR.DiscreteInputsBuffer = sync.Map{} pR.InputsBuffer = NewRingBuffer((pR.RenderCacheSize >> 2) + 1) @@ -797,6 +806,34 @@ func (pR *Room) OnDismissed() { pR.MaxChasingRenderFramesPerUpdate = 8 pR.BackendDynamicsEnabled = true // [WARNING] When "false", recovery upon reconnection wouldn't work! + punchSkillId := int32(1) + if _, existent := pR.MeleeSkillConfig[punchSkillId]; !existent { + pR.MeleeSkillConfig = make(map[int32]*MeleeBullet, 0) + pR.MeleeSkillConfig[punchSkillId] = &MeleeBullet{ + // for offender + StartupFrames: int32(18), + ActiveFrames: int32(42), + RecoveryFrames: int32(61), // usually but not always "startupFrames+activeFrames", I hereby set it to be 1 frame more than the actual animation to avoid critical transition, i.e. when the animation is 1 frame from ending but "rdfPlayer.framesToRecover" is already counted 0 and the player triggers an other same attack, making an effective bullet trigger but no animation is played due to same animName is still playing + RecoveryFramesOnBlock: int32(61), + RecoveryFramesOnHit: int32(61), + Moveforward: &Vec2D{ + X: 0, + Y: 0, + }, + HitboxOffset: float64(12.0), // should be about the radius of the PlayerCollider + HitboxSize: &Vec2D{ + X: float64(45.0), + Y: float64(32.0), + }, + + // for defender + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Pushback: float64(22.0), + ReleaseTriggerType: int32(1), // 1: rising-edge, 2: falling-edge + Damage: int32(5), + } + } pR.ChooseStage() pR.EffectivePlayerCount = 0 @@ -1039,7 +1076,10 @@ func (pR *Room) prefabInputFrameDownsync(inputFrameId int32) *InputFrameDownsync panic(fmt.Sprintf("Error prefabbing inputFrameDownsync: roomId=%v, InputsBuffer=%v", pR.Id, pR.InputsBufferString(false))) } prevInputFrameDownsync := tmp.(*InputFrameDownsync) - currInputList := prevInputFrameDownsync.InputList // Would be a clone of the values + currInputList := make([]uint64, pR.Capacity) // Would be a clone of the values + for i, _ := range currInputList { + currInputList[i] = (prevInputFrameDownsync.InputList[i] & uint64(15)) // Don't predict attack input + } currInputFrameDownsync = &InputFrameDownsync{ InputFrameId: inputFrameId, InputList: currInputList, @@ -1216,38 +1256,52 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF if 0 > offender.DirX { xfac = float64(-1.0) } - offenderWx, offenderWy := PolygonColliderAnchorToWorldPos(offenderCollider.X, offenderCollider.Y, offender.ColliderRadius, offender.ColliderRadius, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY) - bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy+yfac*meleeBullet.HitboxOffset + bulletCx, bulletCy := offenderCollider.X+xfac*meleeBullet.HitboxOffset, offenderCollider.Y+yfac*meleeBullet.HitboxOffset - newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, xfac*meleeBullet.HitboxSize.X, meleeBullet.HitboxSize.Y, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, "MeleeBullet") - // newBulletCollider.collisionBulletIndex = collisionBulletIndex - // newBulletCollider.offenderPlayerId = meleeBullet.offenderPlayerId - // newBulletCollider.pushback = meleeBullet.pushback - // newBulletCollider.hitStunFrames = meleeBullet.hitStunFrames + newBulletCollider := GenerateRectCollider(bulletCx, bulletCy, xfac*meleeBullet.HitboxSize.X, meleeBullet.HitboxSize.Y, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, "MeleeBullet") + newBulletCollider.Data = meleeBullet collisionSysMap[collisionBulletIndex] = newBulletCollider bulletColliders[collisionBulletIndex] = newBulletCollider newBulletCollider.Update() } } - // for _, bulletCollider := range bulletColliders { - // shouldRemove := false - // if collision := bulletCollider.Check(0, 0); collision != nil { - // bulletShape := bulletCollider.Shape.(*resolv.ConvexPolygon) - // for _, obj := range collision.Objects { - // bShape := obj.Shape.(*resolv.ConvexPolygon) - // if overlapped, pushbackX, pushbackY, overlapResult := CalcPushbacks(0, 0, bulletShape, bShape); overlapped { - // bulletPushbacks[joinIndex-1].X += pushbackX - // bulletPushbacks[joinIndex-1].Y += pushbackY - // } - // } - // shouldRemove = true - // } - // if shouldRemove { - // removedBulletsAtCurrFrame[bulletCollider.CollisionBulletIndex] = 1 - // } - // } + for _, bulletCollider := range bulletColliders { + shouldRemove := false + meleeBullet := bulletCollider.Data.(*MeleeBullet) + collisionBulletIndex := COLLISION_BULLET_INDEX_PREFIX + meleeBullet.BattleLocalId + if collision := bulletCollider.Check(0, 0); collision != nil { + offender := currRenderFrame.Players[meleeBullet.OffenderPlayerId] + bulletShape := bulletCollider.Shape.(*resolv.ConvexPolygon) + for _, obj := range collision.Objects { + switch t := obj.Data.(type) { + case Player: + defenderShape := obj.Shape.(*resolv.ConvexPolygon) + if meleeBullet.OffenderPlayerId != t.Id { + if overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape); overlapped { + xfac := float64(1.0) // By now, straight Punch offset doesn't respect "y-axis" + if 0 > offender.DirX { + xfac = float64(-1.0) + } + bulletPushbacks[t.JoinIndex-1].X += xfac * meleeBullet.Pushback + nextRenderFramePlayers[t.Id].CharacterState = ATK_CHARACTER_STATE_ATKED1 + oldFramesToRecover := nextRenderFramePlayers[t.Id].FramesToRecover + if meleeBullet.HitStunFrames > oldFramesToRecover { + nextRenderFramePlayers[t.Id].FramesToRecover = meleeBullet.HitStunFrames + } + } + } + default: + Logger.Debug(fmt.Sprintf("Bullet collided with non-player: roomId=%v, currRenderFrame.Id=%v, delayedInputFrame.Id=%v", pR.Id, currRenderFrame.Id, delayedInputFrame.InputFrameId)) + } + } + shouldRemove = true + } + if shouldRemove { + removedBulletsAtCurrFrame[collisionBulletIndex] = 1 + } + } for _, meleeBullet := range currRenderFrame.MeleeBullets { collisionBulletIndex := COLLISION_BULLET_INDEX_PREFIX + meleeBullet.BattleLocalId @@ -1262,27 +1316,59 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF } if nil != delayedInputFrame { + var delayedInputFrameForPrevRenderFrame *InputFrameDownsync = nil + tmp := pR.InputsBuffer.GetByFrameId(pR.ConvertToInputFrameId(currRenderFrame.Id-1, pR.InputDelayFrames)) + if nil != tmp { + delayedInputFrameForPrevRenderFrame = tmp.(*InputFrameDownsync) + } inputList := delayedInputFrame.InputList // Process player inputs for playerId, player := range pR.Players { joinIndex := player.JoinIndex collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex playerCollider := collisionSysMap[collisionPlayerIndex] - if 0 < nextRenderFramePlayers[playerId].FramesToRecover { + thatPlayerInNextFrame := nextRenderFramePlayers[playerId] + if 0 < thatPlayerInNextFrame.FramesToRecover { // No need to process inputs for this player, but there might be bullet pushbacks on this player playerCollider.X += bulletPushbacks[joinIndex-1].X playerCollider.Y += bulletPushbacks[joinIndex-1].Y + // Update in the collision system + playerCollider.Update() continue } currPlayerDownsync := currRenderFrame.Players[playerId] decodedInput := pR.decodeInput(inputList[joinIndex-1]) + prevBtnALevel := int32(0) + if nil != delayedInputFrameForPrevRenderFrame { + prevDecodedInput := pR.decodeInput(delayedInputFrameForPrevRenderFrame.InputList[joinIndex-1]) + prevBtnALevel = prevDecodedInput.BtnALevel + } - if 0 != decodedInput.Dx || 0 != decodedInput.Dy { - nextRenderFramePlayers[playerId].DirX = decodedInput.Dx - nextRenderFramePlayers[playerId].DirY = decodedInput.Dy - nextRenderFramePlayers[playerId].CharacterState = 1 + if decodedInput.BtnALevel > prevBtnALevel { + punchSkillId := int32(1) + punchConfig := pR.MeleeSkillConfig[punchSkillId] + var newMeleeBullet MeleeBullet = *punchConfig + newMeleeBullet.BattleLocalId = pR.BulletBattleLocalIdCounter + pR.BulletBattleLocalIdCounter += 1 + newMeleeBullet.OffenderJoinIndex = joinIndex + newMeleeBullet.OffenderPlayerId = playerId + newMeleeBullet.OriginatedRenderFrameId = currRenderFrame.Id + toRet.MeleeBullets = append(toRet.MeleeBullets, &newMeleeBullet) + thatPlayerInNextFrame.FramesToRecover = newMeleeBullet.RecoveryFrames + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK1 + Logger.Info(fmt.Sprintf("roomId=%v, playerId=%v triggered a rising-edge of btnA at currRenderFrame.id=%v, delayedInputFrame.id=%v", pR.Id, playerId, currRenderFrame.Id, delayedInputFrame.InputFrameId)) + + } else if decodedInput.BtnALevel < prevBtnALevel { + Logger.Info(fmt.Sprintf("roomId=%v, playerId=%v triggered a falling-edge of btnA at currRenderFrame.id=%v, delayedInputFrame.id=%v", pR.Id, playerId, currRenderFrame.Id, delayedInputFrame.InputFrameId)) } else { - nextRenderFramePlayers[playerId].CharacterState = 0 + // No bullet trigger, process movement inputs + if 0 != decodedInput.Dx || 0 != decodedInput.Dy { + thatPlayerInNextFrame.DirX = decodedInput.Dx + thatPlayerInNextFrame.DirY = decodedInput.Dy + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_WALKING + } else { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + } } movementX, movementY := VirtualGridToWorldPos(decodedInput.Dx+decodedInput.Dx*currPlayerDownsync.Speed, decodedInput.Dy+decodedInput.Dy*currPlayerDownsync.Speed, pR.VirtualGridToWorldRatio) @@ -1320,8 +1406,8 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF // Update "virtual grid position" newVx, newVy := PolygonColliderAnchorToVirtualGridPos(playerCollider.X-effPushbacks[joinIndex-1].X, playerCollider.Y-effPushbacks[joinIndex-1].Y, player.ColliderRadius, player.ColliderRadius, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, pR.WorldToVirtualGridRatio) - nextRenderFramePlayers[playerId].VirtualGridX = newVx - nextRenderFramePlayers[playerId].VirtualGridY = newVy + thatPlayerInNextFrame := nextRenderFramePlayers[playerId] + thatPlayerInNextFrame.VirtualGridX, thatPlayerInNextFrame.VirtualGridY = newVx, newVy } Logger.Debug(fmt.Sprintf("After applyInputFrameDownsyncDynamicsOnSingleRenderFrame: currRenderFrame.Id=%v, inputList=%v, currRenderFrame.Players=%v, nextRenderFramePlayers=%v", currRenderFrame.Id, inputList, currRenderFrame.Players, nextRenderFramePlayers)) @@ -1352,6 +1438,7 @@ func (pR *Room) refreshColliders(spaceW, spaceH int32) { for _, player := range pR.Players { wx, wy := VirtualGridToWorldPos(player.VirtualGridX, player.VirtualGridY, pR.VirtualGridToWorldRatio) playerCollider := GenerateRectCollider(wx, wy, player.ColliderRadius*2, player.ColliderRadius*2, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, "Player") + playerCollider.Data = player space.Add(playerCollider) // Keep track of the collider in "pR.CollisionSysMap" joinIndex := player.JoinIndex diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index 9a37967..74d94cb 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -21,6 +21,792 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type PlayerDownsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` + VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` + DirX int32 `protobuf:"varint,4,opt,name=dirX,proto3" json:"dirX,omitempty"` + DirY int32 `protobuf:"varint,5,opt,name=dirY,proto3" json:"dirY,omitempty"` + Speed int32 `protobuf:"varint,6,opt,name=speed,proto3" json:"speed,omitempty"` // in terms of virtual grid units + BattleState int32 `protobuf:"varint,7,opt,name=battleState,proto3" json:"battleState,omitempty"` + JoinIndex int32 `protobuf:"varint,8,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` + ColliderRadius float64 `protobuf:"fixed64,9,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` + Removed bool `protobuf:"varint,10,opt,name=removed,proto3" json:"removed,omitempty"` + Score int32 `protobuf:"varint,11,opt,name=score,proto3" json:"score,omitempty"` + LastMoveGmtMillis int32 `protobuf:"varint,12,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` + FramesToRecover int32 `protobuf:"varint,13,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` + Hp int32 `protobuf:"varint,14,opt,name=hp,proto3" json:"hp,omitempty"` + MaxHp int32 `protobuf:"varint,15,opt,name=maxHp,proto3" json:"maxHp,omitempty"` + CharacterState int32 `protobuf:"varint,16,opt,name=characterState,proto3" json:"characterState,omitempty"` + Name string `protobuf:"bytes,17,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,18,opt,name=displayName,proto3" json:"displayName,omitempty"` + Avatar string `protobuf:"bytes,19,opt,name=avatar,proto3" json:"avatar,omitempty"` +} + +func (x *PlayerDownsync) Reset() { + *x = PlayerDownsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlayerDownsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlayerDownsync) ProtoMessage() {} + +func (x *PlayerDownsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlayerDownsync.ProtoReflect.Descriptor instead. +func (*PlayerDownsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{0} +} + +func (x *PlayerDownsync) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *PlayerDownsync) GetVirtualGridX() int32 { + if x != nil { + return x.VirtualGridX + } + return 0 +} + +func (x *PlayerDownsync) GetVirtualGridY() int32 { + if x != nil { + return x.VirtualGridY + } + return 0 +} + +func (x *PlayerDownsync) GetDirX() int32 { + if x != nil { + return x.DirX + } + return 0 +} + +func (x *PlayerDownsync) GetDirY() int32 { + if x != nil { + return x.DirY + } + return 0 +} + +func (x *PlayerDownsync) GetSpeed() int32 { + if x != nil { + return x.Speed + } + return 0 +} + +func (x *PlayerDownsync) GetBattleState() int32 { + if x != nil { + return x.BattleState + } + return 0 +} + +func (x *PlayerDownsync) GetJoinIndex() int32 { + if x != nil { + return x.JoinIndex + } + return 0 +} + +func (x *PlayerDownsync) GetColliderRadius() float64 { + if x != nil { + return x.ColliderRadius + } + return 0 +} + +func (x *PlayerDownsync) GetRemoved() bool { + if x != nil { + return x.Removed + } + return false +} + +func (x *PlayerDownsync) GetScore() int32 { + if x != nil { + return x.Score + } + return 0 +} + +func (x *PlayerDownsync) GetLastMoveGmtMillis() int32 { + if x != nil { + return x.LastMoveGmtMillis + } + return 0 +} + +func (x *PlayerDownsync) GetFramesToRecover() int32 { + if x != nil { + return x.FramesToRecover + } + return 0 +} + +func (x *PlayerDownsync) GetHp() int32 { + if x != nil { + return x.Hp + } + return 0 +} + +func (x *PlayerDownsync) GetMaxHp() int32 { + if x != nil { + return x.MaxHp + } + return 0 +} + +func (x *PlayerDownsync) GetCharacterState() int32 { + if x != nil { + return x.CharacterState + } + return 0 +} + +func (x *PlayerDownsync) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *PlayerDownsync) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *PlayerDownsync) GetAvatar() string { + if x != nil { + return x.Avatar + } + return "" +} + +type InputFrameDecoded struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Dx int32 `protobuf:"varint,1,opt,name=dx,proto3" json:"dx,omitempty"` + Dy int32 `protobuf:"varint,2,opt,name=dy,proto3" json:"dy,omitempty"` + BtnALevel int32 `protobuf:"varint,3,opt,name=btnALevel,proto3" json:"btnALevel,omitempty"` +} + +func (x *InputFrameDecoded) Reset() { + *x = InputFrameDecoded{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InputFrameDecoded) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputFrameDecoded) ProtoMessage() {} + +func (x *InputFrameDecoded) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InputFrameDecoded.ProtoReflect.Descriptor instead. +func (*InputFrameDecoded) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{1} +} + +func (x *InputFrameDecoded) GetDx() int32 { + if x != nil { + return x.Dx + } + return 0 +} + +func (x *InputFrameDecoded) GetDy() int32 { + if x != nil { + return x.Dy + } + return 0 +} + +func (x *InputFrameDecoded) GetBtnALevel() int32 { + if x != nil { + return x.BtnALevel + } + return 0 +} + +type InputFrameUpsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` + Encoded uint64 `protobuf:"varint,2,opt,name=encoded,proto3" json:"encoded,omitempty"` +} + +func (x *InputFrameUpsync) Reset() { + *x = InputFrameUpsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InputFrameUpsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputFrameUpsync) ProtoMessage() {} + +func (x *InputFrameUpsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InputFrameUpsync.ProtoReflect.Descriptor instead. +func (*InputFrameUpsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{2} +} + +func (x *InputFrameUpsync) GetInputFrameId() int32 { + if x != nil { + return x.InputFrameId + } + return 0 +} + +func (x *InputFrameUpsync) GetEncoded() uint64 { + if x != nil { + return x.Encoded + } + return 0 +} + +type InputFrameDownsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` + InputList []uint64 `protobuf:"varint,2,rep,packed,name=inputList,proto3" json:"inputList,omitempty"` // Indexed by "joinIndex", we try to compress the "single player input" into 1 word (64-bit for 64-bit Golang runtime) because atomic compare-and-swap only works on 1 word. Although CAS on custom struct is possible in Golang 1.19 https://pkg.go.dev/sync/atomic@go1.19.1#Value.CompareAndSwap, using a single word is still faster whenever possible. + ConfirmedList uint64 `protobuf:"varint,3,opt,name=confirmedList,proto3" json:"confirmedList,omitempty"` // Indexed by "joinIndex", same compression concern as above +} + +func (x *InputFrameDownsync) Reset() { + *x = InputFrameDownsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InputFrameDownsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputFrameDownsync) ProtoMessage() {} + +func (x *InputFrameDownsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InputFrameDownsync.ProtoReflect.Descriptor instead. +func (*InputFrameDownsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{3} +} + +func (x *InputFrameDownsync) GetInputFrameId() int32 { + if x != nil { + return x.InputFrameId + } + return 0 +} + +func (x *InputFrameDownsync) GetInputList() []uint64 { + if x != nil { + return x.InputList + } + return nil +} + +func (x *InputFrameDownsync) GetConfirmedList() uint64 { + if x != nil { + return x.ConfirmedList + } + return 0 +} + +type HeartbeatUpsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientTimestamp int64 `protobuf:"varint,1,opt,name=clientTimestamp,proto3" json:"clientTimestamp,omitempty"` +} + +func (x *HeartbeatUpsync) Reset() { + *x = HeartbeatUpsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeartbeatUpsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeartbeatUpsync) ProtoMessage() {} + +func (x *HeartbeatUpsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeartbeatUpsync.ProtoReflect.Descriptor instead. +func (*HeartbeatUpsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{4} +} + +func (x *HeartbeatUpsync) GetClientTimestamp() int64 { + if x != nil { + return x.ClientTimestamp + } + return 0 +} + +type WsReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MsgId int32 `protobuf:"varint,1,opt,name=msgId,proto3" json:"msgId,omitempty"` + PlayerId int32 `protobuf:"varint,2,opt,name=playerId,proto3" json:"playerId,omitempty"` + Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` + JoinIndex int32 `protobuf:"varint,4,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` + AckingFrameId int32 `protobuf:"varint,5,opt,name=ackingFrameId,proto3" json:"ackingFrameId,omitempty"` + AckingInputFrameId int32 `protobuf:"varint,6,opt,name=ackingInputFrameId,proto3" json:"ackingInputFrameId,omitempty"` + InputFrameUpsyncBatch []*InputFrameUpsync `protobuf:"bytes,7,rep,name=inputFrameUpsyncBatch,proto3" json:"inputFrameUpsyncBatch,omitempty"` + Hb *HeartbeatUpsync `protobuf:"bytes,8,opt,name=hb,proto3" json:"hb,omitempty"` +} + +func (x *WsReq) Reset() { + *x = WsReq{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WsReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WsReq) ProtoMessage() {} + +func (x *WsReq) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WsReq.ProtoReflect.Descriptor instead. +func (*WsReq) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{5} +} + +func (x *WsReq) GetMsgId() int32 { + if x != nil { + return x.MsgId + } + return 0 +} + +func (x *WsReq) GetPlayerId() int32 { + if x != nil { + return x.PlayerId + } + return 0 +} + +func (x *WsReq) GetAct() int32 { + if x != nil { + return x.Act + } + return 0 +} + +func (x *WsReq) GetJoinIndex() int32 { + if x != nil { + return x.JoinIndex + } + return 0 +} + +func (x *WsReq) GetAckingFrameId() int32 { + if x != nil { + return x.AckingFrameId + } + return 0 +} + +func (x *WsReq) GetAckingInputFrameId() int32 { + if x != nil { + return x.AckingInputFrameId + } + return 0 +} + +func (x *WsReq) GetInputFrameUpsyncBatch() []*InputFrameUpsync { + if x != nil { + return x.InputFrameUpsyncBatch + } + return nil +} + +func (x *WsReq) GetHb() *HeartbeatUpsync { + if x != nil { + return x.Hb + } + return nil +} + +type WsResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ret int32 `protobuf:"varint,1,opt,name=ret,proto3" json:"ret,omitempty"` + EchoedMsgId int32 `protobuf:"varint,2,opt,name=echoedMsgId,proto3" json:"echoedMsgId,omitempty"` + Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` + Rdf *RoomDownsyncFrame `protobuf:"bytes,4,opt,name=rdf,proto3" json:"rdf,omitempty"` + InputFrameDownsyncBatch []*InputFrameDownsync `protobuf:"bytes,5,rep,name=inputFrameDownsyncBatch,proto3" json:"inputFrameDownsyncBatch,omitempty"` + BciFrame *BattleColliderInfo `protobuf:"bytes,6,opt,name=bciFrame,proto3" json:"bciFrame,omitempty"` +} + +func (x *WsResp) Reset() { + *x = WsResp{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WsResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WsResp) ProtoMessage() {} + +func (x *WsResp) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WsResp.ProtoReflect.Descriptor instead. +func (*WsResp) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} +} + +func (x *WsResp) GetRet() int32 { + if x != nil { + return x.Ret + } + return 0 +} + +func (x *WsResp) GetEchoedMsgId() int32 { + if x != nil { + return x.EchoedMsgId + } + return 0 +} + +func (x *WsResp) GetAct() int32 { + if x != nil { + return x.Act + } + return 0 +} + +func (x *WsResp) GetRdf() *RoomDownsyncFrame { + if x != nil { + return x.Rdf + } + return nil +} + +func (x *WsResp) GetInputFrameDownsyncBatch() []*InputFrameDownsync { + if x != nil { + return x.InputFrameDownsyncBatch + } + return nil +} + +func (x *WsResp) GetBciFrame() *BattleColliderInfo { + if x != nil { + return x.BciFrame + } + return nil +} + +type MeleeBullet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // for offender + BattleLocalId int32 `protobuf:"varint,1,opt,name=battleLocalId,proto3" json:"battleLocalId,omitempty"` + StartupFrames int32 `protobuf:"varint,2,opt,name=startupFrames,proto3" json:"startupFrames,omitempty"` + ActiveFrames int32 `protobuf:"varint,3,opt,name=activeFrames,proto3" json:"activeFrames,omitempty"` + RecoveryFrames int32 `protobuf:"varint,4,opt,name=recoveryFrames,proto3" json:"recoveryFrames,omitempty"` + RecoveryFramesOnBlock int32 `protobuf:"varint,5,opt,name=recoveryFramesOnBlock,proto3" json:"recoveryFramesOnBlock,omitempty"` + RecoveryFramesOnHit int32 `protobuf:"varint,6,opt,name=recoveryFramesOnHit,proto3" json:"recoveryFramesOnHit,omitempty"` + Moveforward *sharedprotos.Vec2D `protobuf:"bytes,7,opt,name=moveforward,proto3" json:"moveforward,omitempty"` + HitboxOffset float64 `protobuf:"fixed64,8,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` + HitboxSize *sharedprotos.Vec2D `protobuf:"bytes,9,opt,name=hitboxSize,proto3" json:"hitboxSize,omitempty"` + OriginatedRenderFrameId int32 `protobuf:"varint,10,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` + // for defender + HitStunFrames int32 `protobuf:"varint,11,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` + BlockStunFrames int32 `protobuf:"varint,12,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` + Pushback float64 `protobuf:"fixed64,13,opt,name=pushback,proto3" json:"pushback,omitempty"` + ReleaseTriggerType int32 `protobuf:"varint,14,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge + Damage int32 `protobuf:"varint,15,opt,name=damage,proto3" json:"damage,omitempty"` + OffenderJoinIndex int32 `protobuf:"varint,16,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` + OffenderPlayerId int32 `protobuf:"varint,17,opt,name=offenderPlayerId,proto3" json:"offenderPlayerId,omitempty"` +} + +func (x *MeleeBullet) Reset() { + *x = MeleeBullet{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MeleeBullet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MeleeBullet) ProtoMessage() {} + +func (x *MeleeBullet) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MeleeBullet.ProtoReflect.Descriptor instead. +func (*MeleeBullet) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} +} + +func (x *MeleeBullet) GetBattleLocalId() int32 { + if x != nil { + return x.BattleLocalId + } + return 0 +} + +func (x *MeleeBullet) GetStartupFrames() int32 { + if x != nil { + return x.StartupFrames + } + return 0 +} + +func (x *MeleeBullet) GetActiveFrames() int32 { + if x != nil { + return x.ActiveFrames + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFrames() int32 { + if x != nil { + return x.RecoveryFrames + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFramesOnBlock() int32 { + if x != nil { + return x.RecoveryFramesOnBlock + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFramesOnHit() int32 { + if x != nil { + return x.RecoveryFramesOnHit + } + return 0 +} + +func (x *MeleeBullet) GetMoveforward() *sharedprotos.Vec2D { + if x != nil { + return x.Moveforward + } + return nil +} + +func (x *MeleeBullet) GetHitboxOffset() float64 { + if x != nil { + return x.HitboxOffset + } + return 0 +} + +func (x *MeleeBullet) GetHitboxSize() *sharedprotos.Vec2D { + if x != nil { + return x.HitboxSize + } + return nil +} + +func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { + if x != nil { + return x.OriginatedRenderFrameId + } + return 0 +} + +func (x *MeleeBullet) GetHitStunFrames() int32 { + if x != nil { + return x.HitStunFrames + } + return 0 +} + +func (x *MeleeBullet) GetBlockStunFrames() int32 { + if x != nil { + return x.BlockStunFrames + } + return 0 +} + +func (x *MeleeBullet) GetPushback() float64 { + if x != nil { + return x.Pushback + } + return 0 +} + +func (x *MeleeBullet) GetReleaseTriggerType() int32 { + if x != nil { + return x.ReleaseTriggerType + } + return 0 +} + +func (x *MeleeBullet) GetDamage() int32 { + if x != nil { + return x.Damage + } + return 0 +} + +func (x *MeleeBullet) GetOffenderJoinIndex() int32 { + if x != nil { + return x.OffenderJoinIndex + } + return 0 +} + +func (x *MeleeBullet) GetOffenderPlayerId() int32 { + if x != nil { + return x.OffenderPlayerId + } + return 0 +} + type BattleColliderInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -50,12 +836,13 @@ type BattleColliderInfo struct { VirtualGridToWorldRatio float64 `protobuf:"fixed64,22,opt,name=virtualGridToWorldRatio,proto3" json:"virtualGridToWorldRatio,omitempty"` SpAtkLookupFrames int32 `protobuf:"varint,23,opt,name=spAtkLookupFrames,proto3" json:"spAtkLookupFrames,omitempty"` RenderCacheSize int32 `protobuf:"varint,24,opt,name=renderCacheSize,proto3" json:"renderCacheSize,omitempty"` + MeleeSkillConfig map[int32]*MeleeBullet `protobuf:"bytes,25,rep,name=meleeSkillConfig,proto3" json:"meleeSkillConfig,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // skillId -> skill } func (x *BattleColliderInfo) Reset() { *x = BattleColliderInfo{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[0] + mi := &file_room_downsync_frame_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -68,7 +855,7 @@ func (x *BattleColliderInfo) String() string { func (*BattleColliderInfo) ProtoMessage() {} func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[0] + mi := &file_room_downsync_frame_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -81,7 +868,7 @@ func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BattleColliderInfo.ProtoReflect.Descriptor instead. func (*BattleColliderInfo) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{0} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} } func (x *BattleColliderInfo) GetStageName() string { @@ -252,792 +1039,13 @@ func (x *BattleColliderInfo) GetRenderCacheSize() int32 { return 0 } -type PlayerDownsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` - VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` - DirX int32 `protobuf:"varint,4,opt,name=dirX,proto3" json:"dirX,omitempty"` - DirY int32 `protobuf:"varint,5,opt,name=dirY,proto3" json:"dirY,omitempty"` - Speed int32 `protobuf:"varint,6,opt,name=speed,proto3" json:"speed,omitempty"` // in terms of virtual grid units - BattleState int32 `protobuf:"varint,7,opt,name=battleState,proto3" json:"battleState,omitempty"` - JoinIndex int32 `protobuf:"varint,8,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` - ColliderRadius float64 `protobuf:"fixed64,9,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` - Removed bool `protobuf:"varint,10,opt,name=removed,proto3" json:"removed,omitempty"` - Score int32 `protobuf:"varint,11,opt,name=score,proto3" json:"score,omitempty"` - LastMoveGmtMillis int32 `protobuf:"varint,12,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` - FramesToRecover int32 `protobuf:"varint,13,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` - Hp int32 `protobuf:"varint,14,opt,name=hp,proto3" json:"hp,omitempty"` - MaxHp int32 `protobuf:"varint,15,opt,name=maxHp,proto3" json:"maxHp,omitempty"` - CharacterState int32 `protobuf:"varint,16,opt,name=characterState,proto3" json:"characterState,omitempty"` - Name string `protobuf:"bytes,17,opt,name=name,proto3" json:"name,omitempty"` - DisplayName string `protobuf:"bytes,18,opt,name=displayName,proto3" json:"displayName,omitempty"` - Avatar string `protobuf:"bytes,19,opt,name=avatar,proto3" json:"avatar,omitempty"` -} - -func (x *PlayerDownsync) Reset() { - *x = PlayerDownsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PlayerDownsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PlayerDownsync) ProtoMessage() {} - -func (x *PlayerDownsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PlayerDownsync.ProtoReflect.Descriptor instead. -func (*PlayerDownsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{1} -} - -func (x *PlayerDownsync) GetId() int32 { +func (x *BattleColliderInfo) GetMeleeSkillConfig() map[int32]*MeleeBullet { if x != nil { - return x.Id - } - return 0 -} - -func (x *PlayerDownsync) GetVirtualGridX() int32 { - if x != nil { - return x.VirtualGridX - } - return 0 -} - -func (x *PlayerDownsync) GetVirtualGridY() int32 { - if x != nil { - return x.VirtualGridY - } - return 0 -} - -func (x *PlayerDownsync) GetDirX() int32 { - if x != nil { - return x.DirX - } - return 0 -} - -func (x *PlayerDownsync) GetDirY() int32 { - if x != nil { - return x.DirY - } - return 0 -} - -func (x *PlayerDownsync) GetSpeed() int32 { - if x != nil { - return x.Speed - } - return 0 -} - -func (x *PlayerDownsync) GetBattleState() int32 { - if x != nil { - return x.BattleState - } - return 0 -} - -func (x *PlayerDownsync) GetJoinIndex() int32 { - if x != nil { - return x.JoinIndex - } - return 0 -} - -func (x *PlayerDownsync) GetColliderRadius() float64 { - if x != nil { - return x.ColliderRadius - } - return 0 -} - -func (x *PlayerDownsync) GetRemoved() bool { - if x != nil { - return x.Removed - } - return false -} - -func (x *PlayerDownsync) GetScore() int32 { - if x != nil { - return x.Score - } - return 0 -} - -func (x *PlayerDownsync) GetLastMoveGmtMillis() int32 { - if x != nil { - return x.LastMoveGmtMillis - } - return 0 -} - -func (x *PlayerDownsync) GetFramesToRecover() int32 { - if x != nil { - return x.FramesToRecover - } - return 0 -} - -func (x *PlayerDownsync) GetHp() int32 { - if x != nil { - return x.Hp - } - return 0 -} - -func (x *PlayerDownsync) GetMaxHp() int32 { - if x != nil { - return x.MaxHp - } - return 0 -} - -func (x *PlayerDownsync) GetCharacterState() int32 { - if x != nil { - return x.CharacterState - } - return 0 -} - -func (x *PlayerDownsync) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *PlayerDownsync) GetDisplayName() string { - if x != nil { - return x.DisplayName - } - return "" -} - -func (x *PlayerDownsync) GetAvatar() string { - if x != nil { - return x.Avatar - } - return "" -} - -type InputFrameDecoded struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Dx int32 `protobuf:"varint,1,opt,name=dx,proto3" json:"dx,omitempty"` - Dy int32 `protobuf:"varint,2,opt,name=dy,proto3" json:"dy,omitempty"` - BtnALevel int32 `protobuf:"varint,3,opt,name=btnALevel,proto3" json:"btnALevel,omitempty"` -} - -func (x *InputFrameDecoded) Reset() { - *x = InputFrameDecoded{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InputFrameDecoded) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InputFrameDecoded) ProtoMessage() {} - -func (x *InputFrameDecoded) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InputFrameDecoded.ProtoReflect.Descriptor instead. -func (*InputFrameDecoded) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{2} -} - -func (x *InputFrameDecoded) GetDx() int32 { - if x != nil { - return x.Dx - } - return 0 -} - -func (x *InputFrameDecoded) GetDy() int32 { - if x != nil { - return x.Dy - } - return 0 -} - -func (x *InputFrameDecoded) GetBtnALevel() int32 { - if x != nil { - return x.BtnALevel - } - return 0 -} - -type InputFrameUpsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` - Encoded uint64 `protobuf:"varint,2,opt,name=encoded,proto3" json:"encoded,omitempty"` -} - -func (x *InputFrameUpsync) Reset() { - *x = InputFrameUpsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InputFrameUpsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InputFrameUpsync) ProtoMessage() {} - -func (x *InputFrameUpsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InputFrameUpsync.ProtoReflect.Descriptor instead. -func (*InputFrameUpsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{3} -} - -func (x *InputFrameUpsync) GetInputFrameId() int32 { - if x != nil { - return x.InputFrameId - } - return 0 -} - -func (x *InputFrameUpsync) GetEncoded() uint64 { - if x != nil { - return x.Encoded - } - return 0 -} - -type InputFrameDownsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` - InputList []uint64 `protobuf:"varint,2,rep,packed,name=inputList,proto3" json:"inputList,omitempty"` // Indexed by "joinIndex", we try to compress the "single player input" into 1 word (64-bit for 64-bit Golang runtime) because atomic compare-and-swap only works on 1 word. Although CAS on custom struct is possible in Golang 1.19 https://pkg.go.dev/sync/atomic@go1.19.1#Value.CompareAndSwap, using a single word is still faster whenever possible. - ConfirmedList uint64 `protobuf:"varint,3,opt,name=confirmedList,proto3" json:"confirmedList,omitempty"` // Indexed by "joinIndex", same compression concern as above -} - -func (x *InputFrameDownsync) Reset() { - *x = InputFrameDownsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InputFrameDownsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InputFrameDownsync) ProtoMessage() {} - -func (x *InputFrameDownsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InputFrameDownsync.ProtoReflect.Descriptor instead. -func (*InputFrameDownsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{4} -} - -func (x *InputFrameDownsync) GetInputFrameId() int32 { - if x != nil { - return x.InputFrameId - } - return 0 -} - -func (x *InputFrameDownsync) GetInputList() []uint64 { - if x != nil { - return x.InputList + return x.MeleeSkillConfig } return nil } -func (x *InputFrameDownsync) GetConfirmedList() uint64 { - if x != nil { - return x.ConfirmedList - } - return 0 -} - -type HeartbeatUpsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClientTimestamp int64 `protobuf:"varint,1,opt,name=clientTimestamp,proto3" json:"clientTimestamp,omitempty"` -} - -func (x *HeartbeatUpsync) Reset() { - *x = HeartbeatUpsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HeartbeatUpsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HeartbeatUpsync) ProtoMessage() {} - -func (x *HeartbeatUpsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HeartbeatUpsync.ProtoReflect.Descriptor instead. -func (*HeartbeatUpsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{5} -} - -func (x *HeartbeatUpsync) GetClientTimestamp() int64 { - if x != nil { - return x.ClientTimestamp - } - return 0 -} - -type WsReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - MsgId int32 `protobuf:"varint,1,opt,name=msgId,proto3" json:"msgId,omitempty"` - PlayerId int32 `protobuf:"varint,2,opt,name=playerId,proto3" json:"playerId,omitempty"` - Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` - JoinIndex int32 `protobuf:"varint,4,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` - AckingFrameId int32 `protobuf:"varint,5,opt,name=ackingFrameId,proto3" json:"ackingFrameId,omitempty"` - AckingInputFrameId int32 `protobuf:"varint,6,opt,name=ackingInputFrameId,proto3" json:"ackingInputFrameId,omitempty"` - InputFrameUpsyncBatch []*InputFrameUpsync `protobuf:"bytes,7,rep,name=inputFrameUpsyncBatch,proto3" json:"inputFrameUpsyncBatch,omitempty"` - Hb *HeartbeatUpsync `protobuf:"bytes,8,opt,name=hb,proto3" json:"hb,omitempty"` -} - -func (x *WsReq) Reset() { - *x = WsReq{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WsReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WsReq) ProtoMessage() {} - -func (x *WsReq) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WsReq.ProtoReflect.Descriptor instead. -func (*WsReq) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} -} - -func (x *WsReq) GetMsgId() int32 { - if x != nil { - return x.MsgId - } - return 0 -} - -func (x *WsReq) GetPlayerId() int32 { - if x != nil { - return x.PlayerId - } - return 0 -} - -func (x *WsReq) GetAct() int32 { - if x != nil { - return x.Act - } - return 0 -} - -func (x *WsReq) GetJoinIndex() int32 { - if x != nil { - return x.JoinIndex - } - return 0 -} - -func (x *WsReq) GetAckingFrameId() int32 { - if x != nil { - return x.AckingFrameId - } - return 0 -} - -func (x *WsReq) GetAckingInputFrameId() int32 { - if x != nil { - return x.AckingInputFrameId - } - return 0 -} - -func (x *WsReq) GetInputFrameUpsyncBatch() []*InputFrameUpsync { - if x != nil { - return x.InputFrameUpsyncBatch - } - return nil -} - -func (x *WsReq) GetHb() *HeartbeatUpsync { - if x != nil { - return x.Hb - } - return nil -} - -type WsResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ret int32 `protobuf:"varint,1,opt,name=ret,proto3" json:"ret,omitempty"` - EchoedMsgId int32 `protobuf:"varint,2,opt,name=echoedMsgId,proto3" json:"echoedMsgId,omitempty"` - Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` - Rdf *RoomDownsyncFrame `protobuf:"bytes,4,opt,name=rdf,proto3" json:"rdf,omitempty"` - InputFrameDownsyncBatch []*InputFrameDownsync `protobuf:"bytes,5,rep,name=inputFrameDownsyncBatch,proto3" json:"inputFrameDownsyncBatch,omitempty"` - BciFrame *BattleColliderInfo `protobuf:"bytes,6,opt,name=bciFrame,proto3" json:"bciFrame,omitempty"` -} - -func (x *WsResp) Reset() { - *x = WsResp{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WsResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WsResp) ProtoMessage() {} - -func (x *WsResp) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WsResp.ProtoReflect.Descriptor instead. -func (*WsResp) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} -} - -func (x *WsResp) GetRet() int32 { - if x != nil { - return x.Ret - } - return 0 -} - -func (x *WsResp) GetEchoedMsgId() int32 { - if x != nil { - return x.EchoedMsgId - } - return 0 -} - -func (x *WsResp) GetAct() int32 { - if x != nil { - return x.Act - } - return 0 -} - -func (x *WsResp) GetRdf() *RoomDownsyncFrame { - if x != nil { - return x.Rdf - } - return nil -} - -func (x *WsResp) GetInputFrameDownsyncBatch() []*InputFrameDownsync { - if x != nil { - return x.InputFrameDownsyncBatch - } - return nil -} - -func (x *WsResp) GetBciFrame() *BattleColliderInfo { - if x != nil { - return x.BciFrame - } - return nil -} - -type MeleeBullet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // for offender - BattleLocalId int32 `protobuf:"varint,1,opt,name=battleLocalId,proto3" json:"battleLocalId,omitempty"` - StartupFrames int32 `protobuf:"varint,2,opt,name=startupFrames,proto3" json:"startupFrames,omitempty"` - ActiveFrames int32 `protobuf:"varint,3,opt,name=activeFrames,proto3" json:"activeFrames,omitempty"` - RecoveryFrames int32 `protobuf:"varint,4,opt,name=recoveryFrames,proto3" json:"recoveryFrames,omitempty"` - RecoveryFramesOnBlock int32 `protobuf:"varint,5,opt,name=recoveryFramesOnBlock,proto3" json:"recoveryFramesOnBlock,omitempty"` - RecoveryFramesOnHit int32 `protobuf:"varint,6,opt,name=recoveryFramesOnHit,proto3" json:"recoveryFramesOnHit,omitempty"` - Moveforward *sharedprotos.Vec2D `protobuf:"bytes,7,opt,name=moveforward,proto3" json:"moveforward,omitempty"` - HitboxOffset float64 `protobuf:"fixed64,8,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` - HitboxSize *sharedprotos.Vec2D `protobuf:"bytes,9,opt,name=hitboxSize,proto3" json:"hitboxSize,omitempty"` - OriginatedRenderFrameId int32 `protobuf:"varint,10,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` - // for defender - HitStunFrames int32 `protobuf:"varint,11,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` - BlockStunFrames int32 `protobuf:"varint,12,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` - Pushback float64 `protobuf:"fixed64,13,opt,name=pushback,proto3" json:"pushback,omitempty"` - ReleaseTriggerType int32 `protobuf:"varint,14,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge - Damage int32 `protobuf:"varint,15,opt,name=damage,proto3" json:"damage,omitempty"` - OffenderJoinIndex int32 `protobuf:"varint,16,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` - OffenderPlayerId int32 `protobuf:"varint,17,opt,name=offenderPlayerId,proto3" json:"offenderPlayerId,omitempty"` -} - -func (x *MeleeBullet) Reset() { - *x = MeleeBullet{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MeleeBullet) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MeleeBullet) ProtoMessage() {} - -func (x *MeleeBullet) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MeleeBullet.ProtoReflect.Descriptor instead. -func (*MeleeBullet) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} -} - -func (x *MeleeBullet) GetBattleLocalId() int32 { - if x != nil { - return x.BattleLocalId - } - return 0 -} - -func (x *MeleeBullet) GetStartupFrames() int32 { - if x != nil { - return x.StartupFrames - } - return 0 -} - -func (x *MeleeBullet) GetActiveFrames() int32 { - if x != nil { - return x.ActiveFrames - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFrames() int32 { - if x != nil { - return x.RecoveryFrames - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFramesOnBlock() int32 { - if x != nil { - return x.RecoveryFramesOnBlock - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFramesOnHit() int32 { - if x != nil { - return x.RecoveryFramesOnHit - } - return 0 -} - -func (x *MeleeBullet) GetMoveforward() *sharedprotos.Vec2D { - if x != nil { - return x.Moveforward - } - return nil -} - -func (x *MeleeBullet) GetHitboxOffset() float64 { - if x != nil { - return x.HitboxOffset - } - return 0 -} - -func (x *MeleeBullet) GetHitboxSize() *sharedprotos.Vec2D { - if x != nil { - return x.HitboxSize - } - return nil -} - -func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { - if x != nil { - return x.OriginatedRenderFrameId - } - return 0 -} - -func (x *MeleeBullet) GetHitStunFrames() int32 { - if x != nil { - return x.HitStunFrames - } - return 0 -} - -func (x *MeleeBullet) GetBlockStunFrames() int32 { - if x != nil { - return x.BlockStunFrames - } - return 0 -} - -func (x *MeleeBullet) GetPushback() float64 { - if x != nil { - return x.Pushback - } - return 0 -} - -func (x *MeleeBullet) GetReleaseTriggerType() int32 { - if x != nil { - return x.ReleaseTriggerType - } - return 0 -} - -func (x *MeleeBullet) GetDamage() int32 { - if x != nil { - return x.Damage - } - return 0 -} - -func (x *MeleeBullet) GetOffenderJoinIndex() int32 { - if x != nil { - return x.OffenderJoinIndex - } - return 0 -} - -func (x *MeleeBullet) GetOffenderPlayerId() int32 { - if x != nil { - return x.OffenderPlayerId - } - return 0 -} - type RoomDownsyncFrame struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1115,257 +1123,269 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x0a, 0x19, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x1a, 0x0e, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xac, 0x0b, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, - 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x54, - 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, - 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, - 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x6b, 0x0a, 0x15, 0x73, 0x74, 0x72, - 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, - 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x69, 0x72, 0x58, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, + 0x72, 0x58, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x59, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x64, 0x69, 0x72, 0x59, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, + 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, + 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, + 0x68, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, 0x0a, 0x05, + 0x6d, 0x61, 0x78, 0x48, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x78, + 0x48, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, + 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, + 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, + 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, + 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, + 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, + 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, + 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, + 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, + 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, + 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, + 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, + 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, + 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, + 0xe5, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, + 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, + 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x12, + 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x68, 0x69, + 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x68, 0x69, + 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, + 0x63, 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, + 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, + 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, + 0x68, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, + 0x68, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, + 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x10, 0x6f, + 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0xe4, 0x0c, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, + 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x11, + 0x73, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, + 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x73, 0x74, 0x72, 0x54, + 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x6b, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x12, 0x26, - 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, - 0x69, 0x6c, 0x65, 0x57, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, - 0x69, 0x6c, 0x65, 0x48, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, - 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, - 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, - 0x6d, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x46, 0x70, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x46, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, - 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, - 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, - 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, - 0x12, 0x38, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, - 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, - 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x38, 0x0a, 0x17, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, - 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, - 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x5d, 0x0a, 0x16, - 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, 0x1a, 0x53, - 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, - 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xb2, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, - 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x69, 0x72, 0x58, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, - 0x58, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x59, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x64, 0x69, 0x72, 0x59, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x62, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, - 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, - 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, - 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x68, - 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, - 0x61, 0x78, 0x48, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x48, - 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, - 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, - 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, 0x02, - 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, - 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x12, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, - 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, - 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, 0x0a, - 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, 0x65, - 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, - 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, - 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x48, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x02, - 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, - 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, - 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, - 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0xe5, - 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x24, - 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x13, - 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, - 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x12, 0x35, - 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x68, 0x69, 0x74, - 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x68, 0x69, 0x74, - 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, - 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, - 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, - 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, - 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, - 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, - 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, 0x68, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, - 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x10, 0x6f, 0x66, - 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, - 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, - 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, - 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, - 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, - 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, - 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x1a, - 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, - 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, + 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, + 0x65, 0x57, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, + 0x65, 0x74, 0x65, 0x48, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, + 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, + 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x70, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x73, 0x74, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, + 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, + 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, + 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, + 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, + 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, + 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x38, + 0x0a, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, + 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, + 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, + 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x5c, 0x0a, 0x10, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, + 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, + 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x5d, + 0x0a, 0x16, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, + 0x1a, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, + 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x15, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, + 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, + 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9a, + 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, + 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, + 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, + 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, + 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, + 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1380,45 +1400,48 @@ func file_room_downsync_frame_proto_rawDescGZIP() []byte { return file_room_downsync_frame_proto_rawDescData } -var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_room_downsync_frame_proto_goTypes = []interface{}{ - (*BattleColliderInfo)(nil), // 0: protos.BattleColliderInfo - (*PlayerDownsync)(nil), // 1: protos.PlayerDownsync - (*InputFrameDecoded)(nil), // 2: protos.InputFrameDecoded - (*InputFrameUpsync)(nil), // 3: protos.InputFrameUpsync - (*InputFrameDownsync)(nil), // 4: protos.InputFrameDownsync - (*HeartbeatUpsync)(nil), // 5: protos.HeartbeatUpsync - (*WsReq)(nil), // 6: protos.WsReq - (*WsResp)(nil), // 7: protos.WsResp - (*MeleeBullet)(nil), // 8: protos.MeleeBullet + (*PlayerDownsync)(nil), // 0: protos.PlayerDownsync + (*InputFrameDecoded)(nil), // 1: protos.InputFrameDecoded + (*InputFrameUpsync)(nil), // 2: protos.InputFrameUpsync + (*InputFrameDownsync)(nil), // 3: protos.InputFrameDownsync + (*HeartbeatUpsync)(nil), // 4: protos.HeartbeatUpsync + (*WsReq)(nil), // 5: protos.WsReq + (*WsResp)(nil), // 6: protos.WsResp + (*MeleeBullet)(nil), // 7: protos.MeleeBullet + (*BattleColliderInfo)(nil), // 8: protos.BattleColliderInfo (*RoomDownsyncFrame)(nil), // 9: protos.RoomDownsyncFrame nil, // 10: protos.BattleColliderInfo.StrToVec2DListMapEntry nil, // 11: protos.BattleColliderInfo.StrToPolygon2DListMapEntry - nil, // 12: protos.RoomDownsyncFrame.PlayersEntry - (*sharedprotos.Vec2D)(nil), // 13: sharedprotos.Vec2D - (*sharedprotos.Vec2DList)(nil), // 14: sharedprotos.Vec2DList - (*sharedprotos.Polygon2DList)(nil), // 15: sharedprotos.Polygon2DList + nil, // 12: protos.BattleColliderInfo.MeleeSkillConfigEntry + nil, // 13: protos.RoomDownsyncFrame.PlayersEntry + (*sharedprotos.Vec2D)(nil), // 14: sharedprotos.Vec2D + (*sharedprotos.Vec2DList)(nil), // 15: sharedprotos.Vec2DList + (*sharedprotos.Polygon2DList)(nil), // 16: sharedprotos.Polygon2DList } var file_room_downsync_frame_proto_depIdxs = []int32{ - 10, // 0: protos.BattleColliderInfo.strToVec2DListMap:type_name -> protos.BattleColliderInfo.StrToVec2DListMapEntry - 11, // 1: protos.BattleColliderInfo.strToPolygon2DListMap:type_name -> protos.BattleColliderInfo.StrToPolygon2DListMapEntry - 3, // 2: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync - 5, // 3: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync - 9, // 4: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame - 4, // 5: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync - 0, // 6: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo - 13, // 7: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D - 13, // 8: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D - 12, // 9: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry - 8, // 10: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet - 14, // 11: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList - 15, // 12: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList - 1, // 13: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync - 14, // [14:14] is the sub-list for method output_type - 14, // [14:14] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 2, // 0: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync + 4, // 1: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync + 9, // 2: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame + 3, // 3: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync + 8, // 4: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo + 14, // 5: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D + 14, // 6: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D + 10, // 7: protos.BattleColliderInfo.strToVec2DListMap:type_name -> protos.BattleColliderInfo.StrToVec2DListMapEntry + 11, // 8: protos.BattleColliderInfo.strToPolygon2DListMap:type_name -> protos.BattleColliderInfo.StrToPolygon2DListMapEntry + 12, // 9: protos.BattleColliderInfo.meleeSkillConfig:type_name -> protos.BattleColliderInfo.MeleeSkillConfigEntry + 13, // 10: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry + 7, // 11: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet + 15, // 12: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList + 16, // 13: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList + 7, // 14: protos.BattleColliderInfo.MeleeSkillConfigEntry.value:type_name -> protos.MeleeBullet + 0, // 15: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync + 16, // [16:16] is the sub-list for method output_type + 16, // [16:16] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name } func init() { file_room_downsync_frame_proto_init() } @@ -1428,18 +1451,6 @@ func file_room_downsync_frame_proto_init() { } if !protoimpl.UnsafeEnabled { file_room_downsync_frame_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BattleColliderInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_room_downsync_frame_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlayerDownsync); i { case 0: return &v.state @@ -1451,7 +1462,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InputFrameDecoded); i { case 0: return &v.state @@ -1463,7 +1474,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InputFrameUpsync); i { case 0: return &v.state @@ -1475,7 +1486,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InputFrameDownsync); i { case 0: return &v.state @@ -1487,7 +1498,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeartbeatUpsync); i { case 0: return &v.state @@ -1499,7 +1510,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WsReq); i { case 0: return &v.state @@ -1511,7 +1522,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WsResp); i { case 0: return &v.state @@ -1523,7 +1534,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeleeBullet); i { case 0: return &v.state @@ -1535,6 +1546,18 @@ func file_room_downsync_frame_proto_init() { return nil } } + file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BattleColliderInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } file_room_downsync_frame_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoomDownsyncFrame); i { case 0: @@ -1554,7 +1577,7 @@ func file_room_downsync_frame_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_room_downsync_frame_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 14, NumExtensions: 0, NumServices: 0, }, diff --git a/dnmshared/resolv_helper.go b/dnmshared/resolv_helper.go index 306d654..b534eb7 100644 --- a/dnmshared/resolv_helper.go +++ b/dnmshared/resolv_helper.go @@ -20,6 +20,10 @@ func ConvexPolygonStr(body *resolv.ConvexPolygon) string { func GenerateRectCollider(origX, origY, w, h, spaceOffsetX, spaceOffsetY float64, tag string) *resolv.Object { cx, cy := WorldToPolygonColliderAnchorPos(origX, origY, w*0.5, h*0.5, spaceOffsetX, spaceOffsetY) + return GenerateRectColliderInCollisionSpace(cx, cy, w, h, tag) +} + +func GenerateRectColliderInCollisionSpace(cx, cy, w, h float64, tag string) *resolv.Object { collider := resolv.NewObject(cx, cy, w, h, tag) shape := resolv.NewRectangle(0, 0, w, h) collider.SetShape(shape) diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index ca476a8..6471551 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -4,36 +4,6 @@ option go_package = "battle_srv/protos"; // here "./" corresponds to the "--go_o package protos; import "geometry.proto"; // The import path here is only w.r.t. the proto file, not the Go package. -message BattleColliderInfo { - string stageName = 1; - map strToVec2DListMap = 2; - map strToPolygon2DListMap = 3; - int32 stageDiscreteW = 4; - int32 stageDiscreteH = 5; - int32 stageTileW = 6; - int32 stageTileH = 7; - - int32 intervalToPing = 8; - int32 willKickIfInactiveFor = 9; - int32 boundRoomId = 10; - int64 battleDurationNanos = 11; - int32 serverFps = 12; - int32 inputDelayFrames = 13; - uint32 inputScaleFrames = 14; - int32 nstDelayFrames = 15; - int32 inputFrameUpsyncDelayTolerance = 16; - int32 maxChasingRenderFramesPerUpdate = 17; - int32 playerBattleState = 18; - double rollbackEstimatedDtMillis = 19; - int64 rollbackEstimatedDtNanos = 20; - - double worldToVirtualGridRatio = 21; - double virtualGridToWorldRatio = 22; - - int32 spAtkLookupFrames = 23; - int32 renderCacheSize = 24; -} - message PlayerDownsync { int32 id = 1; int32 virtualGridX = 2; @@ -126,6 +96,38 @@ message MeleeBullet { int32 offenderPlayerId = 17; } +message BattleColliderInfo { + string stageName = 1; + map strToVec2DListMap = 2; + map strToPolygon2DListMap = 3; + int32 stageDiscreteW = 4; + int32 stageDiscreteH = 5; + int32 stageTileW = 6; + int32 stageTileH = 7; + + int32 intervalToPing = 8; + int32 willKickIfInactiveFor = 9; + int32 boundRoomId = 10; + int64 battleDurationNanos = 11; + int32 serverFps = 12; + int32 inputDelayFrames = 13; + uint32 inputScaleFrames = 14; + int32 nstDelayFrames = 15; + int32 inputFrameUpsyncDelayTolerance = 16; + int32 maxChasingRenderFramesPerUpdate = 17; + int32 playerBattleState = 18; + double rollbackEstimatedDtMillis = 19; + int64 rollbackEstimatedDtNanos = 20; + + double worldToVirtualGridRatio = 21; + double virtualGridToWorldRatio = 22; + + int32 spAtkLookupFrames = 23; + int32 renderCacheSize = 24; + + map meleeSkillConfig = 25; // skillId -> skill +} + message RoomDownsyncFrame { int32 id = 1; map players = 2; diff --git a/frontend/assets/scenes/default_map.fire b/frontend/assets/scenes/default_map.fire index f324ed5..547ef92 100644 --- a/frontend/assets/scenes/default_map.fire +++ b/frontend/assets/scenes/default_map.fire @@ -343,6 +343,7 @@ "forceBigEndianFloatingNumDecoding": false, "renderFrameIdLagTolerance": 4, "jigglingEps1D": 0.001, + "bulletTriggerEnabled": true, "_id": "d12gkAmppNlIzqcRDELa91" }, { @@ -522,7 +523,7 @@ "array": [ 0, 0, - 239.32248305180272, + 210.23252687912068, 0, 0, 0, @@ -1482,7 +1483,6 @@ "zoomingListenerNode": { "__id__": 5 }, - "actionBtnListenerNode": null, "stickhead": { "__id__": 25 }, diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index 5cbb696..2818e90 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 210.4441731196186, + 210.23252687912068, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map_1.fire b/frontend/assets/scenes/offline_map_1.fire index 0ac0a62..b579327 100644 --- a/frontend/assets/scenes/offline_map_1.fire +++ b/frontend/assets/scenes/offline_map_1.fire @@ -454,7 +454,7 @@ "array": [ 0, 0, - 210.4441731196186, + 210.23252687912068, 0, 0, 0, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 8cf2031..d53c2b7 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -1085,18 +1085,23 @@ cc.Class({ bulletColliders.forEach((bulletCollider, collisionBulletIndex) => { const potentials = bulletCollider.potentials(); + const offender = currRenderFrame.players[bulletCollider.data.offenderPlayerId]; let shouldRemove = false; for (const potential of potentials) { if (null != potential.data && potential.data.joinIndex == bulletCollider.data.offenderJoinIndex) continue; if (!bulletCollider.collides(potential, result1)) continue; if (null != potential.data && null !== potential.data.joinIndex) { const joinIndex = potential.data.joinIndex; - bulletPushbacks[joinIndex - 1][0] += bulletCollider.data.pushback; // Only for straight punch, there's no y-pushback + let xfac = 1; + if (0 > offender.dirX) { + xfac = -1; + } + bulletPushbacks[joinIndex - 1][0] += xfac * bulletCollider.data.pushback; // Only for straight punch, there's no y-pushback bulletPushbacks[joinIndex - 1][1] += 0; const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.data.id]; thatAckedPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atked1[0]; - const oldFrameToRecover = thatAckedPlayerInNextFrame.framesToRecover; - thatAckedPlayerInNextFrame.framesToRecover = (oldFrameToRecover > bulletCollider.data.hitStunFrames ? oldFrameToRecover : bulletCollider.data.hitStunFrames); // In case the hit player is already stun, we extend it + const oldFramesToRecover = thatAckedPlayerInNextFrame.framesToRecover; + thatAckedPlayerInNextFrame.framesToRecover = (oldFramesToRecover > bulletCollider.data.hitStunFrames ? oldFramesToRecover : bulletCollider.data.hitStunFrames); // In case the hit player is already stun, we extend it } shouldRemove = true; } @@ -1156,14 +1161,14 @@ cc.Class({ punch.offenderPlayerId = playerId; punch.originatedRenderFrameId = currRenderFrame.id; toRet.meleeBullets.push(punch); - console.log(`A rising-edge of meleeBullet is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}: ${JSON.stringify(punch)}`); + console.log(`A rising-edge of meleeBullet is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}: ${self._stringifyRecentInputCache(true)}`); thatPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atk1[0]; } } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { // console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); } else { - // No trigger, process movement inputs + // No bullet trigger, process movement inputs if (0 != decodedInput.dx || 0 != decodedInput.dy) { // Update directions and thus would eventually update moving animation accordingly thatPlayerInNextFrame.dirX = decodedInput.dx; diff --git a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index c42318d..210dfea 100644 --- a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js +++ b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js @@ -1185,852 +1185,6 @@ $root.protos = (function() { */ var protos = {}; - protos.BattleColliderInfo = (function() { - - /** - * Properties of a BattleColliderInfo. - * @memberof protos - * @interface IBattleColliderInfo - * @property {string|null} [stageName] BattleColliderInfo stageName - * @property {Object.|null} [strToVec2DListMap] BattleColliderInfo strToVec2DListMap - * @property {Object.|null} [strToPolygon2DListMap] BattleColliderInfo strToPolygon2DListMap - * @property {number|null} [stageDiscreteW] BattleColliderInfo stageDiscreteW - * @property {number|null} [stageDiscreteH] BattleColliderInfo stageDiscreteH - * @property {number|null} [stageTileW] BattleColliderInfo stageTileW - * @property {number|null} [stageTileH] BattleColliderInfo stageTileH - * @property {number|null} [intervalToPing] BattleColliderInfo intervalToPing - * @property {number|null} [willKickIfInactiveFor] BattleColliderInfo willKickIfInactiveFor - * @property {number|null} [boundRoomId] BattleColliderInfo boundRoomId - * @property {number|Long|null} [battleDurationNanos] BattleColliderInfo battleDurationNanos - * @property {number|null} [serverFps] BattleColliderInfo serverFps - * @property {number|null} [inputDelayFrames] BattleColliderInfo inputDelayFrames - * @property {number|null} [inputScaleFrames] BattleColliderInfo inputScaleFrames - * @property {number|null} [nstDelayFrames] BattleColliderInfo nstDelayFrames - * @property {number|null} [inputFrameUpsyncDelayTolerance] BattleColliderInfo inputFrameUpsyncDelayTolerance - * @property {number|null} [maxChasingRenderFramesPerUpdate] BattleColliderInfo maxChasingRenderFramesPerUpdate - * @property {number|null} [playerBattleState] BattleColliderInfo playerBattleState - * @property {number|null} [rollbackEstimatedDtMillis] BattleColliderInfo rollbackEstimatedDtMillis - * @property {number|Long|null} [rollbackEstimatedDtNanos] BattleColliderInfo rollbackEstimatedDtNanos - * @property {number|null} [worldToVirtualGridRatio] BattleColliderInfo worldToVirtualGridRatio - * @property {number|null} [virtualGridToWorldRatio] BattleColliderInfo virtualGridToWorldRatio - * @property {number|null} [spAtkLookupFrames] BattleColliderInfo spAtkLookupFrames - * @property {number|null} [renderCacheSize] BattleColliderInfo renderCacheSize - */ - - /** - * Constructs a new BattleColliderInfo. - * @memberof protos - * @classdesc Represents a BattleColliderInfo. - * @implements IBattleColliderInfo - * @constructor - * @param {protos.IBattleColliderInfo=} [properties] Properties to set - */ - function BattleColliderInfo(properties) { - this.strToVec2DListMap = {}; - this.strToPolygon2DListMap = {}; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * BattleColliderInfo stageName. - * @member {string} stageName - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageName = ""; - - /** - * BattleColliderInfo strToVec2DListMap. - * @member {Object.} strToVec2DListMap - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.strToVec2DListMap = $util.emptyObject; - - /** - * BattleColliderInfo strToPolygon2DListMap. - * @member {Object.} strToPolygon2DListMap - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.strToPolygon2DListMap = $util.emptyObject; - - /** - * BattleColliderInfo stageDiscreteW. - * @member {number} stageDiscreteW - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageDiscreteW = 0; - - /** - * BattleColliderInfo stageDiscreteH. - * @member {number} stageDiscreteH - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageDiscreteH = 0; - - /** - * BattleColliderInfo stageTileW. - * @member {number} stageTileW - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageTileW = 0; - - /** - * BattleColliderInfo stageTileH. - * @member {number} stageTileH - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageTileH = 0; - - /** - * BattleColliderInfo intervalToPing. - * @member {number} intervalToPing - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.intervalToPing = 0; - - /** - * BattleColliderInfo willKickIfInactiveFor. - * @member {number} willKickIfInactiveFor - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.willKickIfInactiveFor = 0; - - /** - * BattleColliderInfo boundRoomId. - * @member {number} boundRoomId - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.boundRoomId = 0; - - /** - * BattleColliderInfo battleDurationNanos. - * @member {number|Long} battleDurationNanos - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.battleDurationNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - - /** - * BattleColliderInfo serverFps. - * @member {number} serverFps - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.serverFps = 0; - - /** - * BattleColliderInfo inputDelayFrames. - * @member {number} inputDelayFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputDelayFrames = 0; - - /** - * BattleColliderInfo inputScaleFrames. - * @member {number} inputScaleFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputScaleFrames = 0; - - /** - * BattleColliderInfo nstDelayFrames. - * @member {number} nstDelayFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.nstDelayFrames = 0; - - /** - * BattleColliderInfo inputFrameUpsyncDelayTolerance. - * @member {number} inputFrameUpsyncDelayTolerance - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputFrameUpsyncDelayTolerance = 0; - - /** - * BattleColliderInfo maxChasingRenderFramesPerUpdate. - * @member {number} maxChasingRenderFramesPerUpdate - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.maxChasingRenderFramesPerUpdate = 0; - - /** - * BattleColliderInfo playerBattleState. - * @member {number} playerBattleState - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.playerBattleState = 0; - - /** - * BattleColliderInfo rollbackEstimatedDtMillis. - * @member {number} rollbackEstimatedDtMillis - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.rollbackEstimatedDtMillis = 0; - - /** - * BattleColliderInfo rollbackEstimatedDtNanos. - * @member {number|Long} rollbackEstimatedDtNanos - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.rollbackEstimatedDtNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - - /** - * BattleColliderInfo worldToVirtualGridRatio. - * @member {number} worldToVirtualGridRatio - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.worldToVirtualGridRatio = 0; - - /** - * BattleColliderInfo virtualGridToWorldRatio. - * @member {number} virtualGridToWorldRatio - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.virtualGridToWorldRatio = 0; - - /** - * BattleColliderInfo spAtkLookupFrames. - * @member {number} spAtkLookupFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.spAtkLookupFrames = 0; - - /** - * BattleColliderInfo renderCacheSize. - * @member {number} renderCacheSize - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.renderCacheSize = 0; - - /** - * Creates a new BattleColliderInfo instance using the specified properties. - * @function create - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.IBattleColliderInfo=} [properties] Properties to set - * @returns {protos.BattleColliderInfo} BattleColliderInfo instance - */ - BattleColliderInfo.create = function create(properties) { - return new BattleColliderInfo(properties); - }; - - /** - * Encodes the specified BattleColliderInfo message. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. - * @function encode - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BattleColliderInfo.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.stageName != null && Object.hasOwnProperty.call(message, "stageName")) - writer.uint32(/* id 1, wireType 2 =*/10).string(message.stageName); - if (message.strToVec2DListMap != null && Object.hasOwnProperty.call(message, "strToVec2DListMap")) - for (var keys = Object.keys(message.strToVec2DListMap), i = 0; i < keys.length; ++i) { - writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); - $root.sharedprotos.Vec2DList.encode(message.strToVec2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); - } - if (message.strToPolygon2DListMap != null && Object.hasOwnProperty.call(message, "strToPolygon2DListMap")) - for (var keys = Object.keys(message.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { - writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); - $root.sharedprotos.Polygon2DList.encode(message.strToPolygon2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); - } - if (message.stageDiscreteW != null && Object.hasOwnProperty.call(message, "stageDiscreteW")) - writer.uint32(/* id 4, wireType 0 =*/32).int32(message.stageDiscreteW); - if (message.stageDiscreteH != null && Object.hasOwnProperty.call(message, "stageDiscreteH")) - writer.uint32(/* id 5, wireType 0 =*/40).int32(message.stageDiscreteH); - if (message.stageTileW != null && Object.hasOwnProperty.call(message, "stageTileW")) - writer.uint32(/* id 6, wireType 0 =*/48).int32(message.stageTileW); - if (message.stageTileH != null && Object.hasOwnProperty.call(message, "stageTileH")) - writer.uint32(/* id 7, wireType 0 =*/56).int32(message.stageTileH); - if (message.intervalToPing != null && Object.hasOwnProperty.call(message, "intervalToPing")) - writer.uint32(/* id 8, wireType 0 =*/64).int32(message.intervalToPing); - if (message.willKickIfInactiveFor != null && Object.hasOwnProperty.call(message, "willKickIfInactiveFor")) - writer.uint32(/* id 9, wireType 0 =*/72).int32(message.willKickIfInactiveFor); - if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) - writer.uint32(/* id 10, wireType 0 =*/80).int32(message.boundRoomId); - if (message.battleDurationNanos != null && Object.hasOwnProperty.call(message, "battleDurationNanos")) - writer.uint32(/* id 11, wireType 0 =*/88).int64(message.battleDurationNanos); - if (message.serverFps != null && Object.hasOwnProperty.call(message, "serverFps")) - writer.uint32(/* id 12, wireType 0 =*/96).int32(message.serverFps); - if (message.inputDelayFrames != null && Object.hasOwnProperty.call(message, "inputDelayFrames")) - writer.uint32(/* id 13, wireType 0 =*/104).int32(message.inputDelayFrames); - if (message.inputScaleFrames != null && Object.hasOwnProperty.call(message, "inputScaleFrames")) - writer.uint32(/* id 14, wireType 0 =*/112).uint32(message.inputScaleFrames); - if (message.nstDelayFrames != null && Object.hasOwnProperty.call(message, "nstDelayFrames")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.nstDelayFrames); - if (message.inputFrameUpsyncDelayTolerance != null && Object.hasOwnProperty.call(message, "inputFrameUpsyncDelayTolerance")) - writer.uint32(/* id 16, wireType 0 =*/128).int32(message.inputFrameUpsyncDelayTolerance); - if (message.maxChasingRenderFramesPerUpdate != null && Object.hasOwnProperty.call(message, "maxChasingRenderFramesPerUpdate")) - writer.uint32(/* id 17, wireType 0 =*/136).int32(message.maxChasingRenderFramesPerUpdate); - if (message.playerBattleState != null && Object.hasOwnProperty.call(message, "playerBattleState")) - writer.uint32(/* id 18, wireType 0 =*/144).int32(message.playerBattleState); - if (message.rollbackEstimatedDtMillis != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtMillis")) - writer.uint32(/* id 19, wireType 1 =*/153).double(message.rollbackEstimatedDtMillis); - if (message.rollbackEstimatedDtNanos != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtNanos")) - writer.uint32(/* id 20, wireType 0 =*/160).int64(message.rollbackEstimatedDtNanos); - if (message.worldToVirtualGridRatio != null && Object.hasOwnProperty.call(message, "worldToVirtualGridRatio")) - writer.uint32(/* id 21, wireType 1 =*/169).double(message.worldToVirtualGridRatio); - if (message.virtualGridToWorldRatio != null && Object.hasOwnProperty.call(message, "virtualGridToWorldRatio")) - writer.uint32(/* id 22, wireType 1 =*/177).double(message.virtualGridToWorldRatio); - if (message.spAtkLookupFrames != null && Object.hasOwnProperty.call(message, "spAtkLookupFrames")) - writer.uint32(/* id 23, wireType 0 =*/184).int32(message.spAtkLookupFrames); - if (message.renderCacheSize != null && Object.hasOwnProperty.call(message, "renderCacheSize")) - writer.uint32(/* id 24, wireType 0 =*/192).int32(message.renderCacheSize); - return writer; - }; - - /** - * Encodes the specified BattleColliderInfo message, length delimited. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. - * @function encodeDelimited - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BattleColliderInfo.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a BattleColliderInfo message from the specified reader or buffer. - * @function decode - * @memberof protos.BattleColliderInfo - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {protos.BattleColliderInfo} BattleColliderInfo - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BattleColliderInfo.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key, value; - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: { - message.stageName = reader.string(); - break; - } - case 2: { - if (message.strToVec2DListMap === $util.emptyObject) - message.strToVec2DListMap = {}; - var end2 = reader.uint32() + reader.pos; - key = ""; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.string(); - break; - case 2: - value = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.strToVec2DListMap[key] = value; - break; - } - case 3: { - if (message.strToPolygon2DListMap === $util.emptyObject) - message.strToPolygon2DListMap = {}; - var end2 = reader.uint32() + reader.pos; - key = ""; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.string(); - break; - case 2: - value = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.strToPolygon2DListMap[key] = value; - break; - } - case 4: { - message.stageDiscreteW = reader.int32(); - break; - } - case 5: { - message.stageDiscreteH = reader.int32(); - break; - } - case 6: { - message.stageTileW = reader.int32(); - break; - } - case 7: { - message.stageTileH = reader.int32(); - break; - } - case 8: { - message.intervalToPing = reader.int32(); - break; - } - case 9: { - message.willKickIfInactiveFor = reader.int32(); - break; - } - case 10: { - message.boundRoomId = reader.int32(); - break; - } - case 11: { - message.battleDurationNanos = reader.int64(); - break; - } - case 12: { - message.serverFps = reader.int32(); - break; - } - case 13: { - message.inputDelayFrames = reader.int32(); - break; - } - case 14: { - message.inputScaleFrames = reader.uint32(); - break; - } - case 15: { - message.nstDelayFrames = reader.int32(); - break; - } - case 16: { - message.inputFrameUpsyncDelayTolerance = reader.int32(); - break; - } - case 17: { - message.maxChasingRenderFramesPerUpdate = reader.int32(); - break; - } - case 18: { - message.playerBattleState = reader.int32(); - break; - } - case 19: { - message.rollbackEstimatedDtMillis = reader.double(); - break; - } - case 20: { - message.rollbackEstimatedDtNanos = reader.int64(); - break; - } - case 21: { - message.worldToVirtualGridRatio = reader.double(); - break; - } - case 22: { - message.virtualGridToWorldRatio = reader.double(); - break; - } - case 23: { - message.spAtkLookupFrames = reader.int32(); - break; - } - case 24: { - message.renderCacheSize = reader.int32(); - break; - } - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a BattleColliderInfo message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof protos.BattleColliderInfo - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {protos.BattleColliderInfo} BattleColliderInfo - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BattleColliderInfo.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a BattleColliderInfo message. - * @function verify - * @memberof protos.BattleColliderInfo - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - BattleColliderInfo.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.stageName != null && message.hasOwnProperty("stageName")) - if (!$util.isString(message.stageName)) - return "stageName: string expected"; - if (message.strToVec2DListMap != null && message.hasOwnProperty("strToVec2DListMap")) { - if (!$util.isObject(message.strToVec2DListMap)) - return "strToVec2DListMap: object expected"; - var key = Object.keys(message.strToVec2DListMap); - for (var i = 0; i < key.length; ++i) { - var error = $root.sharedprotos.Vec2DList.verify(message.strToVec2DListMap[key[i]]); - if (error) - return "strToVec2DListMap." + error; - } - } - if (message.strToPolygon2DListMap != null && message.hasOwnProperty("strToPolygon2DListMap")) { - if (!$util.isObject(message.strToPolygon2DListMap)) - return "strToPolygon2DListMap: object expected"; - var key = Object.keys(message.strToPolygon2DListMap); - for (var i = 0; i < key.length; ++i) { - var error = $root.sharedprotos.Polygon2DList.verify(message.strToPolygon2DListMap[key[i]]); - if (error) - return "strToPolygon2DListMap." + error; - } - } - if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) - if (!$util.isInteger(message.stageDiscreteW)) - return "stageDiscreteW: integer expected"; - if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) - if (!$util.isInteger(message.stageDiscreteH)) - return "stageDiscreteH: integer expected"; - if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) - if (!$util.isInteger(message.stageTileW)) - return "stageTileW: integer expected"; - if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) - if (!$util.isInteger(message.stageTileH)) - return "stageTileH: integer expected"; - if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) - if (!$util.isInteger(message.intervalToPing)) - return "intervalToPing: integer expected"; - if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) - if (!$util.isInteger(message.willKickIfInactiveFor)) - return "willKickIfInactiveFor: integer expected"; - if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) - if (!$util.isInteger(message.boundRoomId)) - return "boundRoomId: integer expected"; - if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) - if (!$util.isInteger(message.battleDurationNanos) && !(message.battleDurationNanos && $util.isInteger(message.battleDurationNanos.low) && $util.isInteger(message.battleDurationNanos.high))) - return "battleDurationNanos: integer|Long expected"; - if (message.serverFps != null && message.hasOwnProperty("serverFps")) - if (!$util.isInteger(message.serverFps)) - return "serverFps: integer expected"; - if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) - if (!$util.isInteger(message.inputDelayFrames)) - return "inputDelayFrames: integer expected"; - if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) - if (!$util.isInteger(message.inputScaleFrames)) - return "inputScaleFrames: integer expected"; - if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) - if (!$util.isInteger(message.nstDelayFrames)) - return "nstDelayFrames: integer expected"; - if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) - if (!$util.isInteger(message.inputFrameUpsyncDelayTolerance)) - return "inputFrameUpsyncDelayTolerance: integer expected"; - if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) - if (!$util.isInteger(message.maxChasingRenderFramesPerUpdate)) - return "maxChasingRenderFramesPerUpdate: integer expected"; - if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) - if (!$util.isInteger(message.playerBattleState)) - return "playerBattleState: integer expected"; - if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) - if (typeof message.rollbackEstimatedDtMillis !== "number") - return "rollbackEstimatedDtMillis: number expected"; - if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) - if (!$util.isInteger(message.rollbackEstimatedDtNanos) && !(message.rollbackEstimatedDtNanos && $util.isInteger(message.rollbackEstimatedDtNanos.low) && $util.isInteger(message.rollbackEstimatedDtNanos.high))) - return "rollbackEstimatedDtNanos: integer|Long expected"; - if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) - if (typeof message.worldToVirtualGridRatio !== "number") - return "worldToVirtualGridRatio: number expected"; - if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) - if (typeof message.virtualGridToWorldRatio !== "number") - return "virtualGridToWorldRatio: number expected"; - if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) - if (!$util.isInteger(message.spAtkLookupFrames)) - return "spAtkLookupFrames: integer expected"; - if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) - if (!$util.isInteger(message.renderCacheSize)) - return "renderCacheSize: integer expected"; - return null; - }; - - /** - * Creates a BattleColliderInfo message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof protos.BattleColliderInfo - * @static - * @param {Object.} object Plain object - * @returns {protos.BattleColliderInfo} BattleColliderInfo - */ - BattleColliderInfo.fromObject = function fromObject(object) { - if (object instanceof $root.protos.BattleColliderInfo) - return object; - var message = new $root.protos.BattleColliderInfo(); - if (object.stageName != null) - message.stageName = String(object.stageName); - if (object.strToVec2DListMap) { - if (typeof object.strToVec2DListMap !== "object") - throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); - message.strToVec2DListMap = {}; - for (var keys = Object.keys(object.strToVec2DListMap), i = 0; i < keys.length; ++i) { - if (typeof object.strToVec2DListMap[keys[i]] !== "object") - throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); - message.strToVec2DListMap[keys[i]] = $root.sharedprotos.Vec2DList.fromObject(object.strToVec2DListMap[keys[i]]); - } - } - if (object.strToPolygon2DListMap) { - if (typeof object.strToPolygon2DListMap !== "object") - throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); - message.strToPolygon2DListMap = {}; - for (var keys = Object.keys(object.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { - if (typeof object.strToPolygon2DListMap[keys[i]] !== "object") - throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); - message.strToPolygon2DListMap[keys[i]] = $root.sharedprotos.Polygon2DList.fromObject(object.strToPolygon2DListMap[keys[i]]); - } - } - if (object.stageDiscreteW != null) - message.stageDiscreteW = object.stageDiscreteW | 0; - if (object.stageDiscreteH != null) - message.stageDiscreteH = object.stageDiscreteH | 0; - if (object.stageTileW != null) - message.stageTileW = object.stageTileW | 0; - if (object.stageTileH != null) - message.stageTileH = object.stageTileH | 0; - if (object.intervalToPing != null) - message.intervalToPing = object.intervalToPing | 0; - if (object.willKickIfInactiveFor != null) - message.willKickIfInactiveFor = object.willKickIfInactiveFor | 0; - if (object.boundRoomId != null) - message.boundRoomId = object.boundRoomId | 0; - if (object.battleDurationNanos != null) - if ($util.Long) - (message.battleDurationNanos = $util.Long.fromValue(object.battleDurationNanos)).unsigned = false; - else if (typeof object.battleDurationNanos === "string") - message.battleDurationNanos = parseInt(object.battleDurationNanos, 10); - else if (typeof object.battleDurationNanos === "number") - message.battleDurationNanos = object.battleDurationNanos; - else if (typeof object.battleDurationNanos === "object") - message.battleDurationNanos = new $util.LongBits(object.battleDurationNanos.low >>> 0, object.battleDurationNanos.high >>> 0).toNumber(); - if (object.serverFps != null) - message.serverFps = object.serverFps | 0; - if (object.inputDelayFrames != null) - message.inputDelayFrames = object.inputDelayFrames | 0; - if (object.inputScaleFrames != null) - message.inputScaleFrames = object.inputScaleFrames >>> 0; - if (object.nstDelayFrames != null) - message.nstDelayFrames = object.nstDelayFrames | 0; - if (object.inputFrameUpsyncDelayTolerance != null) - message.inputFrameUpsyncDelayTolerance = object.inputFrameUpsyncDelayTolerance | 0; - if (object.maxChasingRenderFramesPerUpdate != null) - message.maxChasingRenderFramesPerUpdate = object.maxChasingRenderFramesPerUpdate | 0; - if (object.playerBattleState != null) - message.playerBattleState = object.playerBattleState | 0; - if (object.rollbackEstimatedDtMillis != null) - message.rollbackEstimatedDtMillis = Number(object.rollbackEstimatedDtMillis); - if (object.rollbackEstimatedDtNanos != null) - if ($util.Long) - (message.rollbackEstimatedDtNanos = $util.Long.fromValue(object.rollbackEstimatedDtNanos)).unsigned = false; - else if (typeof object.rollbackEstimatedDtNanos === "string") - message.rollbackEstimatedDtNanos = parseInt(object.rollbackEstimatedDtNanos, 10); - else if (typeof object.rollbackEstimatedDtNanos === "number") - message.rollbackEstimatedDtNanos = object.rollbackEstimatedDtNanos; - else if (typeof object.rollbackEstimatedDtNanos === "object") - message.rollbackEstimatedDtNanos = new $util.LongBits(object.rollbackEstimatedDtNanos.low >>> 0, object.rollbackEstimatedDtNanos.high >>> 0).toNumber(); - if (object.worldToVirtualGridRatio != null) - message.worldToVirtualGridRatio = Number(object.worldToVirtualGridRatio); - if (object.virtualGridToWorldRatio != null) - message.virtualGridToWorldRatio = Number(object.virtualGridToWorldRatio); - if (object.spAtkLookupFrames != null) - message.spAtkLookupFrames = object.spAtkLookupFrames | 0; - if (object.renderCacheSize != null) - message.renderCacheSize = object.renderCacheSize | 0; - return message; - }; - - /** - * Creates a plain object from a BattleColliderInfo message. Also converts values to other types if specified. - * @function toObject - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.BattleColliderInfo} message BattleColliderInfo - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - BattleColliderInfo.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.objects || options.defaults) { - object.strToVec2DListMap = {}; - object.strToPolygon2DListMap = {}; - } - if (options.defaults) { - object.stageName = ""; - object.stageDiscreteW = 0; - object.stageDiscreteH = 0; - object.stageTileW = 0; - object.stageTileH = 0; - object.intervalToPing = 0; - object.willKickIfInactiveFor = 0; - object.boundRoomId = 0; - if ($util.Long) { - var long = new $util.Long(0, 0, false); - object.battleDurationNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.battleDurationNanos = options.longs === String ? "0" : 0; - object.serverFps = 0; - object.inputDelayFrames = 0; - object.inputScaleFrames = 0; - object.nstDelayFrames = 0; - object.inputFrameUpsyncDelayTolerance = 0; - object.maxChasingRenderFramesPerUpdate = 0; - object.playerBattleState = 0; - object.rollbackEstimatedDtMillis = 0; - if ($util.Long) { - var long = new $util.Long(0, 0, false); - object.rollbackEstimatedDtNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.rollbackEstimatedDtNanos = options.longs === String ? "0" : 0; - object.worldToVirtualGridRatio = 0; - object.virtualGridToWorldRatio = 0; - object.spAtkLookupFrames = 0; - object.renderCacheSize = 0; - } - if (message.stageName != null && message.hasOwnProperty("stageName")) - object.stageName = message.stageName; - var keys2; - if (message.strToVec2DListMap && (keys2 = Object.keys(message.strToVec2DListMap)).length) { - object.strToVec2DListMap = {}; - for (var j = 0; j < keys2.length; ++j) - object.strToVec2DListMap[keys2[j]] = $root.sharedprotos.Vec2DList.toObject(message.strToVec2DListMap[keys2[j]], options); - } - if (message.strToPolygon2DListMap && (keys2 = Object.keys(message.strToPolygon2DListMap)).length) { - object.strToPolygon2DListMap = {}; - for (var j = 0; j < keys2.length; ++j) - object.strToPolygon2DListMap[keys2[j]] = $root.sharedprotos.Polygon2DList.toObject(message.strToPolygon2DListMap[keys2[j]], options); - } - if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) - object.stageDiscreteW = message.stageDiscreteW; - if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) - object.stageDiscreteH = message.stageDiscreteH; - if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) - object.stageTileW = message.stageTileW; - if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) - object.stageTileH = message.stageTileH; - if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) - object.intervalToPing = message.intervalToPing; - if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) - object.willKickIfInactiveFor = message.willKickIfInactiveFor; - if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) - object.boundRoomId = message.boundRoomId; - if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) - if (typeof message.battleDurationNanos === "number") - object.battleDurationNanos = options.longs === String ? String(message.battleDurationNanos) : message.battleDurationNanos; - else - object.battleDurationNanos = options.longs === String ? $util.Long.prototype.toString.call(message.battleDurationNanos) : options.longs === Number ? new $util.LongBits(message.battleDurationNanos.low >>> 0, message.battleDurationNanos.high >>> 0).toNumber() : message.battleDurationNanos; - if (message.serverFps != null && message.hasOwnProperty("serverFps")) - object.serverFps = message.serverFps; - if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) - object.inputDelayFrames = message.inputDelayFrames; - if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) - object.inputScaleFrames = message.inputScaleFrames; - if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) - object.nstDelayFrames = message.nstDelayFrames; - if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) - object.inputFrameUpsyncDelayTolerance = message.inputFrameUpsyncDelayTolerance; - if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) - object.maxChasingRenderFramesPerUpdate = message.maxChasingRenderFramesPerUpdate; - if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) - object.playerBattleState = message.playerBattleState; - if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) - object.rollbackEstimatedDtMillis = options.json && !isFinite(message.rollbackEstimatedDtMillis) ? String(message.rollbackEstimatedDtMillis) : message.rollbackEstimatedDtMillis; - if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) - if (typeof message.rollbackEstimatedDtNanos === "number") - object.rollbackEstimatedDtNanos = options.longs === String ? String(message.rollbackEstimatedDtNanos) : message.rollbackEstimatedDtNanos; - else - object.rollbackEstimatedDtNanos = options.longs === String ? $util.Long.prototype.toString.call(message.rollbackEstimatedDtNanos) : options.longs === Number ? new $util.LongBits(message.rollbackEstimatedDtNanos.low >>> 0, message.rollbackEstimatedDtNanos.high >>> 0).toNumber() : message.rollbackEstimatedDtNanos; - if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) - object.worldToVirtualGridRatio = options.json && !isFinite(message.worldToVirtualGridRatio) ? String(message.worldToVirtualGridRatio) : message.worldToVirtualGridRatio; - if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) - object.virtualGridToWorldRatio = options.json && !isFinite(message.virtualGridToWorldRatio) ? String(message.virtualGridToWorldRatio) : message.virtualGridToWorldRatio; - if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) - object.spAtkLookupFrames = message.spAtkLookupFrames; - if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) - object.renderCacheSize = message.renderCacheSize; - return object; - }; - - /** - * Converts this BattleColliderInfo to JSON. - * @function toJSON - * @memberof protos.BattleColliderInfo - * @instance - * @returns {Object.} JSON object - */ - BattleColliderInfo.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Gets the default type url for BattleColliderInfo - * @function getTypeUrl - * @memberof protos.BattleColliderInfo - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - BattleColliderInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.BattleColliderInfo"; - }; - - return BattleColliderInfo; - })(); - protos.PlayerDownsync = (function() { /** @@ -4981,6 +4135,920 @@ $root.protos = (function() { return MeleeBullet; })(); + protos.BattleColliderInfo = (function() { + + /** + * Properties of a BattleColliderInfo. + * @memberof protos + * @interface IBattleColliderInfo + * @property {string|null} [stageName] BattleColliderInfo stageName + * @property {Object.|null} [strToVec2DListMap] BattleColliderInfo strToVec2DListMap + * @property {Object.|null} [strToPolygon2DListMap] BattleColliderInfo strToPolygon2DListMap + * @property {number|null} [stageDiscreteW] BattleColliderInfo stageDiscreteW + * @property {number|null} [stageDiscreteH] BattleColliderInfo stageDiscreteH + * @property {number|null} [stageTileW] BattleColliderInfo stageTileW + * @property {number|null} [stageTileH] BattleColliderInfo stageTileH + * @property {number|null} [intervalToPing] BattleColliderInfo intervalToPing + * @property {number|null} [willKickIfInactiveFor] BattleColliderInfo willKickIfInactiveFor + * @property {number|null} [boundRoomId] BattleColliderInfo boundRoomId + * @property {number|Long|null} [battleDurationNanos] BattleColliderInfo battleDurationNanos + * @property {number|null} [serverFps] BattleColliderInfo serverFps + * @property {number|null} [inputDelayFrames] BattleColliderInfo inputDelayFrames + * @property {number|null} [inputScaleFrames] BattleColliderInfo inputScaleFrames + * @property {number|null} [nstDelayFrames] BattleColliderInfo nstDelayFrames + * @property {number|null} [inputFrameUpsyncDelayTolerance] BattleColliderInfo inputFrameUpsyncDelayTolerance + * @property {number|null} [maxChasingRenderFramesPerUpdate] BattleColliderInfo maxChasingRenderFramesPerUpdate + * @property {number|null} [playerBattleState] BattleColliderInfo playerBattleState + * @property {number|null} [rollbackEstimatedDtMillis] BattleColliderInfo rollbackEstimatedDtMillis + * @property {number|Long|null} [rollbackEstimatedDtNanos] BattleColliderInfo rollbackEstimatedDtNanos + * @property {number|null} [worldToVirtualGridRatio] BattleColliderInfo worldToVirtualGridRatio + * @property {number|null} [virtualGridToWorldRatio] BattleColliderInfo virtualGridToWorldRatio + * @property {number|null} [spAtkLookupFrames] BattleColliderInfo spAtkLookupFrames + * @property {number|null} [renderCacheSize] BattleColliderInfo renderCacheSize + * @property {Object.|null} [meleeSkillConfig] BattleColliderInfo meleeSkillConfig + */ + + /** + * Constructs a new BattleColliderInfo. + * @memberof protos + * @classdesc Represents a BattleColliderInfo. + * @implements IBattleColliderInfo + * @constructor + * @param {protos.IBattleColliderInfo=} [properties] Properties to set + */ + function BattleColliderInfo(properties) { + this.strToVec2DListMap = {}; + this.strToPolygon2DListMap = {}; + this.meleeSkillConfig = {}; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * BattleColliderInfo stageName. + * @member {string} stageName + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageName = ""; + + /** + * BattleColliderInfo strToVec2DListMap. + * @member {Object.} strToVec2DListMap + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.strToVec2DListMap = $util.emptyObject; + + /** + * BattleColliderInfo strToPolygon2DListMap. + * @member {Object.} strToPolygon2DListMap + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.strToPolygon2DListMap = $util.emptyObject; + + /** + * BattleColliderInfo stageDiscreteW. + * @member {number} stageDiscreteW + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageDiscreteW = 0; + + /** + * BattleColliderInfo stageDiscreteH. + * @member {number} stageDiscreteH + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageDiscreteH = 0; + + /** + * BattleColliderInfo stageTileW. + * @member {number} stageTileW + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageTileW = 0; + + /** + * BattleColliderInfo stageTileH. + * @member {number} stageTileH + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageTileH = 0; + + /** + * BattleColliderInfo intervalToPing. + * @member {number} intervalToPing + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.intervalToPing = 0; + + /** + * BattleColliderInfo willKickIfInactiveFor. + * @member {number} willKickIfInactiveFor + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.willKickIfInactiveFor = 0; + + /** + * BattleColliderInfo boundRoomId. + * @member {number} boundRoomId + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.boundRoomId = 0; + + /** + * BattleColliderInfo battleDurationNanos. + * @member {number|Long} battleDurationNanos + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.battleDurationNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * BattleColliderInfo serverFps. + * @member {number} serverFps + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.serverFps = 0; + + /** + * BattleColliderInfo inputDelayFrames. + * @member {number} inputDelayFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.inputDelayFrames = 0; + + /** + * BattleColliderInfo inputScaleFrames. + * @member {number} inputScaleFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.inputScaleFrames = 0; + + /** + * BattleColliderInfo nstDelayFrames. + * @member {number} nstDelayFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.nstDelayFrames = 0; + + /** + * BattleColliderInfo inputFrameUpsyncDelayTolerance. + * @member {number} inputFrameUpsyncDelayTolerance + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.inputFrameUpsyncDelayTolerance = 0; + + /** + * BattleColliderInfo maxChasingRenderFramesPerUpdate. + * @member {number} maxChasingRenderFramesPerUpdate + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.maxChasingRenderFramesPerUpdate = 0; + + /** + * BattleColliderInfo playerBattleState. + * @member {number} playerBattleState + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.playerBattleState = 0; + + /** + * BattleColliderInfo rollbackEstimatedDtMillis. + * @member {number} rollbackEstimatedDtMillis + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.rollbackEstimatedDtMillis = 0; + + /** + * BattleColliderInfo rollbackEstimatedDtNanos. + * @member {number|Long} rollbackEstimatedDtNanos + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.rollbackEstimatedDtNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * BattleColliderInfo worldToVirtualGridRatio. + * @member {number} worldToVirtualGridRatio + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.worldToVirtualGridRatio = 0; + + /** + * BattleColliderInfo virtualGridToWorldRatio. + * @member {number} virtualGridToWorldRatio + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.virtualGridToWorldRatio = 0; + + /** + * BattleColliderInfo spAtkLookupFrames. + * @member {number} spAtkLookupFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.spAtkLookupFrames = 0; + + /** + * BattleColliderInfo renderCacheSize. + * @member {number} renderCacheSize + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.renderCacheSize = 0; + + /** + * BattleColliderInfo meleeSkillConfig. + * @member {Object.} meleeSkillConfig + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.meleeSkillConfig = $util.emptyObject; + + /** + * Creates a new BattleColliderInfo instance using the specified properties. + * @function create + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.IBattleColliderInfo=} [properties] Properties to set + * @returns {protos.BattleColliderInfo} BattleColliderInfo instance + */ + BattleColliderInfo.create = function create(properties) { + return new BattleColliderInfo(properties); + }; + + /** + * Encodes the specified BattleColliderInfo message. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. + * @function encode + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BattleColliderInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.stageName != null && Object.hasOwnProperty.call(message, "stageName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.stageName); + if (message.strToVec2DListMap != null && Object.hasOwnProperty.call(message, "strToVec2DListMap")) + for (var keys = Object.keys(message.strToVec2DListMap), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.sharedprotos.Vec2DList.encode(message.strToVec2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + if (message.strToPolygon2DListMap != null && Object.hasOwnProperty.call(message, "strToPolygon2DListMap")) + for (var keys = Object.keys(message.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.sharedprotos.Polygon2DList.encode(message.strToPolygon2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + if (message.stageDiscreteW != null && Object.hasOwnProperty.call(message, "stageDiscreteW")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.stageDiscreteW); + if (message.stageDiscreteH != null && Object.hasOwnProperty.call(message, "stageDiscreteH")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.stageDiscreteH); + if (message.stageTileW != null && Object.hasOwnProperty.call(message, "stageTileW")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.stageTileW); + if (message.stageTileH != null && Object.hasOwnProperty.call(message, "stageTileH")) + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.stageTileH); + if (message.intervalToPing != null && Object.hasOwnProperty.call(message, "intervalToPing")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.intervalToPing); + if (message.willKickIfInactiveFor != null && Object.hasOwnProperty.call(message, "willKickIfInactiveFor")) + writer.uint32(/* id 9, wireType 0 =*/72).int32(message.willKickIfInactiveFor); + if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.boundRoomId); + if (message.battleDurationNanos != null && Object.hasOwnProperty.call(message, "battleDurationNanos")) + writer.uint32(/* id 11, wireType 0 =*/88).int64(message.battleDurationNanos); + if (message.serverFps != null && Object.hasOwnProperty.call(message, "serverFps")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.serverFps); + if (message.inputDelayFrames != null && Object.hasOwnProperty.call(message, "inputDelayFrames")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.inputDelayFrames); + if (message.inputScaleFrames != null && Object.hasOwnProperty.call(message, "inputScaleFrames")) + writer.uint32(/* id 14, wireType 0 =*/112).uint32(message.inputScaleFrames); + if (message.nstDelayFrames != null && Object.hasOwnProperty.call(message, "nstDelayFrames")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.nstDelayFrames); + if (message.inputFrameUpsyncDelayTolerance != null && Object.hasOwnProperty.call(message, "inputFrameUpsyncDelayTolerance")) + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.inputFrameUpsyncDelayTolerance); + if (message.maxChasingRenderFramesPerUpdate != null && Object.hasOwnProperty.call(message, "maxChasingRenderFramesPerUpdate")) + writer.uint32(/* id 17, wireType 0 =*/136).int32(message.maxChasingRenderFramesPerUpdate); + if (message.playerBattleState != null && Object.hasOwnProperty.call(message, "playerBattleState")) + writer.uint32(/* id 18, wireType 0 =*/144).int32(message.playerBattleState); + if (message.rollbackEstimatedDtMillis != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtMillis")) + writer.uint32(/* id 19, wireType 1 =*/153).double(message.rollbackEstimatedDtMillis); + if (message.rollbackEstimatedDtNanos != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtNanos")) + writer.uint32(/* id 20, wireType 0 =*/160).int64(message.rollbackEstimatedDtNanos); + if (message.worldToVirtualGridRatio != null && Object.hasOwnProperty.call(message, "worldToVirtualGridRatio")) + writer.uint32(/* id 21, wireType 1 =*/169).double(message.worldToVirtualGridRatio); + if (message.virtualGridToWorldRatio != null && Object.hasOwnProperty.call(message, "virtualGridToWorldRatio")) + writer.uint32(/* id 22, wireType 1 =*/177).double(message.virtualGridToWorldRatio); + if (message.spAtkLookupFrames != null && Object.hasOwnProperty.call(message, "spAtkLookupFrames")) + writer.uint32(/* id 23, wireType 0 =*/184).int32(message.spAtkLookupFrames); + if (message.renderCacheSize != null && Object.hasOwnProperty.call(message, "renderCacheSize")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.renderCacheSize); + if (message.meleeSkillConfig != null && Object.hasOwnProperty.call(message, "meleeSkillConfig")) + for (var keys = Object.keys(message.meleeSkillConfig), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 25, wireType 2 =*/202).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]); + $root.protos.MeleeBullet.encode(message.meleeSkillConfig[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + return writer; + }; + + /** + * Encodes the specified BattleColliderInfo message, length delimited. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BattleColliderInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BattleColliderInfo message from the specified reader or buffer. + * @function decode + * @memberof protos.BattleColliderInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {protos.BattleColliderInfo} BattleColliderInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BattleColliderInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key, value; + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.stageName = reader.string(); + break; + } + case 2: { + if (message.strToVec2DListMap === $util.emptyObject) + message.strToVec2DListMap = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.strToVec2DListMap[key] = value; + break; + } + case 3: { + if (message.strToPolygon2DListMap === $util.emptyObject) + message.strToPolygon2DListMap = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.strToPolygon2DListMap[key] = value; + break; + } + case 4: { + message.stageDiscreteW = reader.int32(); + break; + } + case 5: { + message.stageDiscreteH = reader.int32(); + break; + } + case 6: { + message.stageTileW = reader.int32(); + break; + } + case 7: { + message.stageTileH = reader.int32(); + break; + } + case 8: { + message.intervalToPing = reader.int32(); + break; + } + case 9: { + message.willKickIfInactiveFor = reader.int32(); + break; + } + case 10: { + message.boundRoomId = reader.int32(); + break; + } + case 11: { + message.battleDurationNanos = reader.int64(); + break; + } + case 12: { + message.serverFps = reader.int32(); + break; + } + case 13: { + message.inputDelayFrames = reader.int32(); + break; + } + case 14: { + message.inputScaleFrames = reader.uint32(); + break; + } + case 15: { + message.nstDelayFrames = reader.int32(); + break; + } + case 16: { + message.inputFrameUpsyncDelayTolerance = reader.int32(); + break; + } + case 17: { + message.maxChasingRenderFramesPerUpdate = reader.int32(); + break; + } + case 18: { + message.playerBattleState = reader.int32(); + break; + } + case 19: { + message.rollbackEstimatedDtMillis = reader.double(); + break; + } + case 20: { + message.rollbackEstimatedDtNanos = reader.int64(); + break; + } + case 21: { + message.worldToVirtualGridRatio = reader.double(); + break; + } + case 22: { + message.virtualGridToWorldRatio = reader.double(); + break; + } + case 23: { + message.spAtkLookupFrames = reader.int32(); + break; + } + case 24: { + message.renderCacheSize = reader.int32(); + break; + } + case 25: { + if (message.meleeSkillConfig === $util.emptyObject) + message.meleeSkillConfig = {}; + var end2 = reader.uint32() + reader.pos; + key = 0; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.int32(); + break; + case 2: + value = $root.protos.MeleeBullet.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.meleeSkillConfig[key] = value; + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BattleColliderInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof protos.BattleColliderInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {protos.BattleColliderInfo} BattleColliderInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BattleColliderInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BattleColliderInfo message. + * @function verify + * @memberof protos.BattleColliderInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BattleColliderInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.stageName != null && message.hasOwnProperty("stageName")) + if (!$util.isString(message.stageName)) + return "stageName: string expected"; + if (message.strToVec2DListMap != null && message.hasOwnProperty("strToVec2DListMap")) { + if (!$util.isObject(message.strToVec2DListMap)) + return "strToVec2DListMap: object expected"; + var key = Object.keys(message.strToVec2DListMap); + for (var i = 0; i < key.length; ++i) { + var error = $root.sharedprotos.Vec2DList.verify(message.strToVec2DListMap[key[i]]); + if (error) + return "strToVec2DListMap." + error; + } + } + if (message.strToPolygon2DListMap != null && message.hasOwnProperty("strToPolygon2DListMap")) { + if (!$util.isObject(message.strToPolygon2DListMap)) + return "strToPolygon2DListMap: object expected"; + var key = Object.keys(message.strToPolygon2DListMap); + for (var i = 0; i < key.length; ++i) { + var error = $root.sharedprotos.Polygon2DList.verify(message.strToPolygon2DListMap[key[i]]); + if (error) + return "strToPolygon2DListMap." + error; + } + } + if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) + if (!$util.isInteger(message.stageDiscreteW)) + return "stageDiscreteW: integer expected"; + if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) + if (!$util.isInteger(message.stageDiscreteH)) + return "stageDiscreteH: integer expected"; + if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) + if (!$util.isInteger(message.stageTileW)) + return "stageTileW: integer expected"; + if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) + if (!$util.isInteger(message.stageTileH)) + return "stageTileH: integer expected"; + if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) + if (!$util.isInteger(message.intervalToPing)) + return "intervalToPing: integer expected"; + if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) + if (!$util.isInteger(message.willKickIfInactiveFor)) + return "willKickIfInactiveFor: integer expected"; + if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) + if (!$util.isInteger(message.boundRoomId)) + return "boundRoomId: integer expected"; + if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) + if (!$util.isInteger(message.battleDurationNanos) && !(message.battleDurationNanos && $util.isInteger(message.battleDurationNanos.low) && $util.isInteger(message.battleDurationNanos.high))) + return "battleDurationNanos: integer|Long expected"; + if (message.serverFps != null && message.hasOwnProperty("serverFps")) + if (!$util.isInteger(message.serverFps)) + return "serverFps: integer expected"; + if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) + if (!$util.isInteger(message.inputDelayFrames)) + return "inputDelayFrames: integer expected"; + if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) + if (!$util.isInteger(message.inputScaleFrames)) + return "inputScaleFrames: integer expected"; + if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) + if (!$util.isInteger(message.nstDelayFrames)) + return "nstDelayFrames: integer expected"; + if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) + if (!$util.isInteger(message.inputFrameUpsyncDelayTolerance)) + return "inputFrameUpsyncDelayTolerance: integer expected"; + if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) + if (!$util.isInteger(message.maxChasingRenderFramesPerUpdate)) + return "maxChasingRenderFramesPerUpdate: integer expected"; + if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) + if (!$util.isInteger(message.playerBattleState)) + return "playerBattleState: integer expected"; + if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) + if (typeof message.rollbackEstimatedDtMillis !== "number") + return "rollbackEstimatedDtMillis: number expected"; + if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) + if (!$util.isInteger(message.rollbackEstimatedDtNanos) && !(message.rollbackEstimatedDtNanos && $util.isInteger(message.rollbackEstimatedDtNanos.low) && $util.isInteger(message.rollbackEstimatedDtNanos.high))) + return "rollbackEstimatedDtNanos: integer|Long expected"; + if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) + if (typeof message.worldToVirtualGridRatio !== "number") + return "worldToVirtualGridRatio: number expected"; + if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) + if (typeof message.virtualGridToWorldRatio !== "number") + return "virtualGridToWorldRatio: number expected"; + if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) + if (!$util.isInteger(message.spAtkLookupFrames)) + return "spAtkLookupFrames: integer expected"; + if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + if (!$util.isInteger(message.renderCacheSize)) + return "renderCacheSize: integer expected"; + if (message.meleeSkillConfig != null && message.hasOwnProperty("meleeSkillConfig")) { + if (!$util.isObject(message.meleeSkillConfig)) + return "meleeSkillConfig: object expected"; + var key = Object.keys(message.meleeSkillConfig); + for (var i = 0; i < key.length; ++i) { + if (!$util.key32Re.test(key[i])) + return "meleeSkillConfig: integer key{k:int32} expected"; + { + var error = $root.protos.MeleeBullet.verify(message.meleeSkillConfig[key[i]]); + if (error) + return "meleeSkillConfig." + error; + } + } + } + return null; + }; + + /** + * Creates a BattleColliderInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof protos.BattleColliderInfo + * @static + * @param {Object.} object Plain object + * @returns {protos.BattleColliderInfo} BattleColliderInfo + */ + BattleColliderInfo.fromObject = function fromObject(object) { + if (object instanceof $root.protos.BattleColliderInfo) + return object; + var message = new $root.protos.BattleColliderInfo(); + if (object.stageName != null) + message.stageName = String(object.stageName); + if (object.strToVec2DListMap) { + if (typeof object.strToVec2DListMap !== "object") + throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); + message.strToVec2DListMap = {}; + for (var keys = Object.keys(object.strToVec2DListMap), i = 0; i < keys.length; ++i) { + if (typeof object.strToVec2DListMap[keys[i]] !== "object") + throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); + message.strToVec2DListMap[keys[i]] = $root.sharedprotos.Vec2DList.fromObject(object.strToVec2DListMap[keys[i]]); + } + } + if (object.strToPolygon2DListMap) { + if (typeof object.strToPolygon2DListMap !== "object") + throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); + message.strToPolygon2DListMap = {}; + for (var keys = Object.keys(object.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { + if (typeof object.strToPolygon2DListMap[keys[i]] !== "object") + throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); + message.strToPolygon2DListMap[keys[i]] = $root.sharedprotos.Polygon2DList.fromObject(object.strToPolygon2DListMap[keys[i]]); + } + } + if (object.stageDiscreteW != null) + message.stageDiscreteW = object.stageDiscreteW | 0; + if (object.stageDiscreteH != null) + message.stageDiscreteH = object.stageDiscreteH | 0; + if (object.stageTileW != null) + message.stageTileW = object.stageTileW | 0; + if (object.stageTileH != null) + message.stageTileH = object.stageTileH | 0; + if (object.intervalToPing != null) + message.intervalToPing = object.intervalToPing | 0; + if (object.willKickIfInactiveFor != null) + message.willKickIfInactiveFor = object.willKickIfInactiveFor | 0; + if (object.boundRoomId != null) + message.boundRoomId = object.boundRoomId | 0; + if (object.battleDurationNanos != null) + if ($util.Long) + (message.battleDurationNanos = $util.Long.fromValue(object.battleDurationNanos)).unsigned = false; + else if (typeof object.battleDurationNanos === "string") + message.battleDurationNanos = parseInt(object.battleDurationNanos, 10); + else if (typeof object.battleDurationNanos === "number") + message.battleDurationNanos = object.battleDurationNanos; + else if (typeof object.battleDurationNanos === "object") + message.battleDurationNanos = new $util.LongBits(object.battleDurationNanos.low >>> 0, object.battleDurationNanos.high >>> 0).toNumber(); + if (object.serverFps != null) + message.serverFps = object.serverFps | 0; + if (object.inputDelayFrames != null) + message.inputDelayFrames = object.inputDelayFrames | 0; + if (object.inputScaleFrames != null) + message.inputScaleFrames = object.inputScaleFrames >>> 0; + if (object.nstDelayFrames != null) + message.nstDelayFrames = object.nstDelayFrames | 0; + if (object.inputFrameUpsyncDelayTolerance != null) + message.inputFrameUpsyncDelayTolerance = object.inputFrameUpsyncDelayTolerance | 0; + if (object.maxChasingRenderFramesPerUpdate != null) + message.maxChasingRenderFramesPerUpdate = object.maxChasingRenderFramesPerUpdate | 0; + if (object.playerBattleState != null) + message.playerBattleState = object.playerBattleState | 0; + if (object.rollbackEstimatedDtMillis != null) + message.rollbackEstimatedDtMillis = Number(object.rollbackEstimatedDtMillis); + if (object.rollbackEstimatedDtNanos != null) + if ($util.Long) + (message.rollbackEstimatedDtNanos = $util.Long.fromValue(object.rollbackEstimatedDtNanos)).unsigned = false; + else if (typeof object.rollbackEstimatedDtNanos === "string") + message.rollbackEstimatedDtNanos = parseInt(object.rollbackEstimatedDtNanos, 10); + else if (typeof object.rollbackEstimatedDtNanos === "number") + message.rollbackEstimatedDtNanos = object.rollbackEstimatedDtNanos; + else if (typeof object.rollbackEstimatedDtNanos === "object") + message.rollbackEstimatedDtNanos = new $util.LongBits(object.rollbackEstimatedDtNanos.low >>> 0, object.rollbackEstimatedDtNanos.high >>> 0).toNumber(); + if (object.worldToVirtualGridRatio != null) + message.worldToVirtualGridRatio = Number(object.worldToVirtualGridRatio); + if (object.virtualGridToWorldRatio != null) + message.virtualGridToWorldRatio = Number(object.virtualGridToWorldRatio); + if (object.spAtkLookupFrames != null) + message.spAtkLookupFrames = object.spAtkLookupFrames | 0; + if (object.renderCacheSize != null) + message.renderCacheSize = object.renderCacheSize | 0; + if (object.meleeSkillConfig) { + if (typeof object.meleeSkillConfig !== "object") + throw TypeError(".protos.BattleColliderInfo.meleeSkillConfig: object expected"); + message.meleeSkillConfig = {}; + for (var keys = Object.keys(object.meleeSkillConfig), i = 0; i < keys.length; ++i) { + if (typeof object.meleeSkillConfig[keys[i]] !== "object") + throw TypeError(".protos.BattleColliderInfo.meleeSkillConfig: object expected"); + message.meleeSkillConfig[keys[i]] = $root.protos.MeleeBullet.fromObject(object.meleeSkillConfig[keys[i]]); + } + } + return message; + }; + + /** + * Creates a plain object from a BattleColliderInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.BattleColliderInfo} message BattleColliderInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + BattleColliderInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.objects || options.defaults) { + object.strToVec2DListMap = {}; + object.strToPolygon2DListMap = {}; + object.meleeSkillConfig = {}; + } + if (options.defaults) { + object.stageName = ""; + object.stageDiscreteW = 0; + object.stageDiscreteH = 0; + object.stageTileW = 0; + object.stageTileH = 0; + object.intervalToPing = 0; + object.willKickIfInactiveFor = 0; + object.boundRoomId = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.battleDurationNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.battleDurationNanos = options.longs === String ? "0" : 0; + object.serverFps = 0; + object.inputDelayFrames = 0; + object.inputScaleFrames = 0; + object.nstDelayFrames = 0; + object.inputFrameUpsyncDelayTolerance = 0; + object.maxChasingRenderFramesPerUpdate = 0; + object.playerBattleState = 0; + object.rollbackEstimatedDtMillis = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.rollbackEstimatedDtNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.rollbackEstimatedDtNanos = options.longs === String ? "0" : 0; + object.worldToVirtualGridRatio = 0; + object.virtualGridToWorldRatio = 0; + object.spAtkLookupFrames = 0; + object.renderCacheSize = 0; + } + if (message.stageName != null && message.hasOwnProperty("stageName")) + object.stageName = message.stageName; + var keys2; + if (message.strToVec2DListMap && (keys2 = Object.keys(message.strToVec2DListMap)).length) { + object.strToVec2DListMap = {}; + for (var j = 0; j < keys2.length; ++j) + object.strToVec2DListMap[keys2[j]] = $root.sharedprotos.Vec2DList.toObject(message.strToVec2DListMap[keys2[j]], options); + } + if (message.strToPolygon2DListMap && (keys2 = Object.keys(message.strToPolygon2DListMap)).length) { + object.strToPolygon2DListMap = {}; + for (var j = 0; j < keys2.length; ++j) + object.strToPolygon2DListMap[keys2[j]] = $root.sharedprotos.Polygon2DList.toObject(message.strToPolygon2DListMap[keys2[j]], options); + } + if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) + object.stageDiscreteW = message.stageDiscreteW; + if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) + object.stageDiscreteH = message.stageDiscreteH; + if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) + object.stageTileW = message.stageTileW; + if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) + object.stageTileH = message.stageTileH; + if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) + object.intervalToPing = message.intervalToPing; + if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) + object.willKickIfInactiveFor = message.willKickIfInactiveFor; + if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) + object.boundRoomId = message.boundRoomId; + if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) + if (typeof message.battleDurationNanos === "number") + object.battleDurationNanos = options.longs === String ? String(message.battleDurationNanos) : message.battleDurationNanos; + else + object.battleDurationNanos = options.longs === String ? $util.Long.prototype.toString.call(message.battleDurationNanos) : options.longs === Number ? new $util.LongBits(message.battleDurationNanos.low >>> 0, message.battleDurationNanos.high >>> 0).toNumber() : message.battleDurationNanos; + if (message.serverFps != null && message.hasOwnProperty("serverFps")) + object.serverFps = message.serverFps; + if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) + object.inputDelayFrames = message.inputDelayFrames; + if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) + object.inputScaleFrames = message.inputScaleFrames; + if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) + object.nstDelayFrames = message.nstDelayFrames; + if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) + object.inputFrameUpsyncDelayTolerance = message.inputFrameUpsyncDelayTolerance; + if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) + object.maxChasingRenderFramesPerUpdate = message.maxChasingRenderFramesPerUpdate; + if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) + object.playerBattleState = message.playerBattleState; + if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) + object.rollbackEstimatedDtMillis = options.json && !isFinite(message.rollbackEstimatedDtMillis) ? String(message.rollbackEstimatedDtMillis) : message.rollbackEstimatedDtMillis; + if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) + if (typeof message.rollbackEstimatedDtNanos === "number") + object.rollbackEstimatedDtNanos = options.longs === String ? String(message.rollbackEstimatedDtNanos) : message.rollbackEstimatedDtNanos; + else + object.rollbackEstimatedDtNanos = options.longs === String ? $util.Long.prototype.toString.call(message.rollbackEstimatedDtNanos) : options.longs === Number ? new $util.LongBits(message.rollbackEstimatedDtNanos.low >>> 0, message.rollbackEstimatedDtNanos.high >>> 0).toNumber() : message.rollbackEstimatedDtNanos; + if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) + object.worldToVirtualGridRatio = options.json && !isFinite(message.worldToVirtualGridRatio) ? String(message.worldToVirtualGridRatio) : message.worldToVirtualGridRatio; + if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) + object.virtualGridToWorldRatio = options.json && !isFinite(message.virtualGridToWorldRatio) ? String(message.virtualGridToWorldRatio) : message.virtualGridToWorldRatio; + if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) + object.spAtkLookupFrames = message.spAtkLookupFrames; + if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + object.renderCacheSize = message.renderCacheSize; + if (message.meleeSkillConfig && (keys2 = Object.keys(message.meleeSkillConfig)).length) { + object.meleeSkillConfig = {}; + for (var j = 0; j < keys2.length; ++j) + object.meleeSkillConfig[keys2[j]] = $root.protos.MeleeBullet.toObject(message.meleeSkillConfig[keys2[j]], options); + } + return object; + }; + + /** + * Converts this BattleColliderInfo to JSON. + * @function toJSON + * @memberof protos.BattleColliderInfo + * @instance + * @returns {Object.} JSON object + */ + BattleColliderInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for BattleColliderInfo + * @function getTypeUrl + * @memberof protos.BattleColliderInfo + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + BattleColliderInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.BattleColliderInfo"; + }; + + return BattleColliderInfo; + })(); + protos.RoomDownsyncFrame = (function() { /**