From 5e9d532b956e9683759ac8e582af323709b902b5 Mon Sep 17 00:00:00 2001 From: eriedaberrie Date: Sun, 21 May 2023 15:13:45 -0700 Subject: [PATCH] Init --- .gitignore | 4 + Audio/explode.wav | Bin 0 -> 25711 bytes Audio/silent.wav | Bin 0 -> 44 bytes Audio/tick.wav | Bin 0 -> 1360 bytes Audio/win.wav | Bin 0 -> 37960 bytes Canvas.java | 385 ++++++++++++++++++++++++++++++++++++++ Face.java | 73 ++++++++ Main.java | 274 +++++++++++++++++++++++++++ NumberDisplay.java | 58 ++++++ Skins/Notes.txt | 44 +++++ Skins/cloneskin.bmp | Bin 0 -> 52758 bytes Skins/coloursonlyskin.bmp | Bin 0 -> 8902 bytes Skins/win98skin.bmp | Bin 0 -> 8902 bytes Skins/winbwskin.bmp | Bin 0 -> 8902 bytes Skins/winxpblindskin.bmp | Bin 0 -> 8986 bytes Skins/winxpskin.bmp | Bin 0 -> 8902 bytes Sound.java | 141 ++++++++++++++ Tile.java | 254 +++++++++++++++++++++++++ about.html | 27 +++ help.html | 46 +++++ 20 files changed, 1306 insertions(+) create mode 100644 .gitignore create mode 100644 Audio/explode.wav create mode 100644 Audio/silent.wav create mode 100644 Audio/tick.wav create mode 100644 Audio/win.wav create mode 100644 Canvas.java create mode 100644 Face.java create mode 100644 Main.java create mode 100644 NumberDisplay.java create mode 100644 Skins/Notes.txt create mode 100644 Skins/cloneskin.bmp create mode 100644 Skins/coloursonlyskin.bmp create mode 100644 Skins/win98skin.bmp create mode 100644 Skins/winbwskin.bmp create mode 100644 Skins/winxpblindskin.bmp create mode 100644 Skins/winxpskin.bmp create mode 100644 Sound.java create mode 100644 Tile.java create mode 100644 about.html create mode 100644 help.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aff8bf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.class +.breakpoints +.replit +replit.nix diff --git a/Audio/explode.wav b/Audio/explode.wav new file mode 100644 index 0000000000000000000000000000000000000000..b64a2e6f6a33e041dcf9f0b2db6c2e0373019aa0 GIT binary patch literal 25711 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 literal 0 HcmV?d00001 diff --git a/Audio/silent.wav b/Audio/silent.wav new file mode 100644 index 0000000000000000000000000000000000000000..ce67b83be271c9ec0275a24a0650c1df3c37ff91 GIT binary patch literal 44 vcmWIYbaPW-U|>1fy|oN@jvCN>nm4P|z@tl(7xig~8amu3Ojj-qW62&*{1J za@wBLb9&jj-qx{8w{_Buk+1;%P$VG+H5zmz#7iLjG5+BniAH=+aX);THaU5}_j#Y^ z`QFpc&stlLJfqQcAM840FuUq^Xf&E_@OiyUQ~hq!JgdpML(O#(gJ;U7Va-ym%KJ-2UP+i|gwb*D5QEbJJ->U_54B=cga;*}bd2?$x@6#-_ao+s=$(!Q}MP+T|-(uWVde zEzjoCskkhOq9{pXG#uh-%wf`>>pj)crqybX9Y4|AuOG9cG#{3elbLKbGnJl5#^qQ{ zlwwM9VyZARQ_N4r!#=lZu&b^0KudFTbIZqvw5R$<9i(4O<>yMv<&~9{@=|I3{B(9Q zAxjY<=;wT19I=h*`@7nX9)WexcJvGwos^Ks&9AJkUs|t}OEcLCB^qQYk{}3@q8XOw z{eGTfC;~+smT}{Ven_X&k6ICu4M~Z~OfHwrOoA6N5)OwWQAtju(wS^#A}$7L)IK(J zw&zr5dwa);?!Ezo#Z3jIiTv#1N~Ln43~6POlE8x|48w4O^m@G{=5|`gM~8KTI{k>r zh7i7>7@y4Mr;EixHl38CAnExxlw{<141+=%U~|ZQJBkS8XeXT=?z9RLUAEc zNu*K`ngsa<162frp^y-QCtyKcHnY*7*9{B|3=SD!7Rg1FbpHIp($eBWF&&Qve6ad< ztHolqJ7E}vLDOCW$50Od!$~jAaQ>hW6=Sj@$HYj;&#ECg?KYdu;l`<|I7N}AaDerq zV9PjSFpL;Y7KaD2i%7Bp#h3)ah2UlwAG~U6=A@T`w+>f{tmbjkxY=TNp&A zLZJYgBS&~IhB#~%v)OF1IS~{GEiA_aIF4m}G)3aLnkeN{6^0{WAr#;k8iGbqh?-P` zi@+*LQd9`AG>N)Fwbg2~0~bki0YQ|Ncp@HGVz4&QNfF@M?Ljd$1s}rz6-nR#bp*>p z2;e53NI(M+azKc*MyhoHsDnFEFA1O$0jgX;2GRIcz#hYRkPab$_Udt% e#;__NH@aGUqE0o+LMx}181)bF33c@sp8f^Z{F!0^ literal 0 HcmV?d00001 diff --git a/Audio/win.wav b/Audio/win.wav new file mode 100644 index 0000000000000000000000000000000000000000..9cd1e9c41e8a0a3c30159ee9ad8ade908a34c857 GIT binary patch literal 37960 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 dirStream = Files.list(Paths.get(SKINS_DIR))) { + dirStream + // Filter for only regular files + .filter(file -> Files.isRegularFile(file)) + // Cut off the directory name from the resulting string + .map(Path::getFileName) + .map(Path::toString) + // Only allow a filename if it ends with one of the + // valid extensions + .filter(name -> Arrays.stream(VALID_EXTENSIONS) + // Use regionMatches to effectively + // case-insensitively endsWith() + .anyMatch(ext -> name.regionMatches(true, + name.length() - ext.length(), ext, 0, ext.length()))) + // Because Files.list does not guarantee an order, and + // alphabetical files look objectively nicer in lists + .sorted() + // Create a radio button menu item for each one, + // remembering to have it pre-selected if it's already + // the current skin + .forEach(name -> addMenuItem(new JRadioButtonMenuItem(name, name.equals(skin)), + skinsMenu, name, skinListener)); + } catch (IOException ignore) { + // It's fine to leave it blank if we can't get results + } + } + + @Override + public void menuDeselected(MenuEvent e) { + // Remove skins when we're done so they don't duplicate every + // time we open the menu + skinsMenu.removeAll(); + } + + @Override + public void menuCanceled(MenuEvent e) { + } + }); + menuBar.add(skinsMenu); + + return menuBar; + } + + private static void messageHtmlFile(String file, String failText, String title, int messageType) { + String text; + try { + // For some reason, JLabels just stop parsing HTML after they hit a + // newline, so swap the newlines out with spaces + text = Files.readString(Paths.get(file)).replace('\n', ' '); + } catch (IOException e) { + text = failText; + } + JOptionPane.showMessageDialog(FRAME, text, title, messageType); + } + + private static void setDifficulty(Difficulty newDifficulty) { + if (newDifficulty == null); + else if (difficulty == newDifficulty) + return; + + difficulty = newDifficulty; + replaceCanvas(); + } + + private static void addMenuItem(String menuTitle, JMenu menu, int mnemonic, String actionCommand, + ActionListener listener) { + addMenuItem(new JMenuItem(menuTitle), menu, mnemonic, actionCommand, listener); + } + + private static void addMenuItem(JMenuItem menuItem, JMenu menu, int mnemonic, String actionCommand, + ActionListener listener) { + menuItem.setMnemonic(mnemonic); + addMenuItem(menuItem, menu, actionCommand, listener); + } + + private static void addMenuItem(JMenuItem menuItem, JMenu menu, String actionCommand, + ActionListener listener) { + menuItem.setActionCommand(actionCommand); + menuItem.addActionListener(listener); + menu.add(menuItem); + } + + private static void replaceCanvas() { + canvas.stop(); + canvas.removeAll(); + FRAME.remove(canvas); + setCanvas(); + } + + private static void setCanvas() { + canvas = getCanvas(); + FRAME.add(canvas); + FRAME.pack(); + } + + private static Canvas getCanvas() { + File skinFile = new File(SKINS_DIR, skin); + if (difficulty == null) { + // TODO: Make the difficulty actually change + return new Canvas(40, 50, 500, skinFile); + } + return new Canvas(difficulty.ROWS, difficulty.COLS, difficulty.MINES, skinFile); + } + + // No construction >:( + private Main() { + } +} diff --git a/NumberDisplay.java b/NumberDisplay.java new file mode 100644 index 0000000..36cfc82 --- /dev/null +++ b/NumberDisplay.java @@ -0,0 +1,58 @@ +import java.awt.*; +import javax.swing.*; + +public class NumberDisplay extends JComponent { + public static final int DIGIT_WIDTH = 11; + public static final int DIGIT_HEIGHT = 21; + public static final int BACKDROP_WIDTH = 41; + public static final int BACKDROP_HEIGHT = 25; + public static final int MINUS_INDEX = 10; + + private static final int[] DIGIT_X = {28, 15, 2}; + private static final int DIGIT_Y = 2; + + public final Image BACKDROP; + public final Image[] DIGITS; + + private int num; + private boolean negative; + + public NumberDisplay(Image backdrop, Image[] digits) { + BACKDROP = backdrop; + DIGITS = digits; + setPreferredSize(new Dimension(BACKDROP_WIDTH, BACKDROP_HEIGHT)); + } + + public void setNum(int num) { + setClamped(num); + repaint(); + } + + private void setClamped(int num) { + // Clamp all number assignments between -99 and 999, inclusive + if (num < 0) { + this.num = Math.min(-num, 99); + negative = true; + } else { + this.num = Math.min(num, 999); + negative = false; + } + } + + @Override + public void paintComponent(Graphics g) { + g.drawImage(BACKDROP, 0, 0, this); + // Preserve the original num for divison, in case we repaint twice + // without updating the number + int num = this.num; + for (int i = 0; i < 3; i++) { + int digitsIndex; + if (negative && i == 2) + digitsIndex = MINUS_INDEX; + else + digitsIndex = num % 10; + g.drawImage(DIGITS[digitsIndex], DIGIT_X[i], DIGIT_Y, this); + num /= 10; + } + } +} diff --git a/Skins/Notes.txt b/Skins/Notes.txt new file mode 100644 index 0000000..65d406a --- /dev/null +++ b/Skins/Notes.txt @@ -0,0 +1,44 @@ +With the exception of the following 2 skins, all other skins here are curated +from the skins pack at https://minesweepergame.com/download/minesweeper-x.php + +winxpblindskin + +Below is the original Notes.txt that came with the Minesweeper X Skins Pack + +-------------------------------------------------------------------------------- + +Minesweeper X Skins + +The following skins are included in this pack: + +winbwskin Curtis Bright inspired by Windows 3.1 monochrome +win98skin Curtis Bright inspired by Windows 98 +winxpskin Curtis Bright inspired by Windows XP + +cloneskin Rodrigo Camargo inspired by Minesweeper Clone +coloursonlyskin Curtis Bright +hibbelerskin Nicholas Hibbeler +icicleskin Aryeh Draeger +marioskin Jonathan Aldrich +mavizskin Mantas Vykertas +mineskin Philip Jovim +narkomaniaskin Kostas Symeonidis inspired by Narkomania +oceanskin C. L. +pacmanskin Jonathan Aldrich +predatorskin Dmitriy Sukhomlynov inspired by Arbiter +scratchskin Kris Decker +symbolskin Tobias Banzhaf +unknownskin Unknown + +vistagreenflowerskin Mohammad Hosseyni 2011 inspired by Windows Vista +vistagreenmineskin Mohammad Hosseyni 2011 inspired by Windows Vista +vistablueflowerskin Mohammad Hosseyni 2011 inspired by Windows Vista +vistabluemineskin Mohammad Hosseyni 2011 inspired by Windows Vista + +greenfarm Josh Scorpius 2021 +classicblue Josh Scorpius 2021 +redgarden Josh Scorpius 2021 +yellowrings Josh Scorpius 2021 +aquarium Josh Scorpius 2021 + + diff --git a/Skins/cloneskin.bmp b/Skins/cloneskin.bmp new file mode 100644 index 0000000000000000000000000000000000000000..85b78b64ebba56702936204f39c96b135c4807f9 GIT binary patch literal 52758 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 E7setUIRF3v literal 0 HcmV?d00001 diff --git a/Skins/win98skin.bmp b/Skins/win98skin.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9d0c9e79a320fee1cf0bcca9775656e669964a07 GIT binary patch literal 8902 zcmeHKJx}XM6dlA$@QAbu6$)h<_IIozQLVHM+JC^d=80tjLc(288bTF0e}IVQMWS>= zfp(ksW9ahqn(R6E&e&rIXG83jR%kDHKJFbKpSg2p?EL)8pIsw%f$}F@BV1Rww#*MG zjrkSvmml>KM^?nf;NQftRw&Ul&(F`O8Cb}_SuEJXg+IDb^lxd?sZ_(qjcqOf^>G$L zr~#b0g*`m5ysa^>#heKL<5UTw(flmFd|5QGUj3Vfa0c~ps`B<;Kl9wbeXO0I_dd63 zyz-eo=z87YC@I_bs#^~@Cw)f!-98MdClM@C!>8y{F@AtS(fHwZyETpp$ z4iUfv2&RqmoSltuI4Rr=C?ZK`BOGRhe3%?IaBYP1-{6y-8*wc@`MD8qoS%ZYAM5F- zKX`QeE5=%LYVX%`qkQn4;P&ap`SJVR?bBN873|Ymd;*-0%cr69XXEowUJrPm!urF_ z^{j6h#hC+V+15PA0zQi?`FJfAS69Wo^Y8ZbJKRxt2&oL$4GF<8BfHZuJB4JGLz-48 zzX{G=Kw)?KE$_v{6``2h+L^=gU3|XmPUm?KIC-ZWY7{3jhEEFk7_$S1d#DRLK5vJ} zCu*fBfpQ#^rZWI3jt?tNMTj_nNmJaG;Y4)IJdO_wPE`mv65?$cj@$`k;e)VgF)TRc zkUlUT0tbT(*zROFyi;x!oL2hO+GdzIQA(iJOdpZm>2MHh6>w&l7AQCzG;^F{$lXbt zh@<2-Kd+WPG~FRilq#Q@@WFkgnuTyDGpRVzK`+NqkH=wtWbmCX38GnuBiF|9gUdLr zCzH;$p_w)LRN>5Kre(}5;{#N#Y(6h^xq_OXr|lH~K0hsF4~wE9heAI9OTODm`oXpY+_+{%UN$+lI~` zo?$eR^hNzCf$hoX_nx-j>rpx*z>FsH3vwdu!*<}&_R^S1Fy>Hk5lp%p&cm{5jMH<# z$Eh^nAWROm3^cFGS5%PKvSkJoBGeru0y zuk+krt>+KLCp$^9Q$;*Ua3Y20lAcBRiR9NS)M`OLqN{>_%DU2B;Pj)4UDoQdC)9R$ zm+HBx5|R;%O17@w^KieoV*j@Gb=l8t3mcdH9%rsMdYs7NL}kCiB%`vw0*5et7IWJ- zX4l5{?7;E@&OQ0et$jJhuMZ44@1dx`As@LgzQ4=ym-p6o#t|??1n`GAQ3VcQcH#kk zRbjkEh36&*X9>!r)9!SH4c^$I=_e=bUX6zB53Gq&Kv7oFs1O+K+PgOCrX;JHcC zHb(h`IMsXr1E7G9?I1%DVF1MSx<-CweS61tMSkK}<#WG(Amh)H1P$!tT1JkNWW*9tyfKQbNYXKZl= z`nmr4m*%I3X|3Sn^=xU92Q~sd7yQ-v;V{(?YL7!cw95VEzL8($?w~096($*%{hm+h z*x9%nP-vpbJx;4zD@y$mJg&b&7^u75?h$Kb*6};XKC*Uye_#3+r>E*aQU0p`fWkHO z1?y%mN{|K|*uET%)}Gpn-`Tgsff*a^XbUBtXNiOQ^O5UQ%JdUQY8E5%X5(-sU07eA3=d%P$Z6tp&#P78IbwC|S|oV$--?RQi2wiq literal 0 HcmV?d00001 diff --git a/Skins/winbwskin.bmp b/Skins/winbwskin.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7220dc269d053de23b41119a90d83aff7a2aa83e GIT binary patch literal 8902 zcmeHLOKu}K5aj>?3}_MEA*-At`vGzkuM)r;`v^ILb_TqeD|iv)JiRlZP3L{8*kre) zk<^V~5SSyen^olFi-_fR#u+OzerD_^Z`qX#E)6P$ zkL1IlrKmo%Zt%J6!tb1ceJY=_#}6L>n@_mS=bVc?n0Z6X2QUBvEApvs@%f&M!;+6i z0@-}_AWKy7nY%n8T$&I1a9G4^;7AVzAHB#;KKp^(i5f1C6jj*qY4sVwem@2uy~1sM zdRL4T9}K`89F}|tEM)1!H4zt`2aY4vkdCWDu}jLKRZ<^opb^L)xTz0*y&``WF2cx# zfasm5m5(i_CXK#!0e6oNl$CVhJI_ZQPVs?)10xmsfIA4cdMbM;$Sdb^4S)r(LzcJL+BX4q>6xgY9jfqwN~CGmZ{m_1Pc!&b@;}B`kiQ_kp+e$^Q$}0jyEu zk?#)E7#7ZGds^E59Uq=dpE%Mmb?Ed#BcsFrd$rDKp#gDJy?m!70J8!QRaLn zf7mDThcK}vyL@(5x3zn=7QaV6(;a*wOPd^ahDV;Or}N*n`e#1F+pEFusfiV9b+cBJ zVyVwOKQk7#JHuTQKXZE;^@&qWB;8fup)Ti>4DPb&gD6F!Gdh{>b9Y zaoy&2Gb-{2Q;p+Q=d*jZHK$5G&g%8GFjrK`AR)Ls6fT@a#{hk9PVIUB#K{5KpBVgB zJ1(GzXf}D#RLTB{d$+gFB<@hi%I1#Ci?loQMkL| z28e57#X)~uEp_GZa2kA4#Tqc2Yat96=thb*ZYsQUlaH?A^K~ux5P;WfP|&j1%J(e7F*?6+>x5 zQlYZw)4G;?m_v;|m{a?r<`2?Je9#O1&gw%9d>fu>BN;H-`jD(p8k}fXd-~`0#F^WZ z59ipT%;x7BSpG*(sKgjctavKs$iB4m$qi^bw{F`GJx<_o-=kCPNICxTrT*v&0iR7R3>iLkqbUcBRxbmOF;q?7_ zqysARf|q{wYWvX{>$hD;XQ$hJIGSmx2h8R}fkLlbU$#3wJZ{l1b>lGUFvDs69G`8j KHrD$iJpTnLo^KTZ literal 0 HcmV?d00001 diff --git a/Skins/winxpblindskin.bmp b/Skins/winxpblindskin.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f84e713d597423f94ae3d3818de0db0c765cdca GIT binary patch literal 8986 zcmeI1zi#735XM(Q06`)Us8*T0fO~h>q>TlL$y5$p~O|lGRw9K{Z!eaC7Y0xJZ>3 z5|BpuzL_0zNQtukFhF2vPh9TK?EW}AJG)%^zI+}25+wbN{7+mfTo1T9;YZ{l{PuGQ zfBmG_0Cip=?CdACFTei&hZN4pemK~676N`@Hq#q&6vO-bJML8IbHi@O5-$9s2-#%8 zwAsjQ`F3&I3gCLqP7G>+vmGP7zA|52F|OT~gd3+RFk1D`?)&#$3-dL3Y>6|!p3~&F zbLI5&Wbt;jf6jewQ+u^%^Q!aph^?fa{%Pu3kw?zvQRba{RXv@@nMck53A-^8cv3l? zQ?B>ffPevh17=dWh(iJ_0Re9Utz5+6pg;nOB&l4)p;u@Rox=jIi#Y!edy0Kyc9lKl zzA?MlKb7EqyDokv^S8LZW|(UZ?fiId)gGJ^;yS(9KepcEI=yPX+&aC=9>@8-_O!JB zT)ZF3>jCdmq{;H~c-FU!a<<^?rxW)vXV30I4zIQB;i0;A{@a?K!=nkW-jwC3Dlu^G zyKa2fG-?$0n@3MQSg_C5oy;Nz>$bl}aa$sUoHcn76 z4vJ0{dkTlGR2RoJ0#(Rj50tbg@6w(TtDSuaKE%kjIf<#Q!!$qJa&TD~CHQXUSRM9X_^)~?M^IVm3BTl3qm zw`RH1?>LE;>uu1!Xw&IO&MJg-&EsymPEj5Vwd`}seH$ywA=&JaHavbS2lhzW=gKMD zq_CgunSXkFFh1SR>rWxyGdCP4P^7ELO|* zoj%JJ=cT+koz()Y9)Rot}5|Uk1JgTF@7{+_hWTm z;$z$Q(s*twx6da2eS^vFb@>z58&X|vcGwq}_2<2dtB|LxPhZI4XbL$Wie#Ml#kHt& z3i1!u%R12m6I*9H8k{;92tG9KU`q!T!7CUJtt!X8~;oJS;)vrusK z+&h8aB-uS4hYLA5Om%sUW6QWW_{R1h%8g^szul|zar4K`AN0U24i3jbvEf`<_!mhL BJ;MM1 literal 0 HcmV?d00001 diff --git a/Skins/winxpskin.bmp b/Skins/winxpskin.bmp new file mode 100644 index 0000000000000000000000000000000000000000..497fa2699534faa8518968bb9185d85d4307a281 GIT binary patch literal 8902 zcmeI1F>m8G6vr8$fZ+%@_@)9GZ@G@yvlRhuD$q~SuI?c?*}(zvX2(ms8S>IGMwZjA zB}36E-^V}~_y2#7PogBtu`LxXg1)mT@{#=M@$r$OazFm`=LaY91?dmC7PxM4ow@Ij zI`=c`|9GdDDDq_D9DZ&x(Hl}^-ShJ^?yT6#&uzEN;le+vkc?)O^;&N8r;}wPfcBiN z7}No06GI*!na)~_Yr7%ge@;_ibn2h&w{P1H=4*7<5og+-)8w~f_4M;-_SD)x$3C~I zz1p*W)cLx@R#KI}n!1+sp0mD_dFNhLmE$;5&ly0lb3(wA!r`1^y-x-N4DcH;k-|wF z5?~1kZh-xqg_AfO6gmS%k`zwj&?~fu&S3`ENu2+NJ^8*dX=P8bZ%j`1Pbs*c+QrXk z`sCNw1ar-y9Usq~+Jkd~U#BPg$JV=Fr>*8ISf{P*2{>=po{sjPllMb;J>Y!`8O=|R zXMM{kX9G@M4&28Ad$zZ7c&#M2x8=3-&zAHY?oD_MO_?8BB?eBzuIsStd{5O3Z%vbt za2~?0Ydzg7dcLP>2WMkk9ADNvEqIyDA2yb+RVl~09$I*N*m&q16`rHjp0m43I4;Xl zfC|nq$})gF$5$(-p^BVg21!E>Fj>~~9IIANLlrqv#ct~7jeF zs`P=gIXI|t4vh;Ad$Ox=P<@$Rp;|amO52Mn?ddtFOUoRX7!{2p6pVvxQ003Hhpn{E zk8233ki{NU(w?kGdxp@{)YPibP^vI4QYbz14;qW)jp?79Q?8N{9&r%I8jC#v$7PpM z=C0DVoG5ZGbx~xT6x8y#Tn3$u>+&kY&-*9EjNqsKfv@N;<-o1vl;&MHHtz@u7ww)e zZkAG|@xw8fIO-7}KVpw@)E;|;It!r%&g=2a*00C2#(D?qD`sGIu-@aiqx}ayqF6j@ ziHc+QL+#lyM_;H+H?XIW(fpw(RI51eCf=T+@pcq)HX)~46~3%yvTuZ%={hWxUef!j zgws{hPax-V{65$Gu^P2x0nB10Uyv)wUkn0`=4)+ML7NNZBzSy(#c#jO#=Jbp6Q#n z2V>-XF->H=nh#Uz!#0)={j=b~dsqBu6iM0`KdklhrIB2ZX9Ni1JWQL~_;?QN@lhJs zAeLNc8pOOtzDBjhPcZhnPt;?f-_%!y$9Ba}J%%;H!#LNN)U+v{X^+Kf(f;h5d5iNx z-yF|x%AR~D$#)geB*Bgp?n}BC6+4p6R~W0M_>s6O#ZNV^bQSpc(TJ_bYF!h?cGyef zxvSJZoA~z)iruUFd#*P~Rd06K7nk+ty@xB;CoGSb$A59ns+?RuUV@Xv z#>w?y@MEi))5Gzo7jJP&!dDsiSd;xFIDOpv2{=R8E6?4}8M1%C87~~hcF%?7k`ibC zxM&CMfkEQ#dpN<$KllL;n!i>}UR$ zos0`JCHC03px1Hfc<~@)UgwMx<@A4diHs}fzz+Jy?dRBhC7xsRZu2$l9mcWv@%D_D z7$)P;;wR?}`DcLUap}5%Kh-~#by36v`~x|F!)6jEcr5JE^~HIFh@P38qvzfc{3c>| ze;m&Bm3dfdle(?3}U)3AOp8t05UteBcu&;jp0QneC$MmZ1vp3hc|Mnij@-Gn4 z53wvzrc0&l=V=#bDf@N7`97Y0A?H`>l_MMWRN4^){a2Vndp`Pd9AjnB|H7g2y>Q}K zIWgmTI)X8XCbpyCuAG>ol5$Iqg1}Y(++0IGdH;w#HZB=h-9Khe43OBfg9E+zNA0D9 z>Kypl#>4sIV8uVzpS+)`AxG~_;h-JU@c5{DIz#i4O(aVW!9zaT6A`4{f_hSM_hHwd^JU;qFB literal 0 HcmV?d00001 diff --git a/Sound.java b/Sound.java new file mode 100644 index 0000000..30ac23a --- /dev/null +++ b/Sound.java @@ -0,0 +1,141 @@ +import java.io.*; +import javax.sound.sampled.*; + +public enum Sound { + // The available sound filenames + WIN("win.wav"), + TICK("tick.wav"), + EXPLODE("explode.wav"), + SILENT("silent.wav"); + + // The directory all the audio files are in + public static final String AUDIO_DIR = "Audio"; + + // Named pipe to send audio requests to on Replit + public static final File REPLIT_PIPE = new File("/tmp/audio"); + + // Use env vars and the existance of the above pipe to determine if running inside Replit + public static final boolean REPLIT_API = System.getenv("REPL_ID") != null && REPLIT_PIPE.exists(); + + // Whether the clips have been initialized yet + private static boolean soundsInitialized = false; + + // File containing the sound + private final File FILE; + + // SoundBackend that will play the sound + private SoundBackend soundBackend; + + // Because Replit does audio totally differently from desktop Java (it + // supposedly supports PulseAudio over VNC but I just could not get that + // working), and I would like to still be able to hear things when I play + // the game directly on my laptop, we have a SoundBackend interface that is + // implemented by both a builtin javax.sound.sampled-powered backend and a + // Replit specific one + private interface SoundBackend { + // plays the specific sound + public void play(); + } + + private class NativeBackend implements SoundBackend { + // The audio clip associated with the sound + private final Clip CLIP; + + public NativeBackend() { + // Create the clip, if possible + Clip clip; + try (AudioInputStream audioIn = AudioSystem.getAudioInputStream(FILE)) { + clip = AudioSystem.getClip(); + clip.open(audioIn); + } catch (Exception e) { + // If it didn't work, don't leave a broken clip behind that + // would try to get played + clip = null; + } + CLIP = clip; + } + + @Override + public void play() { + // Don't play if the clip couldn't be initialized + if (CLIP == null) + return; + + // Rewind the clip and play it + CLIP.stop(); + CLIP.setFramePosition(0); + CLIP.start(); + } + } + + private class ReplitBackend implements SoundBackend { + // The JSON format to send requests to Replit with; the volume is 0.1 + // because my ears got blown out the first time I exploded when it was + // at 100% volume (Replit is LOUD) + private static final String REQUEST_FORMAT = """ + { + "Volume": 0.1, + "Type": "wav", + "Args": { + "Path": "%s" + } + }"""; + + // The actual request string to send + private final String REQUEST; + + public ReplitBackend() { + REQUEST = String.format(REQUEST_FORMAT, FILE); + } + + @Override + public void play() { + // Attempt to send the request + try (FileWriter writer = new FileWriter(REPLIT_PIPE)) { + writer.write(REQUEST); + } catch (IOException ignore) { + // If it didn't work, no biggie, just don't play anything + } + } + } + + Sound(String fileName) { + FILE = new File(AUDIO_DIR, fileName); + } + + // Initialize the backends for all sounds, if they haven't already been + // initialized yet + public static void initSounds() { + if (soundsInitialized) + return; + + soundsInitialized = true; + + if (REPLIT_API) { + for (Sound sound : values()) + sound.soundBackend = sound.new ReplitBackend(); + + // HACK: Play an audible sound immediately, so the popup message + // happens now rather than in the middle of a game; SILENT doesn't + // work here, but the popup will block the first sound anyways so it + // doesn't matter + TICK.play(); + return; + } + + for (Sound sound : values()) + sound.soundBackend = sound.new NativeBackend(); + + // HACK: Play a silent sound as soon as possible to eagerly load all the + // sound stuff now to prevent lag when the first real sound is played + // (yes this actually helps, I tested it) + SILENT.play(); + } + + // The actual method that users outside this file will call to play sound + public void play() { + // Here is the check for if the option for sound is actually enabled + if (Main.hasSound()) + soundBackend.play(); + } +} diff --git a/Tile.java b/Tile.java new file mode 100644 index 0000000..21135d9 --- /dev/null +++ b/Tile.java @@ -0,0 +1,254 @@ +import java.awt.*; +import java.util.HashSet; +import java.awt.event.*; +import javax.swing.*; + +public class Tile extends JComponent { + public static final int SIZE = 16; + public static final int REGULAR_INDEX = 0; + public static final int PRESSED_INDEX = 1; + public static final int MINE_INDEX = 2; + public static final int FLAGGED_INDEX = 3; + public static final int NOT_MINE_INDEX = 4; + public static final int EXPLODED_MINE_INDEX = 5; + + private final Canvas GAME_CANVAS; + private final Image[] NUMBER_TILES; + private final Image[] SPECIAL_TILES; + + // Store the mouse listener for convenient removal once the game ends + private final MouseListener TILE_MOUSE_LISTENER; + + // A set of all the Tiles that are adjacent to this one, for calculating + // numbers and autorevealing zeros and chording + private final HashSet ADJACENT_TILES; + + // Whether or not the tile is a mine + private boolean mine; + // The number of mines adjacent to the current one + private int num; + // Whether or not this mine has been revealed already + private boolean revealed; + // Whether or not this mine has been flagged + private boolean flagged; + private boolean pressed; + private boolean mouseOver; + private boolean gameEnded; + + private void init() { + mine = false; + num = 0; + revealed = false; + flagged = false; + pressed = false; + mouseOver = false; + gameEnded = false; + addMouseListener(TILE_MOUSE_LISTENER); + } + + public Tile(Canvas gameCanvas, Image[] numberTiles, Image[] specialTiles) { + GAME_CANVAS = gameCanvas; + NUMBER_TILES = numberTiles; + SPECIAL_TILES = specialTiles; + ADJACENT_TILES = new HashSet(); + + TILE_MOUSE_LISTENER = new MouseListener() { + @Override + public void mousePressed(MouseEvent e) { + boolean rightClicked = false; + switch (e.getButton()) { + case MouseEvent.BUTTON1: + GAME_CANVAS.setLeftMouseDown(true); + break; + case MouseEvent.BUTTON3: + rightClicked = true; + GAME_CANVAS.setRightMouseDown(true); + break; + default: + return; + } + + Tile tile = GAME_CANVAS.getCurrentTile(); + if (tile == null) + return; + + if (rightClicked) + tile.rightClickAction(); + tile.updatePressedState(); + } + + @Override + public void mouseReleased(MouseEvent e) { + boolean leftClicked = false; + switch (e.getButton()) { + case MouseEvent.BUTTON1: + leftClicked = true; + GAME_CANVAS.setLeftMouseDown(false); + break; + case MouseEvent.BUTTON3: + GAME_CANVAS.setRightMouseDown(false); + break; + default: + return; + } + + Tile tile = GAME_CANVAS.getCurrentTile(); + if (tile == null) + return; + + if (leftClicked) + tile.leftClickAction(); + tile.updatePressedState(); + } + + @Override + public void mouseEntered(MouseEvent e) { + GAME_CANVAS.setCurrentTile(Tile.this); + mouseOver = true; + updatePressedState(); + } + + @Override + public void mouseExited(MouseEvent e) { + if (GAME_CANVAS.getCurrentTile() == Tile.this) + GAME_CANVAS.setCurrentTile(null); + mouseOver = false; + updatePressedState(); + } + + @Override + public void mouseClicked(MouseEvent e) { + } + }; + + setPreferredSize(new Dimension(SIZE, SIZE)); + + init(); + } + + public void restart() { + removeMouseListener(TILE_MOUSE_LISTENER); + init(); + } + + public void addAdjacentTile(Tile tile) { + ADJACENT_TILES.add(tile); + } + + // At the start of the game, place a mine at this tile, unless it is + // adjacent to or is the starting tile, or is already a mine. Returns + // whether or not a mine was actually placed. + public boolean makeMine(Tile startTile) { + if (mine || this == startTile || Main.isProtectedStart() && ADJACENT_TILES.contains(startTile)) + return false; + + mine = true; + // Increment the number on the adjacent tiles when a new mine is decided + for (Tile tile : ADJACENT_TILES) + tile.num++; + return true; + } + + public void gameEnd() { + removeMouseListener(TILE_MOUSE_LISTENER); + gameEnded = true; + // Only repaint the tiles that actually change + if (mine || flagged) + repaint(); + } + + public void updatePressedState() { + if (pressed != (GAME_CANVAS.isLeftMouseDown() && mouseOver)) { + pressed = !pressed; + repaint(); + } + boolean pressAdjacent = pressed && GAME_CANVAS.isChording(); + for (Tile tile : ADJACENT_TILES) { + if (tile.pressed != pressAdjacent) { + tile.pressed = pressAdjacent; + tile.repaint(); + } + } + } + + private void rightClickAction() { + if (revealed) + return; + + flagged = !flagged; + GAME_CANVAS.modifyFlagCount(flagged); + repaint(); + } + + private void leftClickAction() { + if (GAME_CANVAS.isChording()) { + if (!revealed) + return; + + int adjacentFlags = 0; + for (Tile tile : ADJACENT_TILES) + if (tile.flagged) + adjacentFlags++; + if (adjacentFlags != num) + return; + + for (Tile tile : ADJACENT_TILES) + if (!tile.flagged) + tile.reveal(); + } else { + if (flagged || revealed) + return; + // Ensure that mines are placed before revealing anything + GAME_CANVAS.tryStartGame(this); + reveal(); + } + GAME_CANVAS.postRevealCheck(); + } + + private void reveal() { + if (revealed) + return; + + revealed = true; + repaint(); + + if (mine) { + GAME_CANVAS.setLoseFlag(); + } else { + GAME_CANVAS.revealedSingleTile(); + if (num == 0) + for (Tile tile : ADJACENT_TILES) + if (!tile.flagged) + tile.reveal(); + } + } + + // Determine what image should be drawn at this tile + private Image getImage() { + if (gameEnded && mine) { + // Automatically flag mines at wins, losses keep correct flags + if (!GAME_CANVAS.isGameLost() || flagged) + return SPECIAL_TILES[FLAGGED_INDEX]; + if (revealed) + return SPECIAL_TILES[EXPLODED_MINE_INDEX]; + return SPECIAL_TILES[MINE_INDEX]; + } + if (revealed) + return NUMBER_TILES[num]; + if (flagged) { + // Correctly flagged mines would have been caught earlier + if (gameEnded) + return SPECIAL_TILES[NOT_MINE_INDEX]; + return SPECIAL_TILES[FLAGGED_INDEX]; + } + // Tiles are only interactable if the game is ongoing + if (pressed && !gameEnded) + return SPECIAL_TILES[PRESSED_INDEX]; + return SPECIAL_TILES[REGULAR_INDEX]; + } + + @Override + public void paintComponent(Graphics g) { + g.drawImage(getImage(), 0, 0, this); + } +} diff --git a/about.html b/about.html new file mode 100644 index 0000000..159b0f7 --- /dev/null +++ b/about.html @@ -0,0 +1,27 @@ + + + + +

About

+ +

+ This is a Minesweeper clone in Java that mirrors Minesweeper for + Windows XP, minus the question marks because they are an objectively + bad feature that nobody uses and only exist to slow you down when + you accidentally flag something. The game uses Minesweeper X, + another free Minesweeper clone by Curtis Bright, as reference, and + uses the same custom skin format (see the Skins/ + directory). +

+ +

Credits

+ +
    +
  • Skins — refer to Skins/Notes.txt
  • +
  • Audio — directly from Minesweeper for Windows XP
  • +
  • Everything else — me
  • +
+ + + + diff --git a/help.html b/help.html new file mode 100644 index 0000000..2479a80 --- /dev/null +++ b/help.html @@ -0,0 +1,46 @@ + + + + +

Minesweeper

+ +

+ Minesweeper is a classic game about sweeping everything except + mines. Reveal all the non-mine tiles to win, but attempt to reveal a + mine and you won't be having such a good time. Revealed tiles will + have a number on them to tell you how many mines are directly + adjacent to them. Have fun, and watch out for the mines! +

+ +
+ +

+ Flag tiles to mark them as mines. Chord numbered tiles to reveal all + adjacent non-flagged tiles if there are exactly that many flags + adjacent to the tile. +

+ +

Controls

+ + + + + + + + + + + + + + + + + + +
New gameGame->New, or F2, or click the face
Reveal tileLeft click
Flag tileRight click
Chord tileLeft click while right mouse button or shift is held
+ + + +