From 24b84a73e716f8252f8857f8f87a548dea9ff319 Mon Sep 17 00:00:00 2001 From: Jens Date: Fri, 20 Feb 2026 16:16:57 +0100 Subject: [PATCH] poc --- bun.lock | 8 ++ index.html | 23 +++-- package.json | 2 + public/sprites/bubble.aseprite | Bin 0 -> 616 bytes public/sprites/bubble.png | Bin 0 -> 578 bytes public/sprites/card.aseprite | Bin 0 -> 536 bytes public/sprites/card.png | Bin 0 -> 375 bytes public/sprites/dead.aseprite | Bin 0 -> 728 bytes public/sprites/dead.png | Bin 0 -> 589 bytes public/sprites/octo.aseprite | Bin 0 -> 1154 bytes public/sprites/octo.png | Bin 0 -> 606 bytes public/sprites/triboi.aseprite | Bin 0 -> 711 bytes public/sprites/triboi.png | Bin 0 -> 559 bytes public/sprites/wolfi.aseprite | Bin 0 -> 711 bytes public/sprites/wolfi.png | Bin 0 -> 546 bytes src/card.ts | 101 +++++++++++++++++++++ src/constants.ts | 2 + src/main.ts | 157 +++++++++++++++++++++++++++++++-- tsconfig.json | 1 + 19 files changed, 279 insertions(+), 15 deletions(-) create mode 100644 public/sprites/bubble.aseprite create mode 100644 public/sprites/bubble.png create mode 100644 public/sprites/card.aseprite create mode 100644 public/sprites/card.png create mode 100644 public/sprites/dead.aseprite create mode 100644 public/sprites/dead.png create mode 100644 public/sprites/octo.aseprite create mode 100644 public/sprites/octo.png create mode 100644 public/sprites/triboi.aseprite create mode 100644 public/sprites/triboi.png create mode 100644 public/sprites/wolfi.aseprite create mode 100644 public/sprites/wolfi.png create mode 100644 src/card.ts create mode 100644 src/constants.ts create mode 100644 tsconfig.json diff --git a/bun.lock b/bun.lock index 6985f85..eb12839 100644 --- a/bun.lock +++ b/bun.lock @@ -5,9 +5,11 @@ "": { "name": "scrumFun", "dependencies": { + "@kaplayjs/crew": "^2.1.0", "kaplay": "^4000.0.0-alpha.26", }, "devDependencies": { + "@tsconfig/bun": "^1.0.10", "@types/node": "^25.3.0", "vite": "^7.3.1", }, @@ -66,6 +68,8 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "@kaplayjs/crew": ["@kaplayjs/crew@2.1.0", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-kkRQTppRCfg7Lr3eclMluENopqHEde67zyWATYoMYNyw0FF1ReGpDBcXPH4zBQcOQ+qhM+pPRPyoT2FBtIZucw=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.57.1", "", { "os": "android", "cpu": "arm" }, "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.57.1", "", { "os": "android", "cpu": "arm64" }, "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w=="], @@ -116,6 +120,8 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA=="], + "@tsconfig/bun": ["@tsconfig/bun@1.0.10", "", {}, "sha512-5AV5YknQjNyoYzZ/8NG0dawqew/wH+x7ANiCfCIn29qo0cdbd1EryvFD1k5NSZWLBMOI/fGqMIaxi58GPIP9Cg=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="], @@ -142,6 +148,8 @@ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], diff --git a/index.html b/index.html index 5290a94..12d000c 100644 --- a/index.html +++ b/index.html @@ -1,9 +1,16 @@ - + - -scrumFun - - - - - \ No newline at end of file + + Scrum FUN (TM) + + + + + + + + diff --git a/package.json b/package.json index 07a26c8..efc393b 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,11 @@ "zip": "bun run build && mkdir -p dist && zip -r dist/game.zip dist -x \"**/.DS_Store\"" }, "dependencies": { + "@kaplayjs/crew": "^2.1.0", "kaplay": "^4000.0.0-alpha.26" }, "devDependencies": { + "@tsconfig/bun": "^1.0.10", "@types/node": "^25.3.0", "vite": "^7.3.1" } diff --git a/public/sprites/bubble.aseprite b/public/sprites/bubble.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..1c73d0033d934090f3a863f849eb75fa8e4f5c7d GIT binary patch literal 616 zcmc~`Vqkc%l##&!2o)F@85kH+fEWRQVjw{V0U)FWcmXv1*GCqxtt>zb#DJJx0c<6b zby+|*3&?c}(aTD+Pv)$?oAT#<@BbZ@uac6^IK?g2h$s~gv*dJ7ln87$4P6!*f3mpv z)4G}e4}W^sfBH(^=61Ulc>ygigP`h=hGnhuZ|*(u|NsAWkN)>=|DW6Nt0nbKv+t2w z-35LUHS!>v6qu3h{tslcGx#J{rWPp}Spwa_s=&a&40OzYV9-H;IfE@j#hka-ck>=L z;BgJ?pTK)5{r_K~6$%p$Ez{__&mMaqRYC5=rn#>_z5n~G=KZ>crDv;*Dq`oR_Zy|1 zfB$lG#Qaq$m!)hzZ%IwxSU$6Qb5``%(2_vweW&!iUcXL|&a9D*5!sYml5;$4ZSwBz zq2Fbr{qJx5`X%zF)-RK7e0FE+8};_ZN ze@OLXrG#>>(EO!_m$qizDRg^(voA2~Y29nf%~So0D`zgrE-72P=IX_zvBtNIqsz85|^Dh{nu%bvA!Ud_#7?@4c@C;1k|r=8dJee^m@I(1LAlJmCSfY|>FckOE3#lPY? n``4ZAf6hJHXF4Hw#r;5z-)2s>`68>jok{~e*2(AYj{ODzcaYZK literal 0 HcmV?d00001 diff --git a/public/sprites/bubble.png b/public/sprites/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..87db173c5a79f6f7aadc90991afdea49ff91c86c GIT binary patch literal 578 zcmV-I0=@l-P)Px${7FPXRCt{2Tg!C=Aq-UVQh-x|bGG|0#W_0_I2|}A{MHF98i9mRn4A6fBMpNP zNK5q3@nZeLJQ?5>Rqf3sM5b1Xw%B1xkd70I$v`ASAr%no`E~cA@L- zGV1jYzzRS|-@?g{_w&ugxcX~*V0&NN?1(?RQ}XE5!wrm9@LP7N^x{VaFmQbX{ExoxZp_*sx^7exqL50 zNXug;O$pp8jg$jQq<3L;Zz`D*kaMhLfJJ=~sSc~9!Zky*h%o68A;1BSLA}V3 z^a+`?$e@NH&u{H6>((KX0+ysgI}%+Ip>4GGS~M*|r9omQ5}FC{l-5eH4n@%$BAo}4 zWvgtsRluu5D4Lz%D8VyX-3;^g9l!z;@NO;Ih>G^?kx2OCNY8EV40v)P%G!>gng@9K zvO^2(L?|i=RRU6uKWnaEgE$CMkQg97x{lyHNfIFnzb#DJJx0c<6b zby+|*3&?c}(aTD+Pv)$?oAT#<@BbZ@uac6^IK?g2h$s~gv*dJ7ln87$4P6!*f3mpv z)4G}e4}W^sfBH(^=61Ulc>ygigP`h=hGnhuZ|*(u|NsAWkN)>=|DW6Nt0nbKv+t2w z-35LUHS!>v6qu3h{tslcGx#J{rWPp}z65eu6&Qd{VPyCZ3_1viV~As@nDh3+M&3gK zA}j~PnHCxsi95T#yL-%*K|b^OlC%EC#-D56EU&w6Fn!B{>t!#v3!lezS$_|@vvc~R rb9+U~-!0uytbcTFwdT7!-UA`^|8ndkySsa~|8ib?`w!E{#;Y>`n%lVQ literal 0 HcmV?d00001 diff --git a/public/sprites/card.png b/public/sprites/card.png new file mode 100644 index 0000000000000000000000000000000000000000..4aaa6413315f69f024b83bcd0aadc6957a6f1a46 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D%z4Lw~PLn`LH zy}YoH*-*gYV(>AA3$in2FPSd#D$b`bo}K-yOo;}Y;z#CR{F!AeWnbJ+3uVc)pZ@u4 z%jz?!x36!MVXUf2zJ2}U!s#<&88=*B{qXwp@4wAw9{5}M+w?Vi0_y>;22loWhA@UT z3=xbQmZ~Eu2nc*`}Z(IME|N5u?g-k!UKbZs! ONd`|>KbLh*2~7a2#C&W3 literal 0 HcmV?d00001 diff --git a/public/sprites/dead.aseprite b/public/sprites/dead.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..d3b561726b0f6ed99847dbb3639377b666edabe6 GIT binary patch literal 728 zcmcb?#K7=iDIygigP`h=hGnhuZ|*(u|NsAWkN)>=|DW6Nt0nbKv+t2w z-35LUHS!>v6qu3hjs&vV8GI5eQ;QS~F{S?_NgIU#IjjmGx2iDw2l@;G)ET%LD&{07 zD9D}Q&iK1rWO9P6?_EdV@0Tvy9@$mA;BNEjUgo!Lfi^{tN)4WM9t@i&@K~;D$8?e3 z3}&;=uP_68n-v%$%nVFOW@<5L0L^@R;~?)L10L23eFxa?NH#m(Xpohd(7B_b-awN_Vubxk)6dzE%x>S_O+6^6UTuC93|6}kFc&ic^z?sGi+jY=h-XWW@J z+4l2{=gzM}=0?U|pD}T=?CYXMukT%*?bWa3SEhGy*55r_4Lkf|2oc9s!aK} z=8EI*!&BW$H&w5(o}S%*cGl@tf-4`tJA0zgKK|au@aM6x)<$d*n06F697782|EA) literal 0 HcmV?d00001 diff --git a/public/sprites/dead.png b/public/sprites/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..5702efe8d3fa0cbd91a887f6c5c803d4e221e665 GIT binary patch literal 589 zcmV-T0Px%2T4RhRA_>n-{s17w=!go2m> zdK;%gAWQ(L`Stb;#~gPH^_dn344|2}nC7H`NDvS}%Y4*$triFep#n(evyD?p5NQBj z^OG^OJqJ=l+_wT~=EvOvO2XO<*TxcyN_+!|dF0-7oiiuhYxPsAx9}hVSS5|#xLb%* z#xvrz*eR4b@1yOtcFi1U1wjqb=a4p5Pzb==Sp*!_6#!Z;cvlT1u0^gl;8{8?Z7mQg zK<^qSs!$G4t+!`al12yUY9p(2KwHDP``ku`NQzm%MY@r>0W5}US!1>UE_ULqZ(G{D zw-j|+th5|JJM=y)sRQI`dTj(*XO7Bi~T$T1?77vSaR&pqU#lgz&l5aW{O1RBaW#4C4`OJdDD zr(Qq<{lGzF?Zg9f%?riF64kSmFd6a6n**~8&H<|503sQmWcihHHWr_rLiDoI?2|dG@232D-}`?@<*THmGfr`fH6lvI!z?-76D0!MO+%N3#-A)M z{{F{4E{Qv)d-J}1#+yCb_{Ax*k)9ibs zR(FA)M2$SiCIx0ByM2Ldb_Sos%G4qSBTVW4NYaKOKn|+{$gL_2|A9V(0Cfg#hKf1K z2?}y2xHJAP7nz(O>wDMH_xq*GwnugqFSy%$x|jKFTcAzRqf&!sod?6_2|Sjo+A&?^ zH-p)%^DDxE-ev`c2qObCl9@UT+CVeUPCqT!Y{289sVMtoo>7p;tg}k@tU;wvoAlypFLr)+@$Y)eum!W)$b#^%FWad*N0yd zdEYhf?N6mODg&ZF0H7w_N3{ zyWesxZ`rAC%( z_iVp3=Y+jx)|#?K>HXhkb(kj2`EfoyOZ(NE5AHo3rB>HxU0fZ!OwZ`=0i!6(v-eoH z$u0KVa(uz>lM>czuezN-8DZVCLiFRJ?`@`8es6Ej{5RRqt*EML^Q~K{SLXC=HJ(28 x8fW@7tJE_QtAD2+tC}Uav1)JqsTGzJXP9id#+!U)XR6DZtM`8~+!S{|0RVwPx%7)eAyRA_U{X?>8~6rEgB@Ak|E?V; z!)p>`Y4zTItVN{s#1k%Tq7Cl0hcC;zdv`N&5iPQkvO*(= zUMa`1|1lffXAB!m0OXyuoCkRki&ALKXF-)5z4#h{Mqpnb!<(@lnuv1t*>k{SoLU!k zE(`*+X%s<#vmx1oEMjRIrIgag>zioa`{z|O4+Gha{zZ%gKxrgR6^UodIoj7V#7`6f zNCdPwCBmCJ7$!Av?`|85R%p)`nz)YNo*Cz0qfN!0)FFi%M%rK1SH1ixR2j+doGbQn}i0RKd@%(#tYoG_@z0d-=ERNi6d#Ist z&ubLgJS3GgHmw3EqnwEHxl6R=UT8@#593%3jED;wI1PEMKq(vNavny!hv-+zM|TPq s5ra~M$N?Pb9Ih)xqo@%yWd9|;0m+{P6rHBTQvd(}07*qoM6N<$f*I)xa{vGU literal 0 HcmV?d00001 diff --git a/public/sprites/triboi.aseprite b/public/sprites/triboi.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..1ce3c4f9ed88a1d40df1d9e5cf0246c9bfc83522 GIT binary patch literal 711 zcmX@k#K7=iDI< zE8jpKWRn6jkc0tWAcLL3C$TcMNWlEVb@csy>9XySUBwITHlOZge%lskQ}n3R;92Lvuz3QH<*If}7x~R# zHtYNfRiL+7fg!>SG!=Px$=}AOERA_qz4$E*SPPi~)!@CqYugC$oChi+n@JsP;57>oF&5q3QrW?# zi!=(jgGY}J2&v5$v1d`U%v91gL;H@z;y%=m(;z}vb2*yxSfLt_Ohnd=C_Gs1g*>%j zRU7>bJY@Gm*%>Gc51E@e?~+fMwJcPc!Ui}ft195ZnnGK-2c=}L0m?+>`8FD)^ns>w z+Kk9$fQwSkn>nn|uw{z6s(5Fa8y@!OH}vR(dQUPTjMRJk$L)Uov~p>CAqxC4y_-ikG0s0|Um6=#I{2Zsk9xKuL83_pu9QE@Ni1_`zywZ`pq89Wr#z$_`1 x($MA_XcaV4s?aP%si&E;bwE>vDG%(Q)HfeZ0_@3kSy=!8002ovPDHLkV1kB-_sjqQ literal 0 HcmV?d00001 diff --git a/public/sprites/wolfi.aseprite b/public/sprites/wolfi.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..f360a46f2ad5e0e7439862f34f52d379fa496b57 GIT binary patch literal 711 zcmX@k#K7=iDIygigP`h=hGnhuZ|*(u|NsAWkN)>=|DW6Nt0nbKv+t2w z-35LUHS!>v6qu3h_64%p8GI5eQ;QS~F{S?_NgIU#IjjmGx2iDw2l@;G)ET%LD&{07 zD9D}Q&iK1rWO9P6?_EdV@0Tvy9@$mA;BNEjUgo!Lfi^{tN)4WM9t@i&@K~;D$8?e3 z3}&;=uTTYgn-v%$tU&)G%v5902AcWy+G*ZH1_CS>rZ}+Q(QI~l(IBTWp=(Ejg^SX) zTl41rRTY}}ZPJaI&ySRC(z*S(X4jtmTSa8{zWG|SZSC2=XQ!=8y^*$4bX}aC>W#uV-FZvo*J^x778PiR4<(SJqk0 zeVvlK)vmAZdnC2??y2<*m>Cu;S_D}w0RQ$wa-AvEq{G}ViR(EdA>^6LRQ#5n)43+Djt8QP3iFPBLhZEkXKz1!SS)eVuPu`DmyZPx$+(|@1RA_U)z#GMZ408W;SGyl(e zA@9Vl?3wpG^K7%F{0D5-+skIXy(}^JN)n)bKAn&3oCrXqq1;c}AahhglYU|kfmfKj_r4^+Ttg46CG8s}=ED3P8x&(eX@?ojrhFQLgJ&JI+R`$V=K76`+Z{eHn#bsQNN@4*&%~O0lwM zL7Go|4p2$B_JYVzbD;6qnSr(tR|V|1gbX)FgT;A3v-*V-Kvkh_fv6qIQWcj6JjDCC z7^@>QbDaIk6nzJ+*ovqX5v7q5T{s}N7?RJcq`5wVKWdQLSs z`+u@!!&uxwriEH@Ru!zMhbdKve}2 zY^{K4QihR-w$Mmut`hIf<354QRDYb#$8YH*Qb0$#$Bl^oJCOks^pX>UeHWsLSAbQJ z+<^d*Ao&)UkUs*1uMr!ee4l(rkElp$HMK7#wm^IsgCw literal 0 HcmV?d00001 diff --git a/src/card.ts b/src/card.ts new file mode 100644 index 0000000..87961ce --- /dev/null +++ b/src/card.ts @@ -0,0 +1,101 @@ +import "kaplay/global"; + +type ScrumCard = { + name: string; + title?: string; + sprite?: string; +}; + +const scrumCards = [ + { + name: "?", + sprite: "been", + }, + { + name: "0", + title: "0", + }, + { + name: "1", + title: "1", + }, + { + name: "2", + title: "2", + }, + { + name: "3", + title: "3", + }, + { + name: "5", + title: "5", + }, + { + name: "8", + title: "8", + }, + { + name: "13", + title: "13", + }, + { + name: "20", + title: "20", + }, + { + name: "40", + title: "40", + }, + { + name: "100", + title: "100", + }, + { + name: "pineapple", + sprite: "pineapple", + }, +]; + +const cards = []; + +const BOARD_SLOT = 150; + +export const createCards = () => { + const board = add([pos(100, 100), "board"]); + + scrumCards.forEach((scrumCard, i) => { + const newCard = board.add([ + pos((BOARD_SLOT * i) % (4 * BOARD_SLOT), BOARD_SLOT * Math.floor(i / 4)), + sprite("card"), + rotate(), + animate(), + anchor("center"), + area({ + isSensor: true, + }), + scale(1), + "card", + ]); + + if (scrumCard.title) { + newCard.add([ + text(scrumCard.title, { font: "happy", size: 32 }), + anchor("center"), + "title", + ]); + } else { + newCard.add([sprite(scrumCard.sprite), anchor("center"), "title"]); + } + + newCard.onCollide("player", (player) => { + newCard.scaleTo(1.2); + }); + + newCard.onCollideEnd("player", () => { + newCard.scaleTo(1); + }); + + cards.push(newCard); + }); +}; diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..4adb4a9 --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,2 @@ +export const WOBBLE_ANGLE = 5; +export const SPEED = 3; diff --git a/src/main.ts b/src/main.ts index 15da322..a745110 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,12 +1,155 @@ -import kaplay, { Color } from "kaplay"; -// import "kaplay/global"; // uncomment if you want to use without the k. prefix +import { crew } from "@kaplayjs/crew"; +import kaplay, { Comp, EmptyComp } from "kaplay"; +import { createCards } from "./card"; +import { WOBBLE_ANGLE, SPEED } from "./constants"; +import "kaplay/global"; // uncomment if you want to use without the prefix -const k = kaplay(); +export const k = kaplay({ + plugins: [crew], + background: "#4e495f", + scale: 2, + debugKey: "r", +}); -k.loadRoot("./"); // A good idea for Itch.io publishing later -k.loadSprite("bean", "sprites/bean.png"); +loadRoot("./"); // A good idea for Itch.io publishing later +loadSprite("card", "sprites/card.png"); +loadSprite("octo", "sprites/octo.png"); +loadSprite("dead", "sprites/dead.png"); +loadSprite("triboi", "sprites/triboi.png"); +loadSprite("wolfi", "sprites/wolfi.png"); +loadSprite("bubble", "sprites/bubble.png"); -k.add([k.pos(120, 80), k.sprite("bean")]); +k.loadCrew("sprite", "cursor"); +k.loadCrew("sprite", "pointer"); +k.loadCrew("sprite", "kat"); +k.loadCrew("sprite", "pineapple"); +k.loadCrew("sprite", "been"); +k.loadCrew("font", "happy"); -k.onClick(() => k.addKaboom(k.mousePos())); +setLayers(["game", "hover", "ui"], "game"); +const createPlayer = (scravatar: string) => { + const player = add([ + sprite(scravatar), + pos(outerWidth / 4, outerWidth / 4), + anchor("center"), + area({ + isSensor: true, + }), + rotate(), + animate(), + named("player"), + "player", + ]); + + player.animate("angle", [WOBBLE_ANGLE, -WOBBLE_ANGLE], { + easing: easings.easeInOutCubic, + direction: "ping-pong", + duration: 1, + }); + + const bubble = player.add([sprite("bubble"), anchor("center"), pos(30, -50)]); + + const bubbleText = bubble.add([ + text("9", { font: "happy", size: 24 }), + pos(-5, -24), + color(Color.BLACK), + timer(), + ]); + + bubble.hidden = true; + + player.on("countdown", () => { + bubble.hidden = false; + let time = 9; + bubbleText.loop( + 1, + () => { + if (time === -1) { + bubble.hidden = true; + } + + bubbleText.text = time.toString(); + time--; + }, + 11, + ); + }); + + return player; +}; + +scene("menu", () => { + add([text("Choose your Scravatar", { font: "happy" })]); + ["wolfi", "octo", "dead", "triboi"].forEach((image, i) => { + const selection = add([ + pos(88 * i + 100, 100), + anchor("center"), + circle(32, { fill: true }), + opacity(0.1), + z(-1), + area(), + ]); + + selection.add([ + text(image.toUpperCase(), { font: "happy", size: 14 }), + anchor("center"), + pos(0, 40), + ]); + + const avatar = selection.add([ + sprite(image), + rotate(), + animate(), + anchor("center"), + ]); + + selection.onHover(() => { + selection.opacity = 1; + setCursor("pointer"); + }); + + selection.onHoverEnd(() => { + selection.opacity = 0.1; + setCursor("default"); + }); + + selection.onClick(() => { + pushScene("game", image); + }, "left"); + + avatar.animate("angle", [WOBBLE_ANGLE, -WOBBLE_ANGLE], { + easing: easings.easeInOutCubic, + direction: "ping-pong", + duration: 1, + }); + }); +}); + +scene("game", (scravatar: string) => { + createCards(); + const player = createPlayer(scravatar); + + onKeyDown(["w", "up"], () => { + player.moveBy(0, -SPEED); + }); + + onKeyDown(["a", "left"], () => { + player.moveBy(-SPEED, 0); + }); + + onKeyDown(["s", "down"], () => { + player.moveBy(0, SPEED); + }); + + onKeyDown(["d", "right"], () => { + player.moveBy(SPEED, 0); + }); + + onKeyDown("u", () => { + player.trigger("countdown"); + }); +}); + +// pushScene("menu"); +pushScene("game", "wolfi"); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1 @@ +{}