From 81a96a97398fa6ebcf16b2e9cf8896f57980870d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A2=E1=84=91=E1=85=B3=E1=86=AF=20=E1=84=82?= =?UTF-8?q?=E1=85=A9=E1=84=90=E1=85=B3=E1=84=87=E1=85=AE=E1=86=A8?= Date: Thu, 25 Oct 2018 08:57:26 +0900 Subject: [PATCH] Add: card matching - basic immigration --- .../card_matching/fantasy/commoner.png | Bin 0 -> 456 bytes .../character/card_matching/fantasy/elf.png | Bin 0 -> 452 bytes .../card_matching/fantasy/knight.png | Bin 0 -> 520 bytes .../character/card_matching/fantasy/orc.png | Bin 0 -> 479 bytes .../card_matching/fantasy/wizard.png | Bin 0 -> 584 bytes .../card_matching/general/beach_blonde.png | Bin 0 -> 328 bytes .../card_matching/general/blue_shirt.png | Bin 0 -> 353 bytes .../card_matching/general/blue_tee_shirt.png | Bin 0 -> 435 bytes .../card_matching/general/chinos.png | Bin 0 -> 401 bytes .../card_matching/general/elitist.png | Bin 0 -> 527 bytes .../card_matching/general/fabulous.png | Bin 0 -> 399 bytes .../card_matching/general/fedora.png | Bin 0 -> 423 bytes .../card_matching/general/gentleman.png | Bin 0 -> 471 bytes .../card_matching/general/green_beanie.png | Bin 0 -> 365 bytes .../card_matching/general/green_cap.png | Bin 0 -> 381 bytes .../card_matching/general/green_shirt.png | Bin 0 -> 406 bytes .../general/grey_shirt_blonde.png | Bin 0 -> 393 bytes .../card_matching/general/headphones.png | Bin 0 -> 492 bytes .../card_matching/general/headphones2.png | Bin 0 -> 496 bytes .../card_matching/general/karate.png | Bin 0 -> 388 bytes .../card_matching/general/native_america.png | Bin 0 -> 378 bytes .../character/card_matching/general/nerdy.png | Bin 0 -> 421 bytes .../card_matching/general/red_beanie.png | Bin 0 -> 437 bytes .../card_matching/general/red_cap.png | Bin 0 -> 437 bytes .../card_matching/general/red_jacket.png | Bin 0 -> 378 bytes .../card_matching/general/red_tee_shirt.png | Bin 0 -> 438 bytes .../card_matching/general/sailor_blue.png | Bin 0 -> 476 bytes .../card_matching/general/sailor_white.png | Bin 0 -> 482 bytes .../card_matching/general/smart_casual.png | Bin 0 -> 388 bytes .../card_matching/general/terminator.png | Bin 0 -> 422 bytes .../character/card_matching/general/vneck.png | Bin 0 -> 382 bytes .../card_matching/holiday/america.png | Bin 0 -> 538 bytes .../card_matching/holiday/halloween.png | Bin 0 -> 453 bytes .../card_matching/holiday/holiday_bunny.png | Bin 0 -> 436 bytes .../card_matching/holiday/patrick.png | Bin 0 -> 516 bytes .../character/card_matching/holiday/santa.png | Bin 0 -> 368 bytes .../card_matching/sports/basketball.png | Bin 0 -> 15755 bytes .../card_matching/sports/football.png | Bin 0 -> 505 bytes .../character/card_matching/sports/gym.png | Bin 0 -> 14951 bytes .../character/card_matching/sports/hockey.png | Bin 0 -> 426 bytes .../character/card_matching/sports/soccer.png | Bin 0 -> 440 bytes resources/image/ui/card_back.png | Bin 0 -> 5365 bytes resources/image/ui/card_front.png | Bin 0 -> 5086 bytes resources/image/ui/card_selected.png | Bin 0 -> 5420 bytes src/game/login/login.js | 2 +- .../mouse/card_matching/define_variables.js | 2 + src/game/mouse/card_matching/dude_card.js | 121 ++++ src/game/mouse/card_matching/game.js | 611 ++++++++++++++++++ src/game/mouse/card_matching/loading.js | 111 ++++ src/game/mouse/card_matching/main.js | 16 + src/game/mouse/card_matching/plus_score.js | 45 ++ .../mouse/card_matching/text_animation.js | 4 + src/web/client/card_matching.html | 61 ++ 53 files changed, 972 insertions(+), 1 deletion(-) create mode 100644 resources/image/character/card_matching/fantasy/commoner.png create mode 100644 resources/image/character/card_matching/fantasy/elf.png create mode 100644 resources/image/character/card_matching/fantasy/knight.png create mode 100644 resources/image/character/card_matching/fantasy/orc.png create mode 100644 resources/image/character/card_matching/fantasy/wizard.png create mode 100644 resources/image/character/card_matching/general/beach_blonde.png create mode 100644 resources/image/character/card_matching/general/blue_shirt.png create mode 100644 resources/image/character/card_matching/general/blue_tee_shirt.png create mode 100644 resources/image/character/card_matching/general/chinos.png create mode 100644 resources/image/character/card_matching/general/elitist.png create mode 100644 resources/image/character/card_matching/general/fabulous.png create mode 100644 resources/image/character/card_matching/general/fedora.png create mode 100644 resources/image/character/card_matching/general/gentleman.png create mode 100644 resources/image/character/card_matching/general/green_beanie.png create mode 100644 resources/image/character/card_matching/general/green_cap.png create mode 100644 resources/image/character/card_matching/general/green_shirt.png create mode 100644 resources/image/character/card_matching/general/grey_shirt_blonde.png create mode 100644 resources/image/character/card_matching/general/headphones.png create mode 100644 resources/image/character/card_matching/general/headphones2.png create mode 100644 resources/image/character/card_matching/general/karate.png create mode 100644 resources/image/character/card_matching/general/native_america.png create mode 100644 resources/image/character/card_matching/general/nerdy.png create mode 100644 resources/image/character/card_matching/general/red_beanie.png create mode 100644 resources/image/character/card_matching/general/red_cap.png create mode 100644 resources/image/character/card_matching/general/red_jacket.png create mode 100644 resources/image/character/card_matching/general/red_tee_shirt.png create mode 100644 resources/image/character/card_matching/general/sailor_blue.png create mode 100644 resources/image/character/card_matching/general/sailor_white.png create mode 100644 resources/image/character/card_matching/general/smart_casual.png create mode 100644 resources/image/character/card_matching/general/terminator.png create mode 100644 resources/image/character/card_matching/general/vneck.png create mode 100644 resources/image/character/card_matching/holiday/america.png create mode 100644 resources/image/character/card_matching/holiday/halloween.png create mode 100644 resources/image/character/card_matching/holiday/holiday_bunny.png create mode 100644 resources/image/character/card_matching/holiday/patrick.png create mode 100644 resources/image/character/card_matching/holiday/santa.png create mode 100644 resources/image/character/card_matching/sports/basketball.png create mode 100644 resources/image/character/card_matching/sports/football.png create mode 100644 resources/image/character/card_matching/sports/gym.png create mode 100644 resources/image/character/card_matching/sports/hockey.png create mode 100644 resources/image/character/card_matching/sports/soccer.png create mode 100644 resources/image/ui/card_back.png create mode 100644 resources/image/ui/card_front.png create mode 100644 resources/image/ui/card_selected.png create mode 100644 src/game/mouse/card_matching/define_variables.js create mode 100644 src/game/mouse/card_matching/dude_card.js create mode 100644 src/game/mouse/card_matching/game.js create mode 100644 src/game/mouse/card_matching/loading.js create mode 100644 src/game/mouse/card_matching/main.js create mode 100644 src/game/mouse/card_matching/plus_score.js create mode 100644 src/game/mouse/card_matching/text_animation.js create mode 100644 src/web/client/card_matching.html diff --git a/resources/image/character/card_matching/fantasy/commoner.png b/resources/image/character/card_matching/fantasy/commoner.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1da6952b3edc39f4939b6bc619bf2de0e66928 GIT binary patch literal 456 zcmV;(0XP1MP)(&W-ojW*~QQd>a;hC+X|1raUQl13zVzkDVyi#ItbW4a%pauh& z=pwp;Edb_>+@7-a)-r2g)$OF}b{ZJ%Oijy18Rm?PT?!juyA;-|s%aUaBtjkCc*~dS znho+M_w==r2sMAOG5!LLA$|e1lZ47wQCI**mV3n0rB4OO-5l$nd@7V!no#OuQ; zrh%~~G*AO1ubX?X{Ku`e+I0000 literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/fantasy/elf.png b/resources/image/character/card_matching/fantasy/elf.png new file mode 100644 index 0000000000000000000000000000000000000000..341076544584dcffa1248a81f0ce760ed298664b GIT binary patch literal 452 zcmV;#0XzPQP)c&fA_xh=A&@qQqNPpRTxt-c z>xI^&D2RfC3PFd!7l^!cFp1zA(mN&nQTc3N?)lvF+`|c)s=plTNOXIbWp+L+04%=& zTDmyj)eY#c`WGZrC9Zn{J^*spYER>vZ2*AE&4ZaF16t;u_0B$0(z`3PU<*la00E#X z@s7#YcFec$ZG1!d`y2qvn+aj<*1u(xPVNgvh0N4S@r+f3Q4hfFkKiA@(gC(sf(8&v zD3r$0ul{KPE)2tr6i-MZ$T(4GbbcF`(_Wpk(OM7>j z;zyVLC0PMZ!+CUPknO{Lp!&n)7=n;@4y)sp#r3wyM_evuro4Ku^`5dtp=p}DUMigt u(s}@1XN~cRfcYeyG44+uX%urbgZKh?WO6JU+rTIQ0000^_`u1~22u(QBqb7_flK6(_Yis4LEgt8j1x3_0RYhNz7YSz%z zlBoSWM05%}k)D4?+`HzgSpz^a`lN`Md5Yn!rW9v?18x9LAF;kPwEn~Z0000< KMNUMnLSTaS)Z>c) literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/fantasy/orc.png b/resources/image/character/card_matching/fantasy/orc.png new file mode 100644 index 0000000000000000000000000000000000000000..71f68b9109482d06ccf78ea878b34113dae8cb9a GIT binary patch literal 479 zcmV<50U-W~P)RRU<1OZ9!gYH^UU(UEL!PFP|e0~^R5Cp^Vw(cYA-+K!nxs~Mg;+5W7kse@O zT@#kq`{a#_Rk5N&`7AAI$M5pGc77`kKT>3Zxz;`5atVNNxfE$dw;|h-1rJCRNZz;r zWV2aF6exs>C*J$xR;nLyyViKrwoano2MliH%JxY!)oE@EWnPkOQ$0ZM3wp$`#k7@I+A5 zkite$ut_6qb&yKZ8FOOg8t+ge7OUM{akqPu?9S~*OMe*HdCY$Ay_tUo-i1Wa0wZNg zzxd7lDHqj@2nACiH}|L7WGYa+1=I-C!u%jlFK3=uTg$KujD+2zMpbJC;UsX9cwh%# z7PJ7T3V?6RaapYugah@oX{1c)z)F=zEwpS!0m$TrP+^hA_NG@iLwPEb8v>v!HX*f@ zHG1iPdU`oS+a^HGT$Gg$vvskAokxuoi$%ucCHklK>i&=TWlY$45_X<+I!(gPyD?`z z9xv6czdIR_+RB3V>(_$~K>yU9xH}n;rOG2^E9zgFs+h6i4nKYTR2BeB*=rFEg4N8$ zz?0oQZUt_=mBow=5w=Aqwze`F{A%d#r)r0;*n~6&FWLY8!@o@}dUvk(qXPJ~wZ% zv)#koyhV2XXLD^jUhD2017K&n2fziXrx|L`x;w`_PmpRAKVZ|=XlogE59S~65`f>( WjKzhN4B06F0000}h0 zySL(O(U&uOdRjydi5MFIf#C!OkDxP$4jee}q2|2yo~|3bI~CM~gHC`1UW$mB?_Q#t zaNy|wl2_c!kLN{lvN%6}{=S~W{IOB)`86y){7TFvtS1@-S3R&-RIf)=z%{^*$@8`ZWnlX z258@bn&Ol7FLK-mmpNvFhwR5&wu*Xc4-3pQIU|+twtY?0DaEj>FVdQ&MBb@0HuSEb^rhX literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/blue_tee_shirt.png b/resources/image/character/card_matching/general/blue_tee_shirt.png new file mode 100644 index 0000000000000000000000000000000000000000..ec5d8675591059a5ac323607c2c106087e91437d GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bK!3HEJ6o{M!Qfx`y?k)`fL2$v|<&%LToCO|{ z#Xyz9Ak4@xYmNj^kiEpy*OmPNyC|oM%30qp=|Cab%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq_xn)5S4FyJh$`v z@#E$Di&+!a&zL0`^tjV`d3vV~v#o@JTT2&<_IgX(oBS<&{j(WPY`7iq>gU(oU$@%= zR|uN92Zh<|KfBs?x9wk};{m4M22% zDg%dIRzmhxOT)HoFs_b|`F^-m?aKSNsW1222N~~UbTF)bD9>l-t#VbCVKRS%?71-W zz+>Mm&;Q*P@%T@Sl9^cL_RYEbggj5Kz5dnA=kgUjF9xkthMK3>c!M-|Z_Z}Uynood X`BhY_LcWnVDC|64{an^LB{Ts58Q!Mq literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/chinos.png b/resources/image/character/card_matching/general/chinos.png new file mode 100644 index 0000000000000000000000000000000000000000..def4c440cffa01464cd0d1c9e3c992efce02918d GIT binary patch literal 401 zcmV;C0dD?@P)P8y{+I|ZbZf{3^ab#_s~Nw83m z4l0!5kknRFKL{9gibHLvwMp#YZ@Z7j@xHqgfSs8!kC0s5E6z)GktnbQ1H|YdJ;4b8 zeS0xnV?GCfxJ4t=db5J+8X#D3>oCiP~9N@Xpyy3e23T$$?X1^@s60h=H400006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0FZ|4j)j%9t!{f03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00DDJL_t(I%bk?JO2a@H zz<<}K2c@NSh}IX7K>GyQ1fdA7ih~q%671&c>y0GEwgdR5Kc z*1!8O90U80&D6aXBS{(dk_z^Qij9(3YW)4;M*N~w)-KEJ{cfSMhiTvZKwo=34%MoPK*>yT1n+csM@8>`+( zzT`SoK!sn&cs#~1rripHU~aGTG*aJO<}aX8X9|dVsE_aMBLKD!?&jVql?txwBBex1 z$?NcBc0?=M4$HCtRCuc8a=Gw?6MDi$ij&P|Bg=6dv8YSDtKDulmSd7m%P)35ch}2! Rx0nC`002ovPDHLkV1nL$+ou2k literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/fabulous.png b/resources/image/character/card_matching/general/fabulous.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e74ddc74372cffc9435c2e947656fb1725762e GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bK!3HEJ6o{M!Qfx`y?k)`fL2$v|<&%LToCO|{ z#Xyz9Ak4@xYmNj^kiEpy*OmPNI~%XE;i{5r&lngOWjtLRLp09MowU%K#ZlsD{rz{M zj<+SgP0F~Dv^`@ZM^olT=_B|+yxo@Q!{gH%7u$3+c7*iCw%Ah&ux`I&mTKs zw!40o<=e9-f7MI-+ORkHh|hYNC-=?eK#4`%u?t=|*RELPaH-pU{fAAP8^gN3Jh&yg zgQYmODtF4lS^DpO{&SN(zD#_^2KAYqYoczyuI{$86R+HTpVeUT@1LLg&vh|IM*jU) r9T)M5{VG$%Uf-;e`-Ns%FFtZ#;z=&H6t?~e3_1o+S3j3^P6 literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/fedora.png b/resources/image/character/card_matching/general/fedora.png new file mode 100644 index 0000000000000000000000000000000000000000..99c0d093e6398828bd39ac0503c436af04b6fbee GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+h!3HE%S(j%5DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=fSr|BTkZ4dvg1G@+02lL66gHf+|;}hAeVu`xhOTU zBsE2$JhLQ2!QIn0AVn{goq>Uo+tbA{#Nu>viUafec%Q%hXX-zHlb^G8)!fq^I>$Tw zl@*yKI5Ur=GjRJHIF%^Gyt1LQk?DZPiJd#<@O?KnWNhUN*;*|5kg+V?+s;vZPsR7i zjX-cvEsst4Xx*_@H@By-$Jxc5on3A7;ZtG*>-5PJa+M>E^>{5Vo9z>D=g-`c=F3|u z@!y`AnfdS=Eq9)?D|3H8eDm5o&*+fp{hO2culH!DNJ>aZgl(%dXbFGYkbUffu~~E> zBhT3yn>Rc$IV+Ox*BKhr{Q5L`*Um1bvl8d{)*q5juy|bA-oRk9>%u`>HMO>rNsBZB zTd&`26?znLH1Q?V(VJS{j{-xdzG>+GxaarD0}UP;|3P*zZi-ITQaS1_1PU)tS3j3^ HP6X1^@s6?pbuq00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0Fc?DHDS7*Hi!i03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00BEmL_t(I%hi*=O2beT zhrer*K`@#60(QyPF<{n+;I5P4)PmsX)_2I5BGlE%2M{bBeSqTZEiR=LL6VMv#34<{ z&7W3L5PxvV&Eb6aD&0QUHS{xjS+O}3fUCXu_mOJNu) zjsu9i@^CiWdB}3P1i*D&0iXjsS{6gVn)}<~{fqjYPot;+-;!RjsybNQt8i{sSr5~> z^4{@+#si90`Qu3uJogS2_eZUy!tG7MPPZ2y*|T>R zsDsh*0`Zl8=b%y0j`UFh%bx|{Ba^(O3 N002ovPDHLkV1h4!$FKkZ literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/green_beanie.png b/resources/image/character/card_matching/general/green_beanie.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8609649b47de58c321d1856af9806ef1dab661 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bO!3HGn?$~+^NU}sMF%SeD(IAZEa{x!kTYvdf#qj!Phf{ketdf}{q{r~L`1XYb*EXHjv+TITq{|~v(Eg84?7*5dPvtFl z%R7!2GqLZn*{|z0q1s=4{fVq;H%#>Q-@NtC`m1wc{O7l=|I%mwVgKi`TI?3Xk;gkZ z8Vr}+;9OhEsI~OOCLV`H8cs16ys~?PxDFg*5Zd7|_mj>4_QLzyrR{glx>y}0VlUtR zW#2Uh8GnPn9gM3k{w!L&daI(+)@CloxOs9~ywTS4)@{v?^$WT%J^j#KU??zny85}S Ib4q9e0N%Qi2mk;8 literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/green_cap.png b/resources/image/character/card_matching/general/green_cap.png new file mode 100644 index 0000000000000000000000000000000000000000..58133ed541be62043f06c2189633ea53ebef2b1a GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp@KrG6^1|;X^rE~!)wj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&pIsosElyH)^HCKzodkO#J;+pjY|K%p4Mjrf;R2v z@&-miiy32;g*Qq~U=-fOmc%H$i!D!%uW8nUx~g5a%?onB$NhKzDr_|2+nmPf{?mMQ zc8Dm<{#R1X)+OWT`+{quRsRIxM8D0wvrl#;1wXx`-NVDf6Jffq?z?Cn=bdFc1fbP0l+XkKNhgO& literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/green_shirt.png b/resources/image/character/card_matching/general/green_shirt.png new file mode 100644 index 0000000000000000000000000000000000000000..b97fd79a6269fef9f9bc664c8a60cdf832eadf67 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bK!3HEJ6o{M!Qfx`y?k)`fL2$v|<&%LToCO|{ z#Xyz9Ak4@xYmNj^kiEpy*OmPNI~%XGY`-zvKcJ9oW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6#wPv;uxZFe(j`RC z)B~3exiPJ5ej*>lcKgOp)-Xk1Df@$AivwMFR2a)e%&%Ilez$_V^6sAUv>o5~2{t_V zYn0$$TeI}U-9240OwJMx6Bn2q`0zVP-(=1^8ze+$7cW}+M}JNHC0B-5{$-MXpNd-kWoyWP@bOkx-z@+D0TxL_ zK~yNuwUWI`!(bGKpYt`eDAFK8wMaoraS(LN1vqz97u{StIp{5T1&#$LxAYdexzx#@ zC1leQnxUVTPz?@oX=Andp@Z*s;NkF`_xl9k;qELVBQO0on#UcHJa7sFC>F>HXY&`BjZAcwC$v~V1kw(U#*(MD?41ye97j^hH*wtb1K8w~tJ*fh((pSxLo&aCcq zPyh2rlBe54Hme)a?nx&R2!eq7nL7^1aK*6=(}Qk{3oBZ{g{ nQPuezmjL3~P-|?hd;stb`BqzO;qh=o00000NkvXXu0mjf#mt}Q literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/headphones.png b/resources/image/character/card_matching/general/headphones.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7a54d7e70c1a8dc5abdc6a7f9cdf25546bb10d GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM9!3HGDBJXzsDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=fSrv?N{%b9paCc(n;8;O;+&tGo0?Ywu;$D#kwpgc&cD31jX{9HHFT=2@8Lq3M+Gl-mE=aN{5hLqB&k^>!=A6* z8t=sTBJ);%D`&&vlP$lJO{dvZ6=y!liWlx)rFFQaqHbtG&lNg#0 gGB`{*oyuUx$nhy>{>*F>El{9)y85}Sb4q9e03Zs&k^lez literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/headphones2.png b/resources/image/character/card_matching/general/headphones2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac94c8b4921d4255b38013d090742dc24be7903d GIT binary patch literal 496 zcmV5d_Mt%SQ03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00C4AK)UGS;HvH7=H{fc6rteiB9sspyEr(hNQR0-TF~Kk zx?rF#g*e1k+oWlW?{>K7j^qOH}kNex} zsWE`~^B7K}42`~2EEg^6jg~N`^^-(NBqmW~E68Q3H(DaLN7s|W^(3w*sg!Jdsi>4} zv|JV~m*x8AS;UC>d>&wocy+YF?)d|{t`h{o$fJ}R8xBC|dNNj`uItenBC}9REp~Fn zf=RJp{_j?eMUwB1?WoBee=+0MX(xG)mc1F9?CAFoJ^{qX`^)SeyPbP6*X1~lGe#_z m%ffM-5TM;|1BhC!2EaFfo^dsq_YO<|0000ibUK)v`90)^ zRE0Q>{$3>41xa$X)ub!{HoqGp0Mklw(dpzSa(j2r&i0mQt@CXJK_JdPFHXGhe!c(W iAf3maE%W2AXbqn)m|a&ao6Z6N0000{XE)7O>#0lPGhnem0XEvp$A7}-5t978NlCnrc$HVDpC*3|qd zKmXDF{q@FsDnGNWYwwKcHBeAe`XujcY}uf6R>$C2rJP(-m;EM(DXaHaHm|z*;j}m# z5VUc&hFO@Vm&+b`n=|9shfP~Gx)T1JlhHm@7k5*%XL|p`^pb`g>yxtzGZnN~?W_6i zYf%|zw}of*GynPfjc4pUx=_VmDe1_|oUpJm z3+ZJO8yg!R{@$LyZ%2qLh;S{kIGnhGK)in1*UgZ_rVSs}NEf*OOsp~Xd7S_~Yb za+622gbfu!OAZxv$x`aQ;Wd=6SL%B?^iB77?l+u!&k=ygRLH`Gmzqib>_)^(tjhoz zZP1qN14yrhU8QI|_bFf92>{3CF8gve`1m8IR;P(13ut<3j`5Wv05;R701Y{kERfxp zKvX{F`5X67weOytbk6M9XO)jNKG4Z;!HIkcmRAerdqsQzBMHAOEcaOeiNT^RZe0#z z8V0$&b14`1k^Zqbb+H+yVenS1a&k}-%~|}@xYtLoU8U{t!#^*QTx6CA_V!o<(M(H8 z-(941`z!*`9SC5UrrX#>Db>6UrIfVX=TJulUClenSzfhCI}P~{Q3^f)_~LIRqJJeG P00000NkvXXu0mjff>o=Y literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/red_beanie.png b/resources/image/character/card_matching/general/red_beanie.png new file mode 100644 index 0000000000000000000000000000000000000000..52e9e435b74007be811c4b7f900c06391d523e5e GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bO!3HGn?$~+^NU}=es+;;1)Brq^AI(fP{hFF|VPH z7hC~Oj~`yG?Kxs`@WB456Ftu?Y=5|Wg?O^V@9Z^QkE`Ds{}Cumv?(mHx0&}=es+;;1)Brq^AI(fP{hFF|VPH z7hC~Oj~`yG?Kxs`@WB456Ftu?Y=5|Wg?O^V@9Z^QkE`Ds{}Cumv?(mHx0&knIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^Q2d^!i(`n!`K^=p@-aG!wC>kdvFg=mb$KZoBBaVX)n(xm zUYo|S=Zq@R6Ca3fk-C{1qT-UY*ukkW#WZT9< z<6WB$u=5B!V*kt1&e%40k$y-{}4Mz9D)MgZc@leHX8zw`Eds#~#mk6~q4Xe(8V7 zzF#Ta6GAv&z6g4G=lGiZ?aHsO`q<>^hzozLInVI?@}HmDD{pPfy}O%v^C{Q4%#2x} PP-5_O^>bP0l+XkKs-KKp literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/red_tee_shirt.png b/resources/image/character/card_matching/general/red_tee_shirt.png new file mode 100644 index 0000000000000000000000000000000000000000..988ddab5e05b3d4050ac9de37492652b756d61f7 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bK!3HEJ6o{M!Qfx`y?k)`fL2$v|<&%LToCO|{ z#Xyz9Ak4@xYmNj^kiEpy*OmPNyA-b}f3DNCy+9$^%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq_xV)5S4F=(!l=-s;i+|4!^H=4N=~Q}$^0v{XSBMh36i4Qy}D z>m~V3<^TAu`%{7W+FX@iRf}ZzdDlI4kbnGf>&nQL70(Y)*K0-AbW|YuPgflb~av4dC8OFj6fmT%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq~J%)5S5w;`H3$-F}A+L~Q#mYh9W;tM#a~kaRplPfCK5 zhorSZ`ulK&BlGkV-Zve&w6%sYI^BO-fXZSHjx>(4ITP65M!w0uUo7wb-Kb(l=T=94 z3l*=KhS{4no#ZE;J#wqS<4v;wgI0&9yL~|evp~%$>23TAr$}-$KKS*e?9$J-e>oU7 zOl+TaedGT5@%y6qV|RyltlnI3rEF69L-+suni54{9zOA#e8Wd;``xSmyfj^u*aaIq zd{l}it8Mh0d?RMw{23lk+B$dy9W`04tIZZXobcf2sjo@ZtHt=&Z3;@u4JtpTqs8(2 zoY%~)s?R5^P{>-IboGvPy>RyDpy&`94K$qq6PZ zd%S78EcUT8Y`gg`>h-%L5)lqzr*djIkAFK;D-ftX`PwYOiSuV>u4QDfZ(^$I@=O0J P019MJS3j3^P6{XE)7O>#0XrKniwVQ+2_R!+GeaUuobz*YQ}arITm}Z`qSVBa z)D(sC%#sWRcTeAd6une-1_nkqPZ!4!i_=plZ}dBCAmZA;m@DvQ?%f%JE27QVJ~2jW zmA*aJG~q|P665{@<|S>qZ~iv;P3?-%@{WD5(pmRLR-1{MrmxrfCr7ru>#fbdXFO%W zs(G>-t_dCA$Y}8U#BHU;tL|AIx6_&K%@D<)^eNx*NMnc9+&)W}3rrT9w(Bg5?{(SU zWnr2BJp7is-i8^q|37YcXTK-ZY}<9V1hZG7{}W=xj~v(f^>stT0btvsbMA$EW*m-FsmkU-9LoV!X%7x2h*RvRIeDV3!@|))2G%TfQ^r W*R0&%zNIuTj^+_&MGVGVu`k(9mm#QwfeSs ga&~a_S}TVAfoerz+X_;)1H+5K)78&qol`;+07sRa!~g&Q literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/terminator.png b/resources/image/character/card_matching/general/terminator.png new file mode 100644 index 0000000000000000000000000000000000000000..6698bc005ac90c6e608c10ee2cef700df9e8e820 GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bK!3HEJ6o{M!Qfx`y?k)`fL2$v|<&%LToCO|{ z#Xyz9Ak4@xYmNj^kiEpy*OmPNI~xx#Z~wiMRX`!x%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq{|B)5S4FT*jTDlPte*ZBE7NydVj z9oG$m*-wfx9Fy2`&FK$Im4w0_wy13NzYVfk>JcI9uiyQ7mf8RN^xDs5qJBA7N^Lc& z1Jqu+yv*BpBP4Er-s(>~QYI~$;-qQ%zA|s-#;Wx?lSBTfajxCU!Puuajp@ZbIe)bV z!#11qj4TcU#|<66n_g+Y7S*-r!*M?^OPv>Ul5HlWN;2f$=HsqPeJ&Fyl3P)FPLPGM z;m7{{g1=b4`On|qdN2Om3uQ_5O>w@LYwY4e&)(KJ9rWksXZ9TTY*P-4?u(${@^tlc JS?83{1OU;&oC^Q| literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/general/vneck.png b/resources/image/character/card_matching/general/vneck.png new file mode 100644 index 0000000000000000000000000000000000000000..3db9048e5c47ec83642f2999652efbbefe542ecf GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bK!3HEJ6o{M!Qfx`y?k)`fL2$v|<&%LToCO|{ z#Xyz9Ak4@xYmNj^kiEpy*OmPNI~%tsN5zB9nm{4h%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dDE`RP#W6(Vd~!-cLPCMD;Lr07%r(FG7W&839zN0Guegg% zjZKJw+s-rpzkx;d&#q8`qnD)?eVp~<*<*jUwhjZfW7g51ICuR#dwl+kyl=WU4>t7s zPdX_f=VF#y+|T~+f?x zq=baTrTa@4X}CQ4fBaQi39p9So#n>;jX-elrI(POt8qyA#Ca1=c$Zdf-|+hP&!^JN z&00Yg$Dhq>|1A;xF%)FOvCz-S8?2K*rZ~IJIVX@7*P+NL{@A^Pks;`u*FxRT$LD~8 N!PC{xWt~$(69AjMjamQz literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/holiday/america.png b/resources/image/character/card_matching/holiday/america.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5ef24d2ae52986674c54dfc7ae602f092ddb72 GIT binary patch literal 538 zcmV+#0_FXQP)UFTR|MhKlga>Vnc_J5(yY-Xs}D5u{NWMw2MPUD8){lnocebSrmsZ-K2|C zqz>Ycw>_vJsNnL3U=);!MF)!|Hl#@rl?W!1>ritV^Grg1aNPawK40$l``sV7w#vzl z%!h)~sh{=xGKV?j&*o>kd~R zn-i^scKE~)Dkp$IG)^Uxk^tN8j1okOT>xATmPH|%x+z2;8YlelxhlrOuSvXVi@(uP z-gkcnAXl)-$y0IsebM>Cdec@--|&{7ogXEf=!1J0N_>MumX(7GtS{H zPaLu_RZ?P8Gg#YN#?%aQ1seeS?GcF&7q#k6pN~d=gvaA)o|EQzCYmPKA94Z6Tdl_L c4Y(Bh4=#SL_DV4xod5s;07*qoM6N<$f(fbRrvLx| literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/holiday/halloween.png b/resources/image/character/card_matching/holiday/halloween.png new file mode 100644 index 0000000000000000000000000000000000000000..261748f05da3f57a51c89411234767da314a18db GIT binary patch literal 453 zcmV;$0XqJPP)!FSTSaemI;)RhBJX_t%cb^odKk|GJs66o<-VaG{f(I*59= zV*cruy8|M%tXw^-4U$_saR8pvIRJ`RKAwyXb97oDz;Z7novMB}ix~4Qq3gQyo%5B9 v4w(RKI(xNLmxL@Yq@00000NkvXXu0mjf{z$Fdh=fJ2JULbchEV;xXPHZvrm#5q4VH#M&W$Yo$~E=o-- zNlj5G&n(GMaQE~LNYP7WXJBBI@N{tuu{fQa;K01!T>kg@23DK-TbP{ZaL#rsVNR$i zVV-fp_jmT9wzElW2Lr^}_LxoP(ztY{$@|gwXURuy`}8E0luDQx&)>p$mH>*1|EsdlYJ*XYR?ou*m3pzy!V?WKi(Aix3*a@yJ4q}QOXTH3(jUHJW99L7!tx0xTA6~XP!=d#Wzp$P!p`>dq^ literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/holiday/patrick.png b/resources/image/character/card_matching/holiday/patrick.png new file mode 100644 index 0000000000000000000000000000000000000000..6a53282a41bfbb7d5fd35ef18bb54d1cb1cad431 GIT binary patch literal 516 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 literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/sports/gym.png b/resources/image/character/card_matching/sports/gym.png new file mode 100644 index 0000000000000000000000000000000000000000..87452aba14a8e20fd27fbc14a9888b6fdd32cc83 GIT binary patch literal 14951 zcmeI3eQXnD9LJvlPS`+DrejFtEJHES-Sur-&$c+$&5h78Mv+Yu*zJ1VF0^-D@3wXe z1OkNcA_0dih$a{kL`@t-n2M-G4a$26FU~gvK~W?+rXu3|b8Xi?>pC7V{P{F#@3-gq zet*B`KF`bUpIcQ~@%V_0u^9k>5#?phDtOI--?2l};qSCX*N(!=us~Uj0zl?y?VAQR zzc2=X!d%f^tya5cu)OTg<2-VmkQep`pc(+%)Np{~7YHgX~sw!je4liD=m`Bh4qp$A)2H& zk5f?ipcqg^S)#POT%Fvc+I2duQ2Z0SFMl9jNK#_#AVoUN1!zMaL#Hx%__!y~6!b-g z=HY3XRX|OeD@q=C^!$vF)9S`JGgngdZL=Yadi!>Qa&WkIz_9uLoY<)EKa9ipGB7wCXg zZ=(~9h%&ya*kaiy2jQ>;hsj2#YDQd1#?EO;D42tli<9vul z8~v@8NRg&rsWMT4>$3$}w{Z1F&a&A;W8c=^4xbn~lLA~&5wsm=*Y$3>_#qZQqcl%s z=dv8Hon{VR+YkZ-+^01$thh5~6aVi7M)M=~fop^s1nEW_Dw-;y8aRm}d({vZ6pHHM znz)(09?ja^l+B*1q%8yJGv#r%gN5ShyD8xVXq17;JREwnXKqzFM18 zUsFV1U}WHjHfX;wE83lGt+}xk?M}8PoO2{mbr@sSl9~~hcJfA#h1u{SL2%?-EGCPM zPHs+iRElB2SM3zx{#CS9Y3%hRcce7dAjbSyv4|1rh#8|(h5S2@%w)6`J}kiJ6gvK( z(sz>M8{swwi95Q@iP3bV2ucGR6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL z2`(%mR6uZ{G_Wzjg++u42riTcHYT{Rh)@B+h0?&r1Q!+&Dj>K}8rYcN!XiQi1Q$vJ z8xveuM5ut^LTO-Qf(wfX6%bq~4QxzsVG*GMf(xaAjR`I+B2++dp){~D!G%SH3J5Ng z1~w+Ru!v9r!G+Sm#sn7@5h@_KP#V~n;KCw81q2sL0~-@uSVX9R;6iC&V}c8d2o(@q zC=F~(aA6Ul0)h*rfsJp7DB6s-nZ=SHv{Gc++zV7&{J0@H@f9}Lokl8VO zIDKf)vgi5irwdp9lRi3q#Dk5^UHc1jMwbqrwW1<-?J91P_+-uUyZk?oo4!`RX!pVc z=gT+$`qdlVUn*z!UTbGQy3$ovJNVO~!+NAi+kA!Nwsu{9W={4|@2(?_;{dgK>s!+& zZ98H<+BtdWlr`mT%X7CqThqROQP1v`2R1Zb9n$efPxwe%(e^2a-z$08plcTvQ)i^E zYqlJBm1zdLK>p?BPApyx!1?+fqYQCH7) z=4`o8xXHT`Jht_WG#CsiqLxzYE$!(&_ww6MUf&a5KmD~m&10%w$uhe#cl`d{^B+EU z>XnhF_xyJ1WANClte0QSm^0_h$$Lv*-@Bn`*Sy+aP7NvFe05Of7vtwYHEhj+taUqI zJ6kF(^mY&W=ouzC?#eF4X(&iqNzkmA}IQQdEzKfqdam-cY*z)k?&emC3 z2OG@OI!;`Oy$V`hQsL~FR=e~+D9mta literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/sports/hockey.png b/resources/image/character/card_matching/sports/hockey.png new file mode 100644 index 0000000000000000000000000000000000000000..1120c3bfb64a8da2174e9bb7e9864554717669db GIT binary patch literal 426 zcmV;b0agBqP);!ytEPrn(eNQnR#khZIav!5PnB`-EfH2`N0U|?YQPokdx$b5{f z@#f7NoCb=Bh%h3nJ3BX!!M*%2BUW!B8}#pxG9t?D?!x8W3!cCY#v7Xq3=9n4zkg@o zGmdi9Edfq{V$osZ8j02woH UgDA-Id;kCd07*qoM6N<$f*Y5s4FCWD literal 0 HcmV?d00001 diff --git a/resources/image/character/card_matching/sports/soccer.png b/resources/image/character/card_matching/sports/soccer.png new file mode 100644 index 0000000000000000000000000000000000000000..81ca94916d3a6b9402011b7d2ba1ba22ebbc2bd2 GIT binary patch literal 440 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 literal 0 HcmV?d00001 diff --git a/resources/image/ui/card_front.png b/resources/image/ui/card_front.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cadc0534b7b04cdaa28c35c507b9d698b168d6 GIT binary patch literal 5086 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 literal 0 HcmV?d00001 diff --git a/resources/image/ui/card_selected.png b/resources/image/ui/card_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..fb89aac9756d61c726e4a2bdec79e78ee2375fcd GIT binary patch literal 5420 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

pT`BSTbEFl?dtA?z4QlCZpsq^uy zqT4$@t*2@%aI^69=uDk__fu@>Mn@f5(VNApCE|YUzOm}c`rJ0{SC3-M$gb@hR9Yda zK3?&yX5^5FjFkO)F)sTK$|PtIZI_G%IYrSGEU(?+&LJz7gwFNuPp5x-5{YMQlh<;2 zX=iq8q1q%j%~PBiy$O-<5=ktQL&Mz+=Xy3fBQy?SZCx4Fsks}50jo=%iwaMih|aco zU1Yl51Ked&$81|rhxp6S3o?E>h|D>kKWeFMWMN1i0rQ7C+AVzHX~TQ%T^?;dw2;YS6g9)~W7x z;+PWu%QU?g^XUwPOd~H47s;zjt4YCn&p6+=&#)Df_E+3*`rN+6qZ|@06@5r6I8br_ z>3WEPEG5o>qjz&>oEWAz7ALNMAW$^VaDX$|9bN z|DUD)qpE*p`)7~-OSHHar2nr5uZVLkCs7(lDvJxVMM<=|3?%bdV5NJEK&orLhiJG@ zsw@6kTV>NDl>C#hRZpBAD|TCad+V}ZnI(zDtk={w3OYHDD2HL}Lb#&B9ky4)n_dsY zhm{QJk?QnQcV5eOV<~25RgldFbWXZMAI1nIt!#}YnRjh&+bd$_uo0^tO++ivB@C9` zo4E2*VE(VyYz1;$f2jj?*S?1)*zhEqj#lAv+Pgjc*Vt$F7j|6%jD$>E8%e|%tbDM_ zw$?hUmN6^|)&_!;=?;Ekhk)nh+kLD`pk2nOV+rCc`HEk)G-*6qOO?mY2dZRl)k)Hy z9kZ80*sEH3pdF%(#VlUxEPh1YR6oh0#GaSi3<)8 zIWv6XWNPV?>o;wjsER$0%0(2`Q?9+XT)eAvSChl&fVy8qe~#^r)xJRfyCT zu2BgnUkq?Xa;uJZMW3rQzRTl(IV$IK)>N7;o-_D?kb#kHnE0$yN4-UI7%dZzGKTx% zpWQ@7m8TpTZx&VGqpu%HO+KMl2<&+od&i4{i&?!#ej9V_x$!;A5^-eUvAptj*$(rB zLSTknGJoyU)*A(Eyi{>D(FQS{$s?97=r@LK;T#NM=a?oH2=CCe?1t-OKYOCelu2~2 z%!Yo&Cq;#A1r1qKM~?%^-W+yQhu&xTMV`HXr+nz;Tv@K0AVMYOSXAY7U{c|~UXdR4 zEIUuC0O~bJW$)JfU?-F3C=(@kqsKvb5xxGS_{z1;#`j~a#>Ilnl)jYD#p;58WW9yu zypIrL)p4EI)GqH@;4;GZDBd-_d0WM0{a{O*)bHpPDgq6;TLl|jA1~fL#`ut}VCSr- z%{L$Orj3f)xT*NGnE9<#f}2Gj>4Nhdvzf=)d}`KqR~nCKTWK4pQ3CNhup7j0o!`%7 zDUR9}9EE@B_gmZHA;Ma-?2Kzz`PWj%`_;@bnr1==fgJ%FW)~vaeElZ5Cte!;7mupj zeET%|1h0MO7sRl%^GM9Xks++*ukpHpDPyUae0k9sY7Rpl_mqb;Vkf}`+P1QBQ;u6T zc{FqHdeC;cpm*lTrGYJOx7=xFyvgP$^Rv$W!GP(c76 this.highscore) { + this.highscore = this.score; + this.highscoreText.text = this.highscore; + + showStageNotice("!!! 최고 점수 갱신 !!!"); + } + }, + + + resetOpenedCard() { + var card1 = this.cards[openCardInfoIndex[0]]; + if(card1 == null) + return; + this.resetOpenCardInfo(card1.getColumnNo(), card1.getRowNo()); + card1.flipToBack(); + + var card2 = this.cards[openCardInfoIndex[1]]; + if(card2 == null) + return; + this.resetOpenCardInfo(card2.getColumnNo(), card2.getRowNo()); + card2.flipToBack(); + + }, + + resetOpenedTwoCards() { + var resetOpenedCardTimeEvent = game.time.events.add(Phaser.Timer.SECOND * 0.5, this.resetOpenedCard, this); + this.gameTimeEvents[gameTimeEvents.length + 1] = resetOpenedCardTimeEvent; + }, + + + + setOpenCardInfo(col, row) { + var cardIndex = this.getCardIndex(col, row); + + for(var i = 0; i < 2; i++) { + if(openCardInfoIndex[i] < 0) { + this.openCardInfoIndex[i] = this.cards[cardIndex].getCardIndex(); + this.openCardInfoCharacter[i] = this.cards[cardIndex].getCharacter(); + + break; + } + } + }, + + resetOpenCardInfo(col, row) { + var cardIndex = this.getCardIndex(col, row); + + for(var i = 0; i < 2; i++) { + if(this.openCardInfoIndex[i] == cardIndex) { + this.openCardInfoIndex[i] = -1; + this.openCardInfoCharacter[i] = -1; + } + } + }, + + isOpenedCard(col, row) { + var cardIndex = this.getCardIndex(col, row); + for(var i = 0; i < 2; i++) { + if(this.openCardInfoIndex[i] == cardIndex) + return true; + } + + return false; + }, + + + + + isSelectedBefore(col, row) { + if(this.selectedCardCol == col && this.selectedCardRow == row) + return true; + + return false; + }, + + getCardIndex(col, row) { + return index = row * MAX_CARD_COLUMN_NO + col; + }, + + isFrontCard(col, row) { + return this.cards[getCardIndex(col, row)].isFront(); + }, + + flipToFront(col, row) { + var index = row * MAX_CARD_COLUMN_NO + col; + this.cards[getCardIndex(col, row)].flipToFront(); + }, + + flipToBack(col, row) { + this.cards[getCardIndex(col, row)].flipToBack(); + }, + + clearCards(col, row) { + var index = getCardIndex(col, row); + this.cards[index].hide(); + index = this.selectedCardRow * DudeCard.MAX_CARD_COLUMN_NO + this.selectedCardCol; + this.cards[index].hide(); + }, + + resetCards(col, row) { + var index = this.getCardIndex(col, row); + this.cards[index].show(col, row); + index = this.selectedCardRow * DudeCard.MAX_CARD_COLUMN_NO + this.selectedCardCol; + this.cards[index].hide(this.selectedCardCol, this.selectedCardRow); + }, + + showSelectedCard(col, row) { + this.isCardSelected = true; + + var index = this.getCardIndex(col, row); + this.card_selected_edge.x = this.cards[index].x; + this.card_selected_edge.y = this.cards[index].y; + + this.card_selected_edge.alpha = 1; + }, +*/ + + hideSelectedCard() { + this.isCardSelected = false; + + this.card_selected_edge.x = -100; + this.card_selected_edge.y = -100; + + this.card_selected_edge.alpha = 0; + } + + + + +/* + back: function() { + sessionStorageManager.resetPlayingAppData(); + location.href = '../../web/client/menu_app.html'; + }, + + initListeners: function() { + }, + + countDown() { + const style = { font: "bold 200px Arial", fill: "#fff", boundsAlignH: "center", boundsAlignV: "middle" }; + this.countDownText = game.add.text(0, 0, "", style); + this.countDownText.setTextBounds(0, 0, game.world.width, game.world.height); + this.countDownText.stroke = "#333"; + this.countDownText.strokeThickness = 50; + + this.countDownNumber = 3; + if(isDebugMode()) + this.countDownNumber = 1; + this.tweenCountDown(); + } + + tweenCountDown() { + if(this.countDownNumber === 0) { + this.startGame(); + return; + } + + this.countDownText.text = this.countDownNumber.toString(); + this.countDownText.alpha = 1; + + var countDownTween = game.add.tween(this.countDownText); + countDownTween.to( { alpha: 0 }, 1000, Phaser.Easing.Linear.None, true); + countDownTween.onComplete.add(this.tweenCountDown, this); + + this.countDownNumber--; + } + + startGame: function() { + // activate first alien + this.alienTimer.start(); + }, + + gameOver: function() { + this.alienTimer.stop(); + + var gameOverText = new GameOverText(); + + game.time.events.add(Phaser.Timer.SECOND * 2, this.goResult, this); + }, + + goResult: function() { + location.href = '../../web/client/result.html'; + }, + + activateNextAlien: function() { + this.alienTimer.next(); + }, + + getScore: function() { + return (this.alienTimer.activatedAlienIndex) * 2; + }, + + onAlienEscaped: function() { + heartManager.breakHearts(1); + } + +*/ +} + +Game.GAME_OVER_WAIT_TIME_MS = 2000; \ No newline at end of file diff --git a/src/game/mouse/card_matching/loading.js b/src/game/mouse/card_matching/loading.js new file mode 100644 index 0000000..31d3e39 --- /dev/null +++ b/src/game/mouse/card_matching/loading.js @@ -0,0 +1,111 @@ +var Loading = { + + preload: function() { + // game.load.image('loadingbar', './image/phaser.png'); + }, + + create: function() { + // let userID = sessionStorage.getItem("UserID"); + // console.log("userID : " + userID); + + // game.stage.backgroundColor = '#4d4d4d'; + + // // Progress report + // this.textProgress = game.add.text(game.world.centerX, 100, '로딩중 . . .', textStyleBasic); + // this.textProgress.anchor.setTo(0.5, 0.4); + // this.textProgress.setShadow(3, 3, 'rgba(0, 0, 0, 0.5)', 2); + + // // Preload bar + // this.preloadBar = this.add.sprite(game.world.centerX, game.world.centerY, 'loadingbar'); + // this.preloadBar.anchor.setTo(0.5); + // this.preloadBar.alpha = 0; + + game.load.onFileComplete.add(this.fileComplete, this); + game.load.onLoadComplete.add(this.loadComplete, this); + + this.startLoading(); + }, + + startLoading: function() { + game.load.image('icon_fullscreen', '../../../resources/image/icon/fullscreen_white.png'); + + // card + game.load.image('card_back', '../../../resources/image/ui/card_back.png'); + game.load.image('card_front', '../../../resources/image/ui/card_front.png'); + game.load.image('card_edge', '../../../resources/image/ui/card_selected.png'); + + // card character + game.load.image('commoner', '../../../resources/image/character/card_matching/fantasy/commoner.png'); + game.load.image('elf', '../../../resources/image/character/card_matching/fantasy/elf.png'); + game.load.image('knight', '../../../resources/image/character/card_matching/fantasy/knight.png'); + game.load.image('orc', '../../../resources/image/character/card_matching/fantasy/orc.png'); + game.load.image('wizard', '../../../resources/image/character/card_matching/fantasy/wizard.png'); + + game.load.image('halloween', '../../../resources/image/character/card_matching/holiday/halloween.png'); + game.load.image('holiday_bunny', '../../../resources/image/character/card_matching/holiday/holiday_bunny.png'); + game.load.image('patrick', '../../../resources/image/character/card_matching/holiday/patrick.png'); + game.load.image('santa', '../../../resources/image/character/card_matching/holiday/santa.png'); + + game.load.image('basketball', '../../../resources/image/character/card_matching/sports/basketball.png'); + game.load.image('football', '../../../resources/image/character/card_matching/sports/football.png'); + game.load.image('gym', '../../../resources/image/character/card_matching/sports/gym.png'); + game.load.image('hockey', '../../../resources/image/character/card_matching/sports/hockey.png'); + game.load.image('soccer', '../../../resources/image/character/card_matching/sports/soccer.png'); + + // game.load.image('a', '../../../resources/image/icon/fullscreen_white.png'); + // game.load.image('b', '../../../resources/image/icon/fullscreen_white.png'); + // game.load.image('c', '../../../resources/image/icon/fullscreen_white.png'); + // game.load.image('d', '../../../resources/image/icon/fullscreen_white.png'); + // game.load.image('a', './image/phaser.png'); + // game.load.image('b', './image/phaser.png'); + // game.load.image('c', './image/phaser.png'); + // game.load.image('d', './image/phaser.png'); + // game.load.image('e', './image/phaser.png'); + // game.load.image('g', './image/phaser.png'); + // game.load.image('e', './image/phaser.png'); + // game.load.image('f', './image/phaser.png'); + // game.load.image('g', './image/phaser.png'); + // game.load.image('h', './image/phaser.png'); + + // game.load.image('phaser', './image/phaser.png'); + // game.load.spritesheet('button', './image/button_basic.png', 200, 100); + // game.load.image('star', './image/star_particle.png'); + // game.load.image('medal_gold', './image/medal_gold.png'); + // game.load.image('medal_silver', './image/medal_silver.png'); + // game.load.image('medal_bronze', './image/medal_bronze.png'); + + game.load.start(); + }, + + fileComplete: function(progress, cacheKey, success, totalLoaded, totalFiles) { + // this.preloadBar.alpha = progress / 100; + + // console.log('progress : ' + progress); + + // text.setText("File Complete: " + progress + "% - " + totalLoaded + " out of " + totalFiles); + + // var newImage = game.add.image(x, y, cacheKey); + // newImage.scale.set(0.3); + + // x += newImage.width + 20; + // if (x > 700) + // { + // x = 32; + // y += 332; + // } + }, + + loadComplete: function(progress, cacheKey, success, totalLoaded, totalFiles) { + // this.preloadBar.alpha = 1; + + if(isDebugMode()) { + this.state.start('Game'); + return; + } + + this.state.start('Game'); + // this.startMenu(); + // this.startTypingTestStage(); + // this.startTypingTestResult(); + } +} diff --git a/src/game/mouse/card_matching/main.js b/src/game/mouse/card_matching/main.js new file mode 100644 index 0000000..de61318 --- /dev/null +++ b/src/game/mouse/card_matching/main.js @@ -0,0 +1,16 @@ +///////////////////////////// +// Main game + +const CONTENT_ID = "Card Matching"; + +let game = new Phaser.Game( + GAME_SCREEN_SIZE.x, GAME_SCREEN_SIZE.y, + Phaser.CANVAS, CONTENT_ID, + this, false, false +); + +game.state.add('Loading', Loading); +game.state.start('Loading'); + +game.state.add('Game', Game); +// game.state.add('Menu', Menu); diff --git a/src/game/mouse/card_matching/plus_score.js b/src/game/mouse/card_matching/plus_score.js new file mode 100644 index 0000000..97b3188 --- /dev/null +++ b/src/game/mouse/card_matching/plus_score.js @@ -0,0 +1,45 @@ +///////////////////////////// +// PlusScore Class + +PlusScore = function(backupX, backupY, scoreValue) { + var textStyle = { font: "normal 24px Arial", fill: "#ff0", boundsAlignH: "center", boundsAlignV: "middle" }; + + Phaser.Text.call(this, game, backupX, backupY, "+" + scoreValue); + + this.anchor.set(0.5); + // console.log(this); + // this.addColor("#ffffff", 0); + // this.setStyle(textStyle); + + var grd = this.context.createLinearGradient(0, 0, 0, this.height); + grd.addColorStop(0, '#8ED6FF'); + grd.addColorStop(1, '#004CB3'); + this.fill = grd; + + // this.setShadow(3, 3, 'rgba(0, 0, 0, 0.5)', 2); + this.stroke = '#fff'; + this.strokeThickness = 5; + // this.addStrokeColor('#f00', 13); + + this.inputEnabled = false; + game.time.events.add(Phaser.Timer.SECOND * 1, this.fadePlusScore, this); + game.time.events.add(Phaser.Timer.SECOND * 2, this.destroySelf, this); + + game.add.existing(this); +} + +PlusScore.prototype = Object.create(Phaser.Text.prototype); +PlusScore.prototype.constructor = PlusScore; +PlusScore.prototype.update = function() { + this.y -= 0.3; +} + +PlusScore.prototype.fadePlusScore = function() { + game.add.tween(this).to( { alpha: 0 }, 1000, Phaser.Easing.Linear.None, true); +} + +PlusScore.prototype.destroySelf = function() { + this.destroy(); +} + + diff --git a/src/game/mouse/card_matching/text_animation.js b/src/game/mouse/card_matching/text_animation.js new file mode 100644 index 0000000..3c85057 --- /dev/null +++ b/src/game/mouse/card_matching/text_animation.js @@ -0,0 +1,4 @@ +function animateTextAlpha(targetText, startAlpha, endAlpha, msTime, effectType) { + targetText.alpha = startAlpha; + game.add.tween(targetText).to({alpha: endAlpha}, msTime, effectType, true); +} \ No newline at end of file diff --git a/src/web/client/card_matching.html b/src/web/client/card_matching.html new file mode 100644 index 0000000..44a9505 --- /dev/null +++ b/src/web/client/card_matching.html @@ -0,0 +1,61 @@ + + + + + Card matching + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + \ No newline at end of file