From 80acb7af6cb9ac47540faf0daad1959adabdca2b Mon Sep 17 00:00:00 2001 From: mfrydrychowicz Date: Sun, 14 Feb 2021 00:03:13 +0100 Subject: [PATCH] [#53] Game basic sounds (#56) --- package-lock.json | 27 +++++++++++++++++++++++++++ package.json | 1 + src/controllers/GameController.ts | 15 +++++++++++++++ src/services/game-logic/Sound.ts | 24 ++++++++++++++++++++++++ static/sounds/0.mp3 | Bin 0 -> 8358 bytes static/sounds/1.mp3 | Bin 0 -> 7313 bytes static/sounds/2.mp3 | Bin 0 -> 6268 bytes static/sounds/3.mp3 | Bin 0 -> 6268 bytes static/sounds/capture.mp3 | Bin 0 -> 11493 bytes webpack.common.config.js | 11 +++++++++-- 10 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/services/game-logic/Sound.ts create mode 100644 static/sounds/0.mp3 create mode 100644 static/sounds/1.mp3 create mode 100644 static/sounds/2.mp3 create mode 100644 static/sounds/3.mp3 create mode 100644 static/sounds/capture.mp3 diff --git a/package-lock.json b/package-lock.json index 03a5cc0..1021170 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3114,6 +3114,33 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copy-webpack-plugin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-7.0.0.tgz", + "integrity": "sha512-SLjQNa5iE3BoCP76ESU9qYo9ZkEWtXoZxDurHoqPchAFRblJ9g96xTeC560UXBMre1Nx6ixIIUfiY3VcjpJw3g==", + "dev": true, + "requires": { + "fast-glob": "^3.2.4", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", diff --git a/package.json b/package.json index 6da8b61..1c3fded 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "babel-jest": "^26.6.3", "babel-plugin-transform-class-properties": "^6.24.1", "clean-webpack-plugin": "^3.0.0", + "copy-webpack-plugin": "^7.0.0", "css-loader": "^5.0.1", "eslint": "^7.18.0", "eslint-config-prettier": "^7.2.0", diff --git a/src/controllers/GameController.ts b/src/controllers/GameController.ts index 29e44a7..0504d12 100644 --- a/src/controllers/GameController.ts +++ b/src/controllers/GameController.ts @@ -5,6 +5,7 @@ import { Piece } from '../services/game-logic/pieces/Piece'; import { BoardView } from '../views/BoardView'; import { SettingsControls } from '../views/SettingsControls'; import { OpeningView } from '../views/OpeningView'; +import { Sound } from '../services/game-logic/Sound'; class GameController { boardView: BoardView; @@ -13,6 +14,7 @@ class GameController { activeSquare: Square | null; currentPlayer: Colors; openingView: OpeningView; + sound: Sound; constructor() { this.activeSquare = null; @@ -21,6 +23,7 @@ class GameController { this.settingsView = new SettingsControls(); this.openingView = new OpeningView(); this.currentPlayer = Colors.WHITE; + this.sound = new Sound(); this.updateBoard(); } @@ -32,6 +35,7 @@ class GameController { const isLegalMove = legalMoves.some((move) => square?.row === move.row && square?.column === move.column); if (isLegalMove) { + this.playSound(this.activeSquare, square); this.gameEngine.movePiece(this.activeSquare, square); this.boardView.render(this.gameEngine.board); this.changePlayer(); @@ -45,6 +49,17 @@ class GameController { } }; + private playSound(location: Square, destination: Square): void { + const locationPiece = this.gameEngine.board.getPiece(location); + const destinationPiece = this.gameEngine.board.getPiece(destination); + + if (locationPiece && destinationPiece) { + this.sound.playCapturingMoveSound(); + } else { + this.sound.playNormalMoveSound(); + } + } + private isCurrentPlayer(selectedPiece: Piece | null): boolean { return this.currentPlayer === selectedPiece?.color; } diff --git a/src/services/game-logic/Sound.ts b/src/services/game-logic/Sound.ts new file mode 100644 index 0000000..6921a59 --- /dev/null +++ b/src/services/game-logic/Sound.ts @@ -0,0 +1,24 @@ +class Sound { + private lastPlayedMoveSound = 0; + private AMOUNT_OF_NORMAL_MOVE_SOUNDS = 3; + + public playCapturingMoveSound(): void { + const sound = new Audio('/static/sounds/capture.mp3'); + sound.play(); + } + + public playNormalMoveSound(): void { + const generateRandomNumber = () => Math.floor(Math.random() * this.AMOUNT_OF_NORMAL_MOVE_SOUNDS); + let randomNumber = generateRandomNumber(); + + // avoid playing same sound as before + while (this.lastPlayedMoveSound === randomNumber) { + randomNumber = generateRandomNumber(); + } + const sound = new Audio(`/static/sounds/${randomNumber}.mp3`); + sound.play(); + this.lastPlayedMoveSound = randomNumber; + } +} + +export { Sound }; diff --git a/static/sounds/0.mp3 b/static/sounds/0.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..57c687a165ae32dc1bf39e79ae10fcbf6be27d41 GIT binary patch literal 8358 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 literal 0 HcmV?d00001 diff --git a/static/sounds/1.mp3 b/static/sounds/1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..79a8289c53621be847d7c61cc6bbc7fbb4a9ff4e GIT binary patch literal 7313 zcmeI1XHZm4m&b=eBnXmWh?0gJhA0SPvg zGa^VvQD9d0t=+A9zU-H++Ar^~>Q8}5|)s6kVW)1jXP;;?;`KJr%pXV+B zz?cBw{RamB1o;oj|H`$n0ARhx zam~KAOLiuZBRv?$EMv&WER(i~DG&z5=<2F&pI_~xz+muW+1EF_7CDK3Ng_&4XnigF zdX}%DKP`;K%Jlp^}o4 z!zVY`*r`htnDfEgKVRkI>-?_t%>BXODPyWZ*nF>~`-7o=PR46UZ!R{+GdUrm9~?V1 zu>9Ap3x5lPF1b9^ekuEn$j{H`kIB$UEZQ81K?wWhEai{7uU@@z;MZ(*Owi?3f!5I? z4%B^+`w$T9 zz)>G9n<865rhF2`D1ZuB$%20kz}|p<+`_{^@Z8(g+c3I)e{7EL5f;0Og&=)oIBb|n z35g-S#E`R9>=~)d4e?9tZs!=Jmn+>$TjuP`-#)@6AG_Bg$bl@z{HnA#K5TeFYsWn} zYtiIZr=HA2Ap;N}8D|C6S6T1ONbuVjeeV z2u{)L@glKj*XeQy9+{9Z4z7oOXei`Frf8X#FhSbpfEs z_cZd!s20)*aO}!8SFvB#y^CBQQ_I{kX(6VO0K^n$v?`p)a7gatPm;L#asNlIcG~V? z4ms3p?B^!BK_|4!rkqcZv%=BdXC! z`7`ePi)jlf8b(n@@58r$Fki(SJ)QWQdTzdR3V?9Is&E!~5%B?fb^VyUH6GDmBitfqB;AU4+Pm1Ek>gH&aLo}2nG^BWA>b0~W zbg|;v8un`>;p$z%>sf?!F?REzM8dJ`^N9*;@({SBGh%PUfx1`@;`?GCvB>%RoqX)? z4Qn=HBHN(8IB!cpdaaM5nJ zAel!4u_*~LbL>sxfQl<+?F=N;WUB%bB-Ae3>ijZ~qPO`|?16(!+0x7@+=3u`EI z_F27B8?6g-v~l$Fb5Z<-9(C3npHzm=F|@Z*zK?Sk*4vzEi1ca}>?UTm1mGqN+qWOo z+{o?Ulw+}PZZ1sP#Eo(-VnjUF2X7_YxG-49J8R;#w)%?EP zufi*^N7zRZX^LsLzkk%XsjucvHJ4*8O`4TeWN8X}hZ1GWa8uUxeI33oDh7suDK{tP zGzJyMW%KmY_hH166D&PN-?X?yn;R3sQ>oQ!feEH&adoB&0bVib0W64xVI1 zPEK)wWo}IkcO6X`&FdRHbt5~>RQugWUnZ%$S0}4ao-U+V7!8fJmfN@%`11)eHwz=G zCNX?u#`K$#tyu#Jxpc6u0{5sA*d!I&eW>q3@i5~on@v}sLLAHq>!@a)GiA&?=&H#y zq(bZ+8$RSu&daScWO=cYl`iU=nRjwy*a=R)bQ7lX4qz@_nvUyPB9H zg+RVKf{hMfn1~Z3-4xNVOTvvdjSQ%B)gmR6!Wq`-yTf4>o{od{*_3IaboDOT9-RT^J$#N z`R!9tVpOXswHQ&a2IN5(2ZT|95aNrI0$~AQADs%ar@dB{XC0%I?!Il*)$KXw2q*n|ZNd#O#vB5Xf>oLsN`U9| ziEPFiW6Ep|J8TWB(;QWZbeZRvt5+pCOQZ^FSkcU1FM4eHDj$-ZHDymS^wrtOrb^&f znvP$n&2VzO1-Rn-Ha-Rp@I^RW+cU5ed-Sk;k^jjX2NxG84asm8owhn~W3q+TW)3E3 z;ZIcH(JNo$P%RsV7HQNUk?iLR{U2 z-8RDvODH0=P(ra}5gdIfj{NiG^%*<+2E38JHT!{`H#>;NHfx$N54!$rDYBm|`l&2B zPY5(E<7LUZ^NeY^FUFqe%Pq!*Xlhh@<`~crz#a~5@R(ZMU(A6eb*H#jya0z>6qK;i zYb8=kHqrnI)TTHRpyJB+?)7@rvsEaUeMH;QB@kSN>`jKw1eLs)jF(g^mnUyf$tXf( zL~bV}Zaqx^w?+}Weq*d;$pfI|%XbXj62%Zo0(Y~mrv)ac@{jrUTqP}2LF4f}>hsBl zZYzk0{TpONT`{t$lwr?NTQCMKL#ClCq)80TzjVHpf|$4JOPn~iyEPDbrHWEIys!=X zXp5=eDwO)B6r1;$(y37mvD17$6ke4FvN=YePwyn2x9xnWt6IE)I6W% z8rs4~Jhp(e#CPC+0CnyPhQqtn*`A$lSqK^Lv6R}u&6u{w;m86W4}8VcQdKEQ4D~ms zFT_!4rGWsJ7zhBBm|b`t_~uRSpWlR$H@0>o+uA-SzMZU}%r%4q3Lv=(#hE;HwA-|$ zm`IMj${W=wA5QbCDYD6o=bPiNu2$bHx1h_8R-gJ`(q8?F4nIfcElCpBp=|YZ@$zZ~ z?esz4xXx8LXoB7Jcy+lJYidvPlLdI@&-@}=Sy^=JCN-TtU8+gQE6bCAk z7nmX%$y7#1HswdUO3F8{ji<`z<#9(@)F21<8US6oc=*CW@}eN6yM#fd{2(yW2TY!( z@1jpnepf^|OYn{{jxD%$aEz>2RDQI@8OqRA%z+a|V~s;ER;WG}M9G^s$^h|>n4!k)QhrADQICZX#{6^k35rAEdmR4X-@!wVG+FQoHpgQBfuESyJtI5?=b{#nG~) z-RJuPn`o*;#rCqsURjpj;JKkI<)LnRsYajL4s&J`czJ>s69J4pK1n7|l|AgtVdA+? z-8(O4q6;2pfzQ@Ep4`PRm?Ec+Hwj%)G;1v!yU=#RC@MFS4Nnltk%sXtR35168-9`q z2;!_@#KUmlOL~RU5m*|oT72ph{AM;%{Ek)zmm-$Nt| z)tD$l3602K8g~W7B>>&snAn^-?IzCdE6%NkbQIJB?qG&OkES!F7A`d+i z@O4PkR&rpSg5KoH)>yC4aTI)(n3edAv3+HBz&v-X*A%rqDok{^q5 zy6x<*1Q()`?s7kUi3Tvb36r!yLhsT#>rddI^vL^zcwoH+A`OLl9?~)L*WoFprH2qd zrp!$7dbzzj-*quDrT!?;@Ac2vG7s{gL?(UHamNsQ zyxUNv-fq%Tiw+8Q;bm+hBfkEkX~Gv%P1v*U7P3wkyr~cbcT2T8iH0Mo?n1=qIRRrt zICm`Xxe2Ys%O`HjlhEo2h$Z6lTIZ(~!isE9jP4s=o-X^R^K%Ll-kOxs7CsCLGn@`S zUHvNx0wh=Up^xuX_8)gZ!YA;A_ShH5eu*CdaLaoh07H-fE)jDJEdc?3?njT+$@h6h z#-J)GP?u7;(n&LY!>y?G+FlcRu)^9_!9=n#e_Ea#hvK@O&cyiVkTd%=TQ(h(&bf?` zoNF6KyF}OUN1@?I7b&sW0jgJ^DL3V6b)twAu-j_~&oJ@X_s1wCw?lS>1}~^d<52Z^ zf98T1UHDa_&G{w02J1`+bw3JHxh>`|#Cz^a>m>E!!G;wZEU1{rW4WIuAk@+7RPmM{ zCp&1=I&wl%vEWJO2>fzCZfs0APTB$)PDY(i)0<4(?U%VOZ}Lc_H+VpoLLD7rD_-85 zs(A5jTRT?>d;9$Q`TXyOQPY$m-k`UX@QC4sS!q23D%!!BF@vHr6LLx&G)|-`Eyhkf z0dvYRXawQ&$a`sOB3Aasxr(r)eQnx8(IYoA{kOG?O~6G^6m`;wwY3{p2*AY)z#WcOztN{&C&=X zwR9AIr$}JMTskGA7;pJA`@vcpxVuL(x*R+_QYrrUE-u+b5X1>r@6LoGBLEH{4MO&H z8Q+=Tivf}mAn(4LHO>_26sI43RDIMw^M2uQxO+rMnlELgsBR&Cd04zW`82!2vGQQ6 z;U0~H_sW^v__(QQVxXFisLSHG91Qv-IC=^q)#&WlrOrsE} zsIEPjz|*}jO6TsCt53V10|SoUV6mN8tcTE_tp6`=otSoWy%v{$%Z2ae{K(P2vU2a_ z8`rqu6ve(f$t-NvZN@b7Ray8a+?#6pK9e3hmoc82nAWkP^Q`<8LzQla|E2Z&m3H;F zk8fr=mpl$FjviZlIcxPcF&UJe5^Wi1cF)WKGp0U)r=4^~8;sM^`%)j^C#i)M=kH3r z6-zbzj4`o-u7rv`OL8tq@EJ_n2I#PLHS8NQ53iwE1zc)IxL68$I7VHT^`8lPZM7ti zLC3l`p)GC#F@U=`hBA42-0(NkDk|)ba~pQP07d0H=sRQpfNTIg8IbFKlPVnFmYQgX z90w}aLR#*Ulh38RLb3gb!JiOjfeAUong zHSg;IOYUToi_wGezyMTSmFGvl>9@u+Y|UbrZxQ24x)mQ}Go_^#Qc+3hj}DM>^n$4U zXV7a=MRStZ5v^0Abvy=FngZ%31|;692EWueb(1-7{n0=$OgQ)1hhX3UCDk8~*En*KSwN;po@l z6U^_5!#(U}eZ}-mytPKO`uJXsU_tm9EhLK(dQzVxIn0LX+`-#g%Cv4o>pBSFG3525 zPoLjnQuQSClGHb$<5G7p2mMrZ>?N8cF=_@BY?|0>0o-^g94`s7ry{hW@ehID1wyUO z2z`oi`8AODu_uE5@^6Ep2j< zXljy2IYwGN_L+jbh^3LGaMlq{2Q9r~sS*29`@U);(T9wK`uqCgN}?1^W;7Ix;Zl(N zN_1_7L5;OG>y$9-$k(+F!}^i;I{l&5wy}H^t(p4!^rM8&e(0p9jLpK8tRNKzb#8>u zs*yQL*?E6#*9+586?ewZyiFJNe@s=5N48)OG3O4r%_z|a!3VOhTVOj*wG}3=eV2l{ zTq#qv`E}_Am2C~XUy6+Q3Kih~dGP?)-zEMZeqKF){j?I5xu>JG??*Fm= EA70867XSbN literal 0 HcmV?d00001 diff --git a/static/sounds/2.mp3 b/static/sounds/2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e99f8b0c7c4c2bf5681873bac2d7adca7e93d0a8 GIT binary patch literal 6268 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 Af&c&j literal 0 HcmV?d00001 diff --git a/static/sounds/3.mp3 b/static/sounds/3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..91d71f65e42f78fc5d3da65b3509440359c023d9 GIT binary patch literal 6268 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 literal 0 HcmV?d00001 diff --git a/static/sounds/capture.mp3 b/static/sounds/capture.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e44bd6485be9d5a9267265798d71c6f2ce9fa113 GIT binary patch literal 11493 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 E3$AG&EdT%j literal 0 HcmV?d00001 diff --git a/webpack.common.config.js b/webpack.common.config.js index 7ddffe0..239b2bf 100644 --- a/webpack.common.config.js +++ b/webpack.common.config.js @@ -1,5 +1,6 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const CopyPlugin = require('copy-webpack-plugin'); const path = require('path'); module.exports = { @@ -23,7 +24,7 @@ module.exports = { ] }, { - test: /\.(png|jpe?g|svg)$/i, + test: /\.(png|jpe?g|svg|mp3)$/i, use: 'file-loader' } ] @@ -35,5 +36,11 @@ module.exports = { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, - plugins: [new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: './src/index.html', scriptLoading: 'defer' })] + plugins: [ + new CleanWebpackPlugin(), + new HtmlWebpackPlugin({ template: './src/index.html', scriptLoading: 'defer' }), + new CopyPlugin({ + patterns: [{ from: 'static', to: 'static' }] + }) + ] };