├── LICENSE ├── Minesweeper_proj.dpr ├── Minesweeper_proj.dproj ├── Minesweeper_proj.res ├── Minesweeper_proj_Icon.ico ├── Readme.md ├── UBoardFrame.dfm ├── UBoardFrame.pas ├── UCustomBoardForm.dfm ├── UCustomBoardForm.pas ├── UDogFrame.dfm ├── UDogFrame.pas ├── UDoubleBufferedFrame.dfm ├── UDoubleBufferedFrame.pas ├── UHighScoresForm.dfm ├── UHighScoresForm.pas ├── UMain.dfm ├── UMain.pas ├── UMinesweeperDataController.pas ├── UMinesweeperGame.pas └── screenshot.png /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Minesweeper_proj.dpr: -------------------------------------------------------------------------------- 1 | program Minesweeper_proj; 2 | 3 | uses 4 | Vcl.Forms, 5 | UMain in 'UMain.pas' {Form1}, 6 | UMinesweeperDataController in 'UMinesweeperDataController.pas', 7 | UMinesweeperGame in 'UMinesweeperGame.pas', 8 | UDoubleBufferedFrame in 'UDoubleBufferedFrame.pas' {DoubleBufferedFrame: TFrame}, 9 | UBoardFrame in 'UBoardFrame.pas' {BoardFrame: TFrame}, 10 | UDogFrame in 'UDogFrame.pas' {DogFrame: TFrame}, 11 | UCustomBoardForm in 'UCustomBoardForm.pas' {CustomBoardForm}, 12 | UHighScoresForm in 'UHighScoresForm.pas' {HighScoresForm}, 13 | Vcl.Themes, 14 | Vcl.Styles; 15 | 16 | {$R *.res} 17 | 18 | begin 19 | Application.Initialize; 20 | Application.MainFormOnTaskbar := True; 21 | Application.CreateForm(TForm1, Form1); 22 | Application.Run; 23 | end. 24 | -------------------------------------------------------------------------------- /Minesweeper_proj.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {87E65B8E-334A-4CC0-A460-6859D97D1C32} 4 | 20.1 5 | VCL 6 | True 7 | Release 8 | Win64 9 | Minesweeper_proj 10 | 3 11 | Application 12 | Minesweeper_proj.dpr 13 | 14 | 15 | true 16 | 17 | 18 | true 19 | Base 20 | true 21 | 22 | 23 | true 24 | Base 25 | true 26 | 27 | 28 | true 29 | Base 30 | true 31 | 32 | 33 | true 34 | Cfg_1 35 | true 36 | true 37 | 38 | 39 | true 40 | Cfg_1 41 | true 42 | true 43 | 44 | 45 | true 46 | Base 47 | true 48 | 49 | 50 | true 51 | Cfg_2 52 | true 53 | true 54 | 55 | 56 | true 57 | Cfg_2 58 | true 59 | true 60 | 61 | 62 | .\$(Platform)\$(Config) 63 | .\$(Platform)\$(Config) 64 | false 65 | false 66 | false 67 | false 68 | false 69 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 70 | $(BDS)\bin\delphi_PROJECTICON.ico 71 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 72 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 73 | Minesweeper_proj 74 | 1029 75 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 76 | 77 | 78 | vclwinx;fmx;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;FireDACCommonODBC;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;bindcompfmx;inetdb;FireDACSqliteDriver;DbxClientDriver;soapmidas;vclactnband;fmxFireDAC;dbexpress;DBXMySQLDriver;VclSmp;inet;vcltouch;fmxase;dbrtl;Skia.Package.FMX;fmxdae;FireDACMSAccDriver;CustomIPTransport;vcldsnap;DBXInterBaseDriver;IndySystem;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;adortl;vclimg;FireDACPgDriver;FireDAC;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;fmxobj;bindcompvclsmp;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 79 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 80 | Debug 81 | true 82 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 83 | 1033 84 | $(BDS)\bin\default_app.manifest 85 | 86 | 87 | vclwinx;fmx;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;FireDACCommonODBC;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;bindcompfmx;inetdb;FireDACSqliteDriver;DbxClientDriver;soapmidas;vclactnband;fmxFireDAC;dbexpress;DBXMySQLDriver;VclSmp;inet;vcltouch;fmxase;dbrtl;fmxdae;FireDACMSAccDriver;CustomIPTransport;vcldsnap;DBXInterBaseDriver;IndySystem;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;adortl;vclimg;FireDACPgDriver;FireDAC;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;fmxobj;bindcompvclsmp;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 88 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 89 | Debug 90 | true 91 | 1033 92 | Minesweeper_proj_Icon.ico 93 | $(BDS)\bin\default_app.manifest 94 | none 95 | 96 | 97 | DEBUG;$(DCC_Define) 98 | true 99 | false 100 | true 101 | true 102 | true 103 | true 104 | true 105 | 106 | 107 | false 108 | PerMonitorV2 109 | 110 | 111 | PerMonitorV2 112 | 113 | 114 | false 115 | RELEASE;$(DCC_Define) 116 | 0 117 | 0 118 | 119 | 120 | PerMonitorV2 121 | 122 | 123 | PerMonitorV2 124 | true 125 | 1033 126 | Minesweeper_proj_Icon.ico 127 | 128 | 129 | 130 | MainSource 131 | 132 | 133 |
Form1
134 | dfm 135 |
136 | 137 | 138 | 139 |
DoubleBufferedFrame
140 | dfm 141 | TFrame 142 |
143 | 144 |
BoardFrame
145 | dfm 146 | TFrame 147 |
148 | 149 |
DogFrame
150 | dfm 151 | TFrame 152 |
153 | 154 |
CustomBoardForm
155 | dfm 156 |
157 | 158 |
HighScoresForm
159 | dfm 160 |
161 | 162 | Base 163 | 164 | 165 | Cfg_1 166 | Base 167 | 168 | 169 | Cfg_2 170 | Base 171 | 172 |
173 | 174 | Delphi.Personality.12 175 | Application 176 | 177 | 178 | 179 | Minesweeper_proj.dpr 180 | 181 | 182 | Microsoft Office 2000 Sample Automation Server Wrapper Components 183 | Microsoft Office XP Sample Automation Server Wrapper Components 184 | 185 | 186 | 187 | 188 | 189 | Minesweeper_proj.exe 190 | true 191 | 192 | 193 | 194 | 195 | 1 196 | 197 | 198 | Contents\MacOS 199 | 1 200 | 201 | 202 | 0 203 | 204 | 205 | 206 | 207 | classes 208 | 64 209 | 210 | 211 | classes 212 | 64 213 | 214 | 215 | 216 | 217 | res\xml 218 | 1 219 | 220 | 221 | res\xml 222 | 1 223 | 224 | 225 | 226 | 227 | library\lib\armeabi 228 | 1 229 | 230 | 231 | library\lib\armeabi 232 | 1 233 | 234 | 235 | 236 | 237 | library\lib\armeabi-v7a 238 | 1 239 | 240 | 241 | 242 | 243 | library\lib\mips 244 | 1 245 | 246 | 247 | library\lib\mips 248 | 1 249 | 250 | 251 | 252 | 253 | library\lib\armeabi-v7a 254 | 1 255 | 256 | 257 | library\lib\arm64-v8a 258 | 1 259 | 260 | 261 | 262 | 263 | library\lib\armeabi-v7a 264 | 1 265 | 266 | 267 | 268 | 269 | res\drawable 270 | 1 271 | 272 | 273 | res\drawable 274 | 1 275 | 276 | 277 | 278 | 279 | res\drawable-anydpi-v21 280 | 1 281 | 282 | 283 | res\drawable-anydpi-v21 284 | 1 285 | 286 | 287 | 288 | 289 | res\values 290 | 1 291 | 292 | 293 | res\values 294 | 1 295 | 296 | 297 | 298 | 299 | res\values-v21 300 | 1 301 | 302 | 303 | res\values-v21 304 | 1 305 | 306 | 307 | 308 | 309 | res\values-v31 310 | 1 311 | 312 | 313 | res\values-v31 314 | 1 315 | 316 | 317 | 318 | 319 | res\drawable-anydpi-v26 320 | 1 321 | 322 | 323 | res\drawable-anydpi-v26 324 | 1 325 | 326 | 327 | 328 | 329 | res\drawable 330 | 1 331 | 332 | 333 | res\drawable 334 | 1 335 | 336 | 337 | 338 | 339 | res\drawable 340 | 1 341 | 342 | 343 | res\drawable 344 | 1 345 | 346 | 347 | 348 | 349 | res\drawable 350 | 1 351 | 352 | 353 | res\drawable 354 | 1 355 | 356 | 357 | 358 | 359 | res\drawable-anydpi-v33 360 | 1 361 | 362 | 363 | res\drawable-anydpi-v33 364 | 1 365 | 366 | 367 | 368 | 369 | res\values 370 | 1 371 | 372 | 373 | res\values 374 | 1 375 | 376 | 377 | 378 | 379 | res\values-night-v21 380 | 1 381 | 382 | 383 | res\values-night-v21 384 | 1 385 | 386 | 387 | 388 | 389 | res\drawable 390 | 1 391 | 392 | 393 | res\drawable 394 | 1 395 | 396 | 397 | 398 | 399 | res\drawable-xxhdpi 400 | 1 401 | 402 | 403 | res\drawable-xxhdpi 404 | 1 405 | 406 | 407 | 408 | 409 | res\drawable-xxxhdpi 410 | 1 411 | 412 | 413 | res\drawable-xxxhdpi 414 | 1 415 | 416 | 417 | 418 | 419 | res\drawable-ldpi 420 | 1 421 | 422 | 423 | res\drawable-ldpi 424 | 1 425 | 426 | 427 | 428 | 429 | res\drawable-mdpi 430 | 1 431 | 432 | 433 | res\drawable-mdpi 434 | 1 435 | 436 | 437 | 438 | 439 | res\drawable-hdpi 440 | 1 441 | 442 | 443 | res\drawable-hdpi 444 | 1 445 | 446 | 447 | 448 | 449 | res\drawable-xhdpi 450 | 1 451 | 452 | 453 | res\drawable-xhdpi 454 | 1 455 | 456 | 457 | 458 | 459 | res\drawable-mdpi 460 | 1 461 | 462 | 463 | res\drawable-mdpi 464 | 1 465 | 466 | 467 | 468 | 469 | res\drawable-hdpi 470 | 1 471 | 472 | 473 | res\drawable-hdpi 474 | 1 475 | 476 | 477 | 478 | 479 | res\drawable-xhdpi 480 | 1 481 | 482 | 483 | res\drawable-xhdpi 484 | 1 485 | 486 | 487 | 488 | 489 | res\drawable-xxhdpi 490 | 1 491 | 492 | 493 | res\drawable-xxhdpi 494 | 1 495 | 496 | 497 | 498 | 499 | res\drawable-xxxhdpi 500 | 1 501 | 502 | 503 | res\drawable-xxxhdpi 504 | 1 505 | 506 | 507 | 508 | 509 | res\drawable-small 510 | 1 511 | 512 | 513 | res\drawable-small 514 | 1 515 | 516 | 517 | 518 | 519 | res\drawable-normal 520 | 1 521 | 522 | 523 | res\drawable-normal 524 | 1 525 | 526 | 527 | 528 | 529 | res\drawable-large 530 | 1 531 | 532 | 533 | res\drawable-large 534 | 1 535 | 536 | 537 | 538 | 539 | res\drawable-xlarge 540 | 1 541 | 542 | 543 | res\drawable-xlarge 544 | 1 545 | 546 | 547 | 548 | 549 | res\values 550 | 1 551 | 552 | 553 | res\values 554 | 1 555 | 556 | 557 | 558 | 559 | res\drawable-anydpi-v24 560 | 1 561 | 562 | 563 | res\drawable-anydpi-v24 564 | 1 565 | 566 | 567 | 568 | 569 | res\drawable 570 | 1 571 | 572 | 573 | res\drawable 574 | 1 575 | 576 | 577 | 578 | 579 | res\drawable-night-anydpi-v21 580 | 1 581 | 582 | 583 | res\drawable-night-anydpi-v21 584 | 1 585 | 586 | 587 | 588 | 589 | res\drawable-anydpi-v31 590 | 1 591 | 592 | 593 | res\drawable-anydpi-v31 594 | 1 595 | 596 | 597 | 598 | 599 | res\drawable-night-anydpi-v31 600 | 1 601 | 602 | 603 | res\drawable-night-anydpi-v31 604 | 1 605 | 606 | 607 | 608 | 609 | 1 610 | 611 | 612 | Contents\MacOS 613 | 1 614 | 615 | 616 | 0 617 | 618 | 619 | 620 | 621 | Contents\MacOS 622 | 1 623 | .framework 624 | 625 | 626 | Contents\MacOS 627 | 1 628 | .framework 629 | 630 | 631 | Contents\MacOS 632 | 1 633 | .framework 634 | 635 | 636 | 0 637 | 638 | 639 | 640 | 641 | 1 642 | .dylib 643 | 644 | 645 | 1 646 | .dylib 647 | 648 | 649 | 1 650 | .dylib 651 | 652 | 653 | Contents\MacOS 654 | 1 655 | .dylib 656 | 657 | 658 | Contents\MacOS 659 | 1 660 | .dylib 661 | 662 | 663 | Contents\MacOS 664 | 1 665 | .dylib 666 | 667 | 668 | 0 669 | .dll;.bpl 670 | 671 | 672 | 673 | 674 | 1 675 | .dylib 676 | 677 | 678 | 1 679 | .dylib 680 | 681 | 682 | 1 683 | .dylib 684 | 685 | 686 | Contents\MacOS 687 | 1 688 | .dylib 689 | 690 | 691 | Contents\MacOS 692 | 1 693 | .dylib 694 | 695 | 696 | Contents\MacOS 697 | 1 698 | .dylib 699 | 700 | 701 | 0 702 | .bpl 703 | 704 | 705 | 706 | 707 | 0 708 | 709 | 710 | 0 711 | 712 | 713 | 0 714 | 715 | 716 | 0 717 | 718 | 719 | 0 720 | 721 | 722 | Contents\Resources\StartUp\ 723 | 0 724 | 725 | 726 | Contents\Resources\StartUp\ 727 | 0 728 | 729 | 730 | Contents\Resources\StartUp\ 731 | 0 732 | 733 | 734 | 0 735 | 736 | 737 | 738 | 739 | 1 740 | 741 | 742 | 1 743 | 744 | 745 | 746 | 747 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 748 | 1 749 | 750 | 751 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 752 | 1 753 | 754 | 755 | 756 | 757 | ..\ 758 | 1 759 | 760 | 761 | ..\ 762 | 1 763 | 764 | 765 | ..\ 766 | 1 767 | 768 | 769 | 770 | 771 | Contents 772 | 1 773 | 774 | 775 | Contents 776 | 1 777 | 778 | 779 | Contents 780 | 1 781 | 782 | 783 | 784 | 785 | Contents\Resources 786 | 1 787 | 788 | 789 | Contents\Resources 790 | 1 791 | 792 | 793 | Contents\Resources 794 | 1 795 | 796 | 797 | 798 | 799 | library\lib\armeabi-v7a 800 | 1 801 | 802 | 803 | library\lib\arm64-v8a 804 | 1 805 | 806 | 807 | 1 808 | 809 | 810 | 1 811 | 812 | 813 | 1 814 | 815 | 816 | 1 817 | 818 | 819 | Contents\MacOS 820 | 1 821 | 822 | 823 | Contents\MacOS 824 | 1 825 | 826 | 827 | Contents\MacOS 828 | 1 829 | 830 | 831 | 0 832 | 833 | 834 | 835 | 836 | library\lib\armeabi-v7a 837 | 1 838 | 839 | 840 | 841 | 842 | 1 843 | 844 | 845 | 1 846 | 847 | 848 | 1 849 | 850 | 851 | 852 | 853 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 854 | 1 855 | 856 | 857 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 858 | 1 859 | 860 | 861 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 862 | 1 863 | 864 | 865 | 866 | 867 | ..\ 868 | 1 869 | 870 | 871 | ..\ 872 | 1 873 | 874 | 875 | ..\ 876 | 1 877 | 878 | 879 | 880 | 881 | 1 882 | 883 | 884 | 1 885 | 886 | 887 | 1 888 | 889 | 890 | 891 | 892 | ..\$(PROJECTNAME).launchscreen 893 | 64 894 | 895 | 896 | ..\$(PROJECTNAME).launchscreen 897 | 64 898 | 899 | 900 | 901 | 902 | 1 903 | 904 | 905 | 1 906 | 907 | 908 | 1 909 | 910 | 911 | 912 | 913 | Assets 914 | 1 915 | 916 | 917 | Assets 918 | 1 919 | 920 | 921 | 922 | 923 | Assets 924 | 1 925 | 926 | 927 | Assets 928 | 1 929 | 930 | 931 | 932 | 933 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 934 | 1 935 | 936 | 937 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 938 | 1 939 | 940 | 941 | 942 | 943 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 944 | 1 945 | 946 | 947 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 948 | 1 949 | 950 | 951 | 952 | 953 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 954 | 1 955 | 956 | 957 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 958 | 1 959 | 960 | 961 | 962 | 963 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 964 | 1 965 | 966 | 967 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 968 | 1 969 | 970 | 971 | 972 | 973 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 974 | 1 975 | 976 | 977 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 978 | 1 979 | 980 | 981 | 982 | 983 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 984 | 1 985 | 986 | 987 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 988 | 1 989 | 990 | 991 | 992 | 993 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 994 | 1 995 | 996 | 997 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 998 | 1 999 | 1000 | 1001 | 1002 | 1003 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1004 | 1 1005 | 1006 | 1007 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1008 | 1 1009 | 1010 | 1011 | 1012 | 1013 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1014 | 1 1015 | 1016 | 1017 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1018 | 1 1019 | 1020 | 1021 | 1022 | 1023 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1024 | 1 1025 | 1026 | 1027 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1028 | 1 1029 | 1030 | 1031 | 1032 | 1033 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1034 | 1 1035 | 1036 | 1037 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1038 | 1 1039 | 1040 | 1041 | 1042 | 1043 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1044 | 1 1045 | 1046 | 1047 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1048 | 1 1049 | 1050 | 1051 | 1052 | 1053 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1054 | 1 1055 | 1056 | 1057 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1058 | 1 1059 | 1060 | 1061 | 1062 | 1063 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1064 | 1 1065 | 1066 | 1067 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1068 | 1 1069 | 1070 | 1071 | 1072 | 1073 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1074 | 1 1075 | 1076 | 1077 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1078 | 1 1079 | 1080 | 1081 | 1082 | 1083 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1084 | 1 1085 | 1086 | 1087 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1088 | 1 1089 | 1090 | 1091 | 1092 | 1093 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1094 | 1 1095 | 1096 | 1097 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1098 | 1 1099 | 1100 | 1101 | 1102 | 1103 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1104 | 1 1105 | 1106 | 1107 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1108 | 1 1109 | 1110 | 1111 | 1112 | 1113 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1114 | 1 1115 | 1116 | 1117 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1118 | 1 1119 | 1120 | 1121 | 1122 | 1123 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1124 | 1 1125 | 1126 | 1127 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1128 | 1 1129 | 1130 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | True 1146 | True 1147 | 1148 | 1149 | 12 1150 | 1151 | 1152 | 1153 | 1154 |
1155 | -------------------------------------------------------------------------------- /Minesweeper_proj.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ForgotMyCode/Minesweeper/cd6d20bea949ba96edb4859db6b84d136d0824b5/Minesweeper_proj.res -------------------------------------------------------------------------------- /Minesweeper_proj_Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ForgotMyCode/Minesweeper/cd6d20bea949ba96edb4859db6b84d136d0824b5/Minesweeper_proj_Icon.ico -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | ![Screenshot](screenshot.png) 2 | 3 | ## Minesweeper game 4 | 5 | Minesweeper written in Delphi using RAD Studio for the [Ideasawakened challenge](https://ideasawakened.com/post/rad-programmer-challenge-number-1-minesweeper-game-build). 6 | 7 | ## Features 8 | 9 | * Traditional rules: Reveal tiles, or flag them to mark a mine. 10 | * High scores 11 | * Help: Are your flags placed correctly? 12 | * Various board size 13 | * Custom board 14 | * Timer 15 | * Remaining mines 16 | * Watchdog 🐶 17 | * Visual twist, all the visuals are made by hand 18 | 19 | ## Requirements 20 | 21 | Delphi 12 22 | -------------------------------------------------------------------------------- /UBoardFrame.dfm: -------------------------------------------------------------------------------- 1 | inherited BoardFrame: TBoardFrame 2 | inherited PaintBox1: TPaintBox 3 | OnMouseDown = PaintBox2MouseDown 4 | OnMouseMove = PaintBox1MouseMove 5 | OnMouseUp = PaintBox1MouseUp 6 | end 7 | object Timer1: TTimer 8 | Interval = 35 9 | OnTimer = Timer1Timer 10 | Left = 248 11 | Top = 296 12 | end 13 | object ImageList_Fields: TImageList 14 | ColorDepth = cd32Bit 15 | Height = 20 16 | Width = 20 17 | Left = 136 18 | Top = 256 19 | Bitmap = { 20 | 494C01010E001800040014001400FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 21 | 0000000000003600000028000000500000005000000001002000000000000064 22 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 23 | FFFF0000FFFF0003FFFF0105FFFF0107FFFF020AFEFF020CFEFF0410FEFF0C1F 24 | FCFF1F41F4FF0A1DFDFF0613FDFF0B1DFCFF0B1DFCFF0C1FFCFF0E22FCFF122A 25 | FAFF63A9B2FF61A8B0FF61A8B0FF5EA6AEFF5EA6AEFF5DA3ADFF5AA2ABFF5AA2 26 | ABFF57A0A9FF559DA7FF559DA7FF5298A3FF5298A3FF5196A0FF4F939EFF4F93 27 | 9EFF4D909BFF4C8D9AFF4C8D9AFF4C8D9AFF0000000000000000000000000000 28 | 0000000000000000000000000000000000000000000000000000000000000000 29 | 0000000000000000000000000000000000000000000000000000000000000000 30 | 0000000000000000000000000000000000000000000000000000000000000000 31 | 0000000000000000000000000000000000000000000000000000000000000000 32 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 33 | FFFF040FFEFF1228FBFF0E1FF9FF0207FEFF0107FEFF030CFEFF030DFEFF030D 34 | FEFF030DFEFF0411FEFF0512FDFF0411FEFF0716FDFF0818FDFF0A1CFDFF132A 35 | FAFF64ABB3FF63A9B2FF61A8B0FF61A8B0FF5EA6AEFF5EA6AEFF4B7C8AFF4573 36 | 82FF447280FF51949EFF559DA7FF559DA7FF5298A3FF5298A3FF5196A0FF4D8D 37 | 98FF4F939EFF4D909BFF4C8D9AFF4C8D9AFF0000000000000000000000000000 38 | 0000000000000000000000000000000000000000000000000000000000000000 39 | 0000000000000000000000000000000000000000000000000000000000000000 40 | 0000000000000000000000000000000000000000000000000000000000000000 41 | 0000000000000000000000000000000000000000000000000000000000000000 42 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 43 | FFFF0000FFFF2136EFFF314387FF2636A4FF2130B6FF1E2DCBFF1322FBFF0814 44 | FEFF0712FEFF0F1EFDFF1726F2FF1B2BE8FF243AEAFF2139F9FF091AFDFF1630 45 | F8FF64ABB3FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF537D8AFF35495EFF2F42 46 | 57FF2D3F54FF304558FF6399A2FF72B1B8FF72B1B8FF61989EFF3B5A66FF3E5C 47 | 6CFF4F7885FF70AEB5FF4D909BFF4C8D9AFF0000000000000000000000000000 48 | 0000000000000000000000000000000000000000000000000000000000000000 49 | 0000000000000000000000000000000000000000000000000000000000000000 50 | 0000000000000000000000000000000000000000000000000000000000000000 51 | 0000000000000000000000000000000000000000000000000000000000000000 52 | 0000000000000000000000000000000000000000FFFF0000FFFF243DF9FF0000 53 | FFFF0000FFFF1624EBFF2B3C52FF243249FF202C43FF27394DFF293B76FF243C 54 | F6FF1223FBFF354E70FF2A3D75FF2A3C7CFF2132BDFF263CE3FF1329FAFF152E 55 | F9FF66ACB4FF64ABB3FF72B1B8FF72B1B8FF3C4B57FF2D243BFF1D0F26FF1C0B 56 | 22FF1C0821FF22112AFF23132BFF33404AFF2B343EFF1E1627FF1E1126FF2214 57 | 2BFF2F4557FF496E7CFF4E909BFF4D909BFF0000000000000000000000000000 58 | 0000000000000000000000000000000000000000000000000000000000000000 59 | 0000000000000000000000000000000000000000000000000000000000000000 60 | 0000000000000000000000000000000000000000000000000000000000000000 61 | 0000000000000000000000000000000000000000000000000000000000000000 62 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 63 | FFFF0000FFFF2E46C1FF26344BFF18233AFF141E36FF162138FF293A4EFF2D43 64 | 79FF2C3F52FF26364BFF28384DFF293A4FFF283A61FF2235D2FF1126F9FF1833 65 | F8FF66ACB4FF66ACB4FF72B1B8FF72B1B8FF40525DFF211C2DFF16081BFF1102 66 | 15FF110214FF120216FF160A1DFF170E1EFF170B1DFF16081BFF180A1EFF2916 67 | 32FF293B4FFF385363FF498491FF4F939EFF0000000000000000000000000000 68 | 0000000000000000000000000000000000000000000000000000000000000000 69 | 0000000000000000000000000000000000000000000000000000000000000000 70 | 0000000000000000000000000000000000000000000000000000000000000000 71 | 0000000000000000000000000000000000000000000000000000000000000000 72 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 73 | FFFF304FF4FF55828DFF1F2B42FF19233BFF141E36FF141E36FF1A243CFF2534 74 | 4AFF1E2A42FF1B263EFF212D44FF202C43FF253349FF1E2DCDFF152FF8FF142C 75 | FAFF68ADB5FF66ACB4FF72B1B8FF72B1B8FF40525DFF353A4AFF1B0822FF1704 76 | 1BFF150318FF150318FF150419FF17081CFF110316FF140418FF1D0922FF200B 77 | 26FF253349FF304658FF4F919CFF4F939EFF0000000000000000000000000000 78 | 0000000000000000000000000000000000000000000000000000000000000000 79 | 0000000000000000000000000000000000000000000000000000000000000000 80 | 0000000000000000000000000000000000000000000000000000000000000000 81 | 0000000000000000000000000000000000000000000000000000000000000000 82 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF2C47 83 | EBFF3F5D6EFF1F2C42FF151F37FF141F36FF141E36FF151F36FF141E36FF151F 84 | 37FF141E36FF141E36FF141E36FF141E36FF18228DFF1520D5FF1127F9FF1936 85 | F8FF6AAEB5FF68ADB5FF72B1B8FF5B8B96FF3F5D6EFF1F2C42FF151F37FF141F 86 | 36FF10192EFF11192EFF10182DFF1A041EFF17031BFF0C1426FF0F182DFF141E 87 | 36FF1C283FFF29384FFF47818EFF5196A0FF0000000000000000000000000000 88 | 0000000000000000000000000000000000000000000000000000000000000000 89 | 0000000000000000000000000000000000000000000000000000000000000000 90 | 0000000000000000000000000000000000000000000000000000000000000000 91 | 0000000000000000000000000000000000000000000000000000000000000000 92 | 0000000000000000000000000000000000000000FFFF0000FFFF2942EEFF2F3E 93 | 58FF222E47FF141F36FF1A243CFF19243CFF141E36FF141E36FF151F36FF141E 94 | 36FF141E36FF141E36FF1F2942FF1E2941FF1B26B0FF1E32E4FF1129FBFF1A39 95 | F7FF6AAEB5FF6AAEB5FF5B8B96FF2F3E58FF222E47FF141F36FF1A243CFF1924 96 | 3CFF141E36FF141E36FF151F36FF1C0420FF1C0420FF10192EFF1F2942FF1E29 97 | 41FF25324AFF3F616EFF5298A3FF5196A0FF0000000000000000000000000000 98 | 0000000000000000000000000000000000000000000000000000000000000000 99 | 0000000000000000000000000000000000000000000000000000000000000000 100 | 0000000000000000000000000000000000000000000000000000000000000000 101 | 0000000000000000000000000000000000000000000000000000000000000000 102 | 0000000000000000000000000000000000000000FFFF1528FBFF2735AAFF2935 103 | 4FFF141E36FF141E36FF202B44FF232D47FF1A233CFF141E36FF141E36FF141E 104 | 36FF19233BFF18223AFF1D2740FF232F5BFF2232ABFF1E34F8FF1733F9FF1F40 105 | F5FF6CAFB6FF64A4ACFF31425AFF29354FFF141E36FF141E36FF202B44FF232D 106 | 47FF1A233CFF141E36FF10192EFF1C0420FF1D0621FF18223AFF1D2740FF2430 107 | 48FF2B3F52FF659DA5FF559DA7FF5298A3FF0000000000000000000000000000 108 | 0000000000000000000000000000000000000000000000000000000000000000 109 | 0000000000000000000000000000000000000000000000000000000000000000 110 | 0000000000000000000000000000000000000000000000000000000000000000 111 | 0000000000000000000000000000000000000000000000000000000000000000 112 | 0000000000000000000000000000000000000000FFFF1525F3FF2532AAFF202B 113 | 44FF141E36FF19233BFF1B253DFF18223AFF141E36FF141E36FF141E36FF141E 114 | 36FF202A43FF172139FF172139FF1D2740FF2E4285FF2A45EFFF142EF9FF1E3F 115 | F6FF66A5ADFF456B7AFF2F3E57FF202B44FF141E36FF19233BFF1B253DFF1822 116 | 3AFF141E36FF141E36FF10192EFF1C0420FF210B27FF172139FF172139FF1D27 117 | 40FF32475BFF5F939CFF5398A3FF559DA7FF0000000000000000000000000000 118 | 0000000000000000000000000000000000000000000000000000000000000000 119 | 0000000000000000000000000000000000000000000000000000000000000000 120 | 0000000000000000000000000000000000000000000000000000000000000000 121 | 0000000000000000000000000000000000000000000000000000000000000000 122 | 0000000000000000000000000000000000000000FFFF0913F9FF29376BFF1F29 123 | 42FF141E36FF141E36FF141E36FF141E36FF141E36FF141E36FF141E36FF151F 124 | 37FF1B253EFF1E2841FF182239FF1D2740FF243172FF2E45C8FF1936F8FF2043 125 | F5FF629CA5FF3D5C6DFF2B3953FF1F2942FF141E36FF141E36FF141E36FF141E 126 | 36FF141E36FF141E36FF0700E3FF0500C6FF270B2DFF1E2841FF182239FF1D27 127 | 40FF26344CFF426172FF559BA5FF559DA7FF0000000000000000000000000000 128 | 0000000000000000000000000000000000000000000000000000000000000000 129 | 0000000000000000000000000000000000000000000000000000000000000000 130 | 0000000000000000000000000000000000000000000000000000000000000000 131 | 0000000000000000000000000000000000000000000000000000000000000000 132 | 0000000000000000000000000000000000000000FFFF2036F0FF2536BDFF212D 133 | 5DFF19233BFF141E36FF141E36FF151F37FF18223AFF18223AFF19233BFF1A24 134 | 3CFF1A243CFF19233BFF18223AFF1E2941FF233170FF2334C3FF2348F4FF2247 135 | F4FF6DABB2FF53828EFF33495EFF222E46FF19233BFF141E36FF141E36FF0700 136 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF270B2DFF19233BFF18223AFF1E29 137 | 41FF253449FF334A5CFF57A0A9FF57A0A9FF0000000000000000000000000000 138 | 0000000000000000000000000000000000000000000000000000000000000000 139 | 0000000000000000000000000000000000000000000000000000000000000000 140 | 0000000000000000000000000000000000000000000000000000000000000000 141 | 0000000000000000000000000000000000000000000000000000000000000000 142 | 0000000000000000000000000000000000000000FFFF0000FFFF2C47ECFF334B 143 | ABFF23335FFF1B263EFF1A253DFF1C263FFF1A243CFF1A243CFF1C263EFF1F29 144 | 42FF19243BFF18233AFF1D2840FF233147FF223070FF2335C5FF2244F3FF2449 145 | F3FF70B0B7FF6BA7AFFF5D8F99FF3E5A6AFF243548FF0700E3FF0700E3FF0700 146 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF260B2CFF18233AFF1D2840FF2331 147 | 47FF243349FF344C5DFF569AA3FF57A0A9FF0000000000000000000000000000 148 | 0000000000000000000000000000000000000000000000000000000000000000 149 | 0000000000000000000000000000000000000000000000000000000000000000 150 | 0000000000000000000000000000000000000000000000000000000000000000 151 | 0000000000000000000000000000000000000000000000000000000000000000 152 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF314F 153 | F0FF4062C9FF233147FF1D2740FF1D2740FF1B253EFF1A243CFF1A243CFF1A25 154 | 3CFF1A253CFF1C283FFF212E45FF233147FF233283FF314BDCFF2244F5FF264B 155 | F3FF72B1B8FF70B0B7FF70ADB5FF69A3AAFF0700E3FF0700E3FF0700E3FF0700 156 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF270B2DFF1C283FFF212E45FF2331 157 | 47FF27374CFF517987FF5DA3ADFF5AA2ABFF0000000000000000000000000000 158 | 0000000000000000000000000000000000000000000000000000000000000000 159 | 0000000000000000000000000000000000000000000000000000000000000000 160 | 0000000000000000000000000000000000000000000000000000000000000000 161 | 0000000000000000000000000000000000000000000000000000000000000000 162 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0001 163 | FFFF3657F1FF2231ACFF1F2B43FF1E2841FF1C263EFF1C263EFF1E2A42FF1E2B 164 | 41FF202F44FF283A4EFF2030A5FF2D418FFF2E48DCFF2B47F6FF1B37F9FF284E 165 | F2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF2C3E52FF0700E3FF0700 166 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF27102FFF283A4EFF293C4FFF3248 167 | 5BFF4F7684FF72B1B8FF5DA3ADFF5DA3ADFF0000000000000000000000000000 168 | 0000000000000000000000000000000000000000000000000000000000000000 169 | 0000000000000000000000000000000000000000000000000000000000000000 170 | 0000000000000000000000000000000000000000000000000000000000000000 171 | 0000000000000000000000000000000000000000000000000000000000000000 172 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 173 | FFFF0000FFFF2033D4FF1F2B53FF1E2A41FF1D2940FF1D2940FF212E44FF2535 174 | 49FF4369A0FF2A45EAFF2B46F1FF2841F3FF253EF8FF1B2EFBFF203FF7FF274C 175 | F2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF6DA9B1FF375262FF202C44FF1E2A 176 | 41FF0700E3FF0700E3FF0700E3FF0700E3FF313343FF56868FFF649BA4FF669E 177 | A7FF72B1B8FF72B1B8FF5EA6AEFF5DA3ADFF0000000000000000000000000000 178 | 0000000000000000000000000000000000000000000000000000000000000000 179 | 0000000000000000000000000000000000000000000000000000000000000000 180 | 0000000000000000000000000000000000000000000000000000000000000000 181 | 0000000000000000000000000000000000000000000000000000000000000000 182 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 183 | FFFF0000FFFF2F4AD0FF202D54FF1F2A42FF1E2A41FF202D44FF27394CFF3353 184 | BFFF2E4BF5FF2742F8FF253DF9FF1F35FAFF1C31FBFF1D32FBFF2041F6FF305B 185 | EDFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF476C78FF212E45FF1F2A 186 | 42FF1E2A41FF0700E3FF0700E3FF0700E3FF40525DFF72B1B8FF72B1B8FF72B1 187 | B8FF72B1B8FF72B1B8FF5EA6AEFF5EA6AEFF0000000000000000000000000000 188 | 0000000000000000000000000000000000000000000000000000000000000000 189 | 0000000000000000000000000000000000000000000000000000000000000000 190 | 0000000000000000000000000000000000000000000000000000000000000000 191 | 0000000000000000000000000000000000000000000000000000000000000000 192 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 193 | FFFF0000FFFF0B19FEFF395664FF26354AFF25354AFF2B4289FF324FCDFF395C 194 | F0FF2943F7FF2944F6FF243CF8FF2F4EF5FF3252F3FF2A46F6FF2E57F0FF2C54 195 | F0FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF395664FF2635 196 | 4AFF25354AFF304858FF49707BFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 197 | B8FF72B1B8FF72B1B8FF61A8B0FF5EA6AEFF0000000000000000000000000000 198 | 0000000000000000000000000000000000000000000000000000000000000000 199 | 0000000000000000000000000000000000000000000000000000000000000000 200 | 0000000000000000000000000000000000000000000000000000000000000000 201 | 0000000000000000000000000000000000000000000000000000000000000000 202 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 203 | FFFF0000FFFF0000FFFF192CFBFF3858C0FF3556CFFF385DDFFF3961EDFF1B32 204 | FAFF1326FCFF1930FBFF213DF8FF1A32FAFF2747F5FF2D52F1FF0E20FDFF0000 205 | FFFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF4871 206 | 7DFF4C7985FF5A919AFF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64AB 207 | B3FF64ABB3FF63A9B2FF63A9B2FF61A8B0FF0000000000000000000000000000 208 | 0000000000000000000000000000000000000000000000000000000000000000 209 | 0000000000000000000000000000000000000000000000000000000000000000 210 | 0000000000000000000000000000000000000000000000000000000000000000 211 | 0000000000000000000000000000000000000000000000000000000000000000 212 | 0000000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000 213 | FFFF0000FFFF0000FFFF0000FFFF182BFBFF233CF8FF2038F9FF0000FFFF0000 214 | FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 215 | FFFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0 216 | B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66AC 217 | B4FF64ABB3FF64ABB3FF63A9B2FF63A9B2FF0000000000000000000000000000 218 | 0000000000000000000000000000000000000000000000000000000000000000 219 | 0000000000000000000000000000000000000000000000000000000000000000 220 | 0000000000000000000000000000000000000000000000000000000000000000 221 | 0000000000000000000000000000000000000000000000000000000000000000 222 | 00000000000000000000000000000000000062AAB3FF60AAB2FF60AAB2FF5EA9 223 | B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2 224 | ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559CA4FF559C 225 | A4FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8 226 | B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569F 227 | A7FF559EA5FF559CA4FF559CA4FF559CA4FF62AAB3FF60AAB2FF60AAB2FF5EA9 228 | B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2 229 | ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559CA4FF559C 230 | A4FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8 231 | B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569F 232 | A7FF559EA5FF559CA4FF559CA4FF559CA4FF64ABB3FF62AAB3FF60AAB2FF60AA 233 | B2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5 234 | AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559C 235 | A4FF64ABB3FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8 236 | B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569F 237 | A7FF569FA7FF559EA5FF559CA4FF559CA4FF64ABB3FF62AAB3FF60AAB2FF60AA 238 | B2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5 239 | AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559C 240 | A4FF64ABB3FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF4A818DFF4577 241 | 85FF437683FF539BA4FF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF5399 242 | A1FF569FA7FF559EA5FF559CA4FF559CA4FF64ABB3FF64ABB3FF72B1B8FF72B1 243 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 244 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF559EA5FF559C 245 | A4FF64ABB3FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 246 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 247 | B8FF72B1B8FF72B1B8FF559EA5FF559CA4FF64ABB3FF64ABB3FF72B1B8FF72B1 248 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 249 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF559EA5FF559C 250 | A4FF64ABB3FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF537D8AFF35495EFF2F42 251 | 57FF2D3F54FF304558FF6399A2FF72B1B8FF72B1B8FF72B1B8FF466A78FF3E5C 252 | 6CFF4F7885FF70AEB5FF559EA5FF559CA4FF66ACB4FF64ABB3FF72B1B8FF72B1 253 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 254 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF559E 255 | A5FF66ACB4FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 256 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 257 | B8FF72B1B8FF72B1B8FF569FA7FF559EA5FF66ACB4FF64ABB3FF72B1B8FF72B1 258 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 259 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF559E 260 | A5FF66ACB4FF64ABB3FF72B1B8FF72B1B8FF69A3ABFF3B5668FF2B3C52FF2432 261 | 49FF202C43FF27394DFF2C3F53FF6AA4ACFF61989FFF365060FF2D4054FF2D40 262 | 54FF2F4557FF496E7CFF559CA4FF559EA5FF66ACB4FF66ACB4FF72B1B8FF72B1 263 | B8FF72B1B8FF72B1B8FF6FADB4FF517E85FF2E4C4FFF0F1E20FF0E1C1DFF2D4A 264 | 4DFF518085FF6FADB4FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF569F 265 | A7FF66ACB4FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF6AABAEFF208566FF1D85 266 | 64FF1D8564FF5AA09CFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 267 | B8FF72B1B8FF72B1B8FF569FA7FF569FA7FF66ACB4FF66ACB4FF72B1B8FF72B1 268 | B8FF72B1B8FF75B2B9FFB9D3D6FFE4EDEEFFF6F9F9FFFDFDFDFFFBFCFCFFEFF4 269 | F4FFD1E1E4FF8EBDC2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF569F 270 | A7FF66ACB4FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF3F5D6EFF26344BFF1823 271 | 3AFF141E36FF162138FF293A4EFF304758FF2C3F52FF26364BFF28384DFF293A 272 | 4FFF293B4FFF385363FF4F8F99FF569FA7FF68ADB5FF66ACB4FF72B1B8FF72B1 273 | B8FF72B1B8FF6FACB3FF2E4B4EFF000000FF000000FF000000FF000000FF0000 274 | 00FF000000FF2D4A4DFF6EABB2FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF569F 275 | A7FF68ADB5FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF519B92FF1D85 276 | 64FF1D8564FF2B886CFF6FAEB4FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 277 | B8FF72B1B8FF72B1B8FF57A1A9FF569FA7FF68ADB5FF66ACB4FF72B1B8FF72B1 278 | B8FF73B1B8FFE0EAECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 279 | FFFFFFFFFFFFF9FBFBFFA2C6CBFF72B1B8FF72B1B8FF72B1B8FF57A1A9FF569F 280 | A7FF68ADB5FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF55828DFF1F2B42FF1923 281 | 3BFF141E36FF141E36FF1A243CFF25344AFF1E2A42FF1B263EFF212D44FF202C 282 | 43FF253349FF304658FF549CA4FF569FA7FF6AAEB5FF68ADB5FF72B1B8FF72B1 283 | B8FF72B1B8FF4C787DFF000000FF000000FF37585CFF6CA8AFFF6CA8AEFF3555 284 | 59FF000000FF000000FF4C777CFF72B1B8FF72B1B8FF72B1B8FF57A1A9FF57A1 285 | A9FF6AAEB5FF68ADB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF6FAFB5FF2C8A 286 | 6EFF1D8564FF1D8564FF519B92FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 287 | B8FF72B1B8FF72B1B8FF57A1A9FF57A1A9FF6AAEB5FF68ADB5FF72B1B8FF72B1 288 | B8FFA8CACEFFFFFFFFFFFFFFFFFFFDFEFEFFBDD5D8FF80B6BDFF86B9BFFFD7E5 289 | E7FFFFFFFFFFFFFFFFFFEDF3F4FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF57A1 290 | A9FF6AAEB5FF68ADB5FF72B1B8FF5B8B96FF3F5D6EFF1F2C42FF151F37FF141F 291 | 36FF141E36FF151F36FF141E36FF151F37FF141E36FF141E36FF141E36FF141E 292 | 36FF1C283FFF29384FFF4C8B95FF57A1A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1 293 | B8FF72B1B8FF1F3638FF000000FF000000FF639BA2FF72B1B8FF72B1B8FF5E94 294 | 9AFF000000FF000000FF263F42FF72B1B8FF72B1B8FF72B1B8FF57A2ABFF57A1 295 | A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5CA2 296 | 9EFF1D8564FF1D8564FF218667FF6BACAFFF72B1B8FF72B1B8FF72B1B8FF72B1 297 | B8FF72B1B8FF72B1B8FF57A2ABFF57A1A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1 298 | B8FFB9D3D6FFFFFFFFFFFFFFFFFFE7EFF0FF72B1B8FF72B1B8FF72B1B8FF9FC5 299 | CAFFFFFFFFFFFFFFFFFFFCFDFDFF72B1B8FF72B1B8FF72B1B8FF57A2ABFF57A1 300 | A9FF6AAEB5FF6AAEB5FF5B8B96FF2F3E58FF222E47FF141F36FF1A243CFF1924 301 | 3CFF141E36FF141E36FF151F36FF141E36FF141E36FF141E36FF1F2942FF1E29 302 | 41FF25324AFF3F616EFF57A2ABFF57A1A9FF6CAFB6FF6AAEB5FF72B1B8FF72B1 303 | B8FF6EABB2FF000000FF000000FF000000FF6EABB2FF72B1B8FF72B1B8FF6096 304 | 9CFF000000FF000000FF1A2D2FFF72B1B8FF72B1B8FF72B1B8FF58A5AEFF57A2 305 | ABFF6CAFB6FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 306 | B8FF3B8E7BFF1D8564FF1D8564FF469587FF72B1B8FF72B1B8FF72B1B8FF72B1 307 | B8FF72B1B8FF72B1B8FF58A5AEFF57A2ABFF6CAFB6FF6AAEB5FF72B1B8FF72B1 308 | B8FF8EBDC2FFFBFCFCFFFFFFFFFFF4F7F8FF7CB5BBFF72B1B8FFA6C8CDFFE9F0 309 | F1FFFFFFFFFFFFFFFFFFE9F0F1FF72B1B8FF72B1B8FF72B1B8FF58A5AEFF57A2 310 | ABFF6CAFB6FF64A4ACFF31425AFF29354FFF141E36FF141E36FF202B44FF232D 311 | 47FF1A233CFF141E36FF141E36FF141E36FF19233BFF18223AFF1D2740FF2430 312 | 48FF2B3F52FF659DA5FF58A5AEFF57A2ABFF6CAFB6FF6CAFB6FF72B1B8FF72B1 313 | B8FF6BA7AEFF000000FF000000FF000000FF67A0A7FF71AFB6FF69A4AAFF3657 314 | 5BFF000000FF000000FF385A5DFF72B1B8FF72B1B8FF72B1B8FF58A5AEFF58A5 315 | AEFF6CAFB6FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 316 | B8FF66A8AAFF1D8564FF1D8564FF1D8564FF65A7A8FF72B1B8FF72B1B8FF72B1 317 | B8FF72B1B8FF72B1B8FF58A5AEFF58A5AEFF6CAFB6FF6CAFB6FF72B1B8FF72B1 318 | B8FF72B1B8FFA2C6CBFFEDF2F3FFFFFFFFFFEBF1F2FFF3F7F7FFFFFFFFFFFFFF 319 | FFFFFFFFFFFFF7F9F9FF9CC3C8FF72B1B8FF72B1B8FF72B1B8FF58A5AEFF58A5 320 | AEFF66A5ADFF456B7AFF2F3E57FF202B44FF141E36FF19233BFF1B253DFF1822 321 | 3AFF141E36FF141E36FF141E36FF141E36FF202A43FF172139FF172139FF1D27 322 | 40FF32475BFF5F939CFF56A0AAFF58A5AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1 323 | B8FF6FACB3FF000000FF000000FF000000FF000000FF000000FF000000FF0000 324 | 00FF000000FF030A0BFF61989EFF72B1B8FF72B1B8FF72B1B8FF59A7AFFF58A5 325 | AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 326 | B8FF72B1B8FF499689FF1D8564FF1D8564FF3A8E7AFF72B1B8FF72B1B8FF72B1 327 | B8FF72B1B8FF72B1B8FF59A7AFFF58A5AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1 328 | B8FF72B1B8FF7EB6BCFFD7E4E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 329 | FFFFEFF4F4FF8ABBC1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF58A5 330 | AEFF629CA5FF3D5C6DFF2B3953FF1F2942FF141E36FF141E36FF141E36FF141E 331 | 36FF141E36FF141E36FF141E36FF151F37FF1B253EFF1E2841FF182239FF1D27 332 | 40FF26344CFF426172FF57A2ABFF58A5AEFF70B0B7FF6EAFB7FF72B1B8FF72B1 333 | B8FF72B1B8FF233B3DFF000000FF000000FF4F7C82FF395C60FF1C3033FF1A2D 334 | 2FFF3A5E62FF629AA0FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF59A7 335 | AFFF70B0B7FF6EAFB7FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 336 | B8FF72B1B8FF6DADB2FF258669FF1D8564FF1D8564FF5DA3A0FF72B1B8FF72B1 337 | B8FF72B1B8FF72B1B8FF59A7AFFF59A7AFFF70B0B7FF6EAFB7FF72B1B8FF72B1 338 | B8FF72B1B8FFDFEAEBFFFFFFFFFFFFFFFFFFFCFDFDFFDAE6E8FFB1CED2FFF0F5 339 | F5FFFFFFFFFFEFF4F5FF8ABBC1FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF59A7 340 | AFFF6DABB2FF53828EFF33495EFF222E46FF19233BFF141E36FF141E36FF151F 341 | 37FF18223AFF18223AFF19233BFF1A243CFF1A243CFF19233BFF18223AFF1E29 342 | 41FF253449FF334A5CFF59A7AFFF59A7AFFF70B0B7FF70B0B7FF72B1B8FF72B1 343 | B8FF72B1B8FF4B767BFF000000FF000000FF4B777BFF72B1B8FF72B1B8FF72B1 344 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5BA8B0FF59A7 345 | AFFF70B0B7FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 346 | B8FF72B1B8FF72B1B8FF569D97FF1D8564FF1D8564FF2F8970FF70B0B5FF72B1 347 | B8FF72B1B8FF72B1B8FF5BA8B0FF59A7AFFF70B0B7FF70B0B7FF72B1B8FF72B1 348 | B8FF7CB5BBFFFEFEFEFFFFFFFFFFFFFFFFFFA4C7CCFF72B1B8FF72B1B8FFC5DA 349 | DDFFFFFFFFFFFFFFFFFFD1E1E4FF72B1B8FF72B1B8FF72B1B8FF5BA8B0FF59A7 350 | AFFF70B0B7FF6BA7AFFF5D8F99FF3E5A6AFF243548FF1B263EFF1A253DFF1C26 351 | 3FFF1A243CFF1A243CFF1C263EFF1F2942FF19243BFF18233AFF1D2840FF2331 352 | 47FF243349FF344C5DFF579FA8FF59A7AFFF72B1B8FF70B0B7FF72B1B8FF72B1 353 | B8FF72B1B8FF6CA8AFFF1C3033FF000000FF000000FF4C787CFF69A4AAFF71AF 354 | B6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8 355 | B0FF72B1B8FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 356 | B8FF72B1B8FF72B1B8FF71B0B6FF328C73FF1D8564FF1D8564FF549D96FF72B1 357 | B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8B0FF72B1B8FF70B0B7FF72B1B8FF72B1 358 | B8FF78B3BAFFFAFCFCFFFFFFFFFFFFFFFFFFC3D9DCFF7EB6BCFF8DBCC2FFE7EF 359 | F0FFFFFFFFFFFFFFFFFFD9E6E8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8 360 | B0FF72B1B8FF70B0B7FF70ADB5FF69A3AAFF55818DFF233147FF1D2740FF1D27 361 | 40FF1B253EFF1A243CFF1A243CFF1A253CFF1A253CFF1C283FFF212E45FF2331 362 | 47FF27374CFF517987FF5DA8B1FF5BA8B0FF72B1B8FF72B1B8FF72B1B8FF72B1 363 | B8FF72B1B8FF72B1B8FF659EA4FF20373AFF000000FF000000FF000000FF0000 364 | 00FF000000FF1D3234FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8 365 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF258669FF1D8564FF1D85 366 | 64FF1D8564FF1D8564FF1D8564FF1D8564FF1D8564FF1D8564FF419281FF72B1 367 | B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 368 | B8FF72B1B8FFC0D7DAFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 369 | FFFFFFFFFFFFFAFCFCFF9FC5CAFF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8 370 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF2C3E52FF1F2B43FF1E28 371 | 41FF1C263EFF1C263EFF1E2A42FF1E2B41FF202F44FF283A4EFF293C4FFF3248 372 | 5BFF4F7684FF72B1B8FF5DA8B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 373 | B8FF72B1B8FF72B1B8FF72B1B8FF6FADB3FF55858BFF395B5FFF1F3437FF0A16 374 | 17FF122324FF304E51FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8 375 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF258669FF1D8564FF1D85 376 | 64FF1D8564FF1D8564FF1D8564FF1D8564FF1D8564FF1D8564FF419281FF72B1 377 | B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 378 | B8FF72B1B8FF72B1B8FF9FC5CAFFD9E6E8FFF0F5F5FFFBFCFCFFF8FAFAFFEEF3 379 | F4FFCFE0E2FF92BEC4FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8 380 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF6DA9B1FF375262FF202C44FF1E2A 381 | 41FF1D2940FF1D2940FF212E44FF253549FF4A737CFF56868FFF649BA4FF669E 382 | A7FF72B1B8FF72B1B8FF5EA9B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 383 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 384 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9 385 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 386 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 387 | B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 388 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 389 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9 390 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF476C78FF212E45FF1F2A 391 | 42FF1E2A41FF202D44FF27394CFF446B75FF72B1B8FF72B1B8FF72B1B8FF72B1 392 | B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 393 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 394 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF60AAB2FF5EA9 395 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 396 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 397 | B8FF72B1B8FF72B1B8FF60AAB2FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 398 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 399 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF60AAB2FF5EA9 400 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF395664FF2635 401 | 4AFF25354AFF304858FF49707BFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 402 | B8FF72B1B8FF72B1B8FF60AAB2FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 403 | B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAE 404 | B5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF60AA 405 | B2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAF 406 | B7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64AB 407 | B3FF64ABB3FF62AAB3FF62AAB3FF60AAB2FF72B1B8FF72B1B8FF72B1B8FF72B1 408 | B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAE 409 | B5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF60AA 410 | B2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF4871 411 | 7DFF4C7985FF5A919AFF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64AB 412 | B3FF64ABB3FF62AAB3FF62AAB3FF60AAB2FF72B1B8FF72B1B8FF72B1B8FF72B1 413 | B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAF 414 | B6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AA 415 | B3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0 416 | B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66AC 417 | B4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF72B1B8FF72B1B8FF72B1B8FF72B1 418 | B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAF 419 | B6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AA 420 | B3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0 421 | B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66AC 422 | B4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF62AAB3FF60AAB2FF60AAB2FF5EA9 423 | B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2 424 | ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559CA4FF559C 425 | A4FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8 426 | B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569F 427 | A7FF559EA5FF559CA4FF559CA4FF559CA4FF62AAB3FF60AAB2FF60AAB2FF5EA9 428 | B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2 429 | ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559CA4FF559C 430 | A4FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8 431 | B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569F 432 | A7FF559EA5FF559CA4FF559CA4FF559CA4FF64ABB3FF62AAB3FF60AAB2FF60AA 433 | B2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5 434 | AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559C 435 | A4FF64ABB3FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8 436 | B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569F 437 | A7FF569FA7FF559EA5FF559CA4FF559CA4FF64ABB3FF62AAB3FF60AAB2FF60AA 438 | B2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5 439 | AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559C 440 | A4FF64ABB3FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8 441 | B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569F 442 | A7FF569FA7FF559EA5FF559CA4FF559CA4FF64ABB3FF64ABB3FF72B1B8FF72B1 443 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 444 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF559EA5FF559C 445 | A4FF64ABB3FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 446 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 447 | B8FF72B1B8FF72B1B8FF559EA5FF559CA4FF64ABB3FF64ABB3FF72B1B8FF72B1 448 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 449 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF559EA5FF559C 450 | A4FF64ABB3FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 451 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 452 | B8FF72B1B8FF72B1B8FF559EA5FF559CA4FF66ACB4FF64ABB3FF72B1B8FF72B1 453 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 454 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF559E 455 | A5FF66ACB4FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 456 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 457 | B8FF72B1B8FF72B1B8FF569FA7FF559EA5FF66ACB4FF64ABB3FF72B1B8FF72B1 458 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 459 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF559E 460 | A5FF66ACB4FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 461 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 462 | B8FF72B1B8FF72B1B8FF569FA7FF559EA5FF66ACB4FF66ACB4FF72B1B8FF72B1 463 | B8FF72B1B8FF3FA168FF109B18FF109B18FF109B18FF109B18FF109B18FF109B 464 | 18FF109B18FF109B18FF149A20FF72B1B8FF72B1B8FF72B1B8FF569FA7FF569F 465 | A7FF66ACB4FF66ACB4FF72B1B8FF72B1B8FF70AEB7FF5180AAFF3B5DA3FF263C 466 | 9DFF15219CFF10169AFF1F319DFF3A5CA2FF5C90AEFF71AFB8FF72B1B8FF72B1 467 | B8FF72B1B8FF72B1B8FF569FA7FF569FA7FF66ACB4FF66ACB4FF72B1B8FF72B1 468 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FFB1799EFFD310 469 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF569F 470 | A7FF66ACB4FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF6E9B90FF6B8969FF6A7D 471 | 4AFF697731FF69772DFF6A7C45FF6B8B6CFF6FA29EFF72B1B8FF72B1B8FF72B1 472 | B8FF72B1B8FF72B1B8FF569FA7FF569FA7FF68ADB5FF66ACB4FF72B1B8FF72B1 473 | B8FF72B1B8FF45A271FF109B18FF109B18FF109B18FF109B18FF109B18FF109B 474 | 18FF109B18FF109B18FF149A20FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF569F 475 | A7FF68ADB5FF66ACB4FF72B1B8FF72B1B8FF6DA9B6FF0B0B9BFF0B0B9BFF0B0B 476 | 9BFF0B0B9BFF0B0B9BFF0B0B9BFF0B0B9BFF0B0B9BFF3655A1FF70AEB7FF72B1 477 | B8FF72B1B8FF72B1B8FF57A1A9FF569FA7FF68ADB5FF66ACB4FF72B1B8FF72B1 478 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FFB1799EFFD310 479 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF569F 480 | A7FF68ADB5FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF6A7D4AFF697628FF6976 481 | 28FF697628FF697628FF697628FF697628FF697628FF6D937EFF72B1B8FF72B1 482 | B8FF72B1B8FF72B1B8FF57A1A9FF569FA7FF6AAEB5FF68ADB5FF72B1B8FF72B1 483 | B8FF72B1B8FF70B0B5FF47A374FF109B18FF109B18FF2A9D46FF65ACA4FF72B1 484 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF57A1 485 | A9FF6AAEB5FF68ADB5FF72B1B8FF72B1B8FF6DA9B6FF2D48A0FF5688ABFF69A4 486 | B4FF71AFB8FF6FACB6FF5E93AFFF1C2D9BFF0B0B9BFF0B0B9BFF5586ABFF72B1 487 | B8FF72B1B8FF72B1B8FF57A1A9FF57A1A9FF6AAEB5FF68ADB5FF72B1B8FF72B1 488 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FFB1799EFFD310 489 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF57A1 490 | A9FF6AAEB5FF68ADB5FF72B1B8FF72B1B8FF72B1B8FF6A8359FF6D9585FF70A8 491 | A9FF72B0B6FF71ADB2FF6E9D93FF697731FF697628FF697628FF6FA29FFF72B1 492 | B8FF72B1B8FF72B1B8FF57A1A9FF57A1A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1 493 | B8FF72B1B8FF72B1B8FF72B1B8FF58A890FF149A20FF109B18FF179A24FF5AA9 494 | 92FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF57A2ABFF57A1 495 | A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 496 | B8FF72B1B8FF72B1B8FF72B1B8FF466DA6FF0B0B9BFF0B0B9BFF466EA6FF72B1 497 | B8FF72B1B8FF72B1B8FF57A2ABFF57A1A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1 498 | B8FFB07B9FFFD31087FFD31087FFD31087FFD31087FFD31087FFD31087FFD310 499 | 87FFD31087FFD31087FFD31087FF88A4B1FF72B1B8FF72B1B8FF57A2ABFF57A1 500 | A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 501 | B8FF72B1B8FF72B1B8FF72B1B8FF6C927CFF697628FF697628FF6C9079FF72B1 502 | B8FF72B1B8FF72B1B8FF57A2ABFF57A1A9FF6CAFB6FF6AAEB5FF72B1B8FF72B1 503 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF61AB9EFF1A9C2CFF109B18FF109B 504 | 18FF54A689FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF58A5AEFF57A2 505 | ABFF6CAFB6FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 506 | B8FF72B1B8FF71AFB7FF67A1B2FF29419FFF0B0B9BFF0B0B9BFF5686ABFF72B1 507 | B8FF72B1B8FF72B1B8FF58A5AEFF57A2ABFF6CAFB6FF6AAEB5FF72B1B8FF72B1 508 | B8FFB07B9FFFD31087FFD31087FFD31087FFD31087FFD31087FFD31087FFD310 509 | 87FFD31087FFD31087FFD31087FF88A4B1FF72B1B8FF72B1B8FF58A5AEFF57A2 510 | ABFF6CAFB6FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 511 | B8FF72B1B8FF72B1B8FF72B1B8FF6D917CFF697628FF697628FF6B8C6FFF72B1 512 | B8FF72B1B8FF72B1B8FF58A5AEFF57A2ABFF6CAFB6FF6CAFB6FF72B1B8FF72B1 513 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF62ACA0FF189B26FF109B 514 | 18FF109B18FF5DAA98FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF58A5AEFF58A5 515 | AEFF6CAFB6FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF67A0 516 | B3FF0B0B9BFF0B0B9BFF0B0B9BFF0B0B9BFF1D2F9DFF4F7CA9FF72B0B8FF72B1 517 | B8FF72B1B8FF72B1B8FF58A5AEFF58A5AEFF6CAFB6FF6CAFB6FF72B1B8FF72B1 518 | B8FF8F9FAFFFD02388FFD21A87FF949BADFF72B1B8FF72B1B8FFB1799EFFD310 519 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF58A5AEFF58A5 520 | AEFF6CAFB6FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 521 | B8FF72B1B8FF71ADB1FF6E9D94FF697735FF697628FF697628FF6D9687FF72B1 522 | B8FF72B1B8FF72B1B8FF58A5AEFF58A5AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1 523 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF56A78DFF109B 524 | 18FF109B18FF239C3AFF70B0B5FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF58A5 525 | AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF67A0 526 | B3FF0B0B9BFF0B0B9BFF0B0B9BFF0B0B9BFF456CA6FF6CA8B5FF72B1B8FF72B1 527 | B8FF72B1B8FF72B1B8FF59A7AFFF58A5AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1 528 | B8FF72B1B8FF9E91A8FFD31087FFCD368BFF83A7B3FF72B1B8FFB1799EFFD310 529 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF58A5 530 | AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF6E9B92FF697628FF6976 531 | 28FF697628FF697628FF697628FF697628FF697628FF697D4BFF72ADB1FF72B1 532 | B8FF72B1B8FF72B1B8FF59A7AFFF58A5AEFF70B0B7FF6EAFB7FF72B1B8FF72B1 533 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF71B0B6FF1D9B 534 | 31FF109B18FF109B18FF61AB9DFF72B1B8FF72B1B8FF72B1B8FF59A7AFFF59A7 535 | AFFF70B0B7FF6EAFB7FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 536 | B8FF72B1B8FF6FADB7FF5E93AFFF141E9BFF0B0B9BFF2D48A0FF71AFB8FF72B1 537 | B8FF72B1B8FF72B1B8FF59A7AFFF59A7AFFF70B0B7FF6EAFB7FF72B1B8FF72B1 538 | B8FF72B1B8FF72B1B8FFAE7DA0FFD31087FFC55291FF77AEB6FFB1799EFFD310 539 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF59A7 540 | AFFF70B0B7FF6EAFB7FF72B1B8FF72B1B8FF72B1B8FF6E9B92FF697628FF6976 541 | 28FF68762CFF68762CFF6A7A3EFF6B8358FF6D9687FF71ADB1FF72B1B8FF72B1 542 | B8FF72B1B8FF72B1B8FF59A7AFFF59A7AFFF70B0B7FF70B0B7FF72B1B8FF72B1 543 | B8FF72B1B8FF5BA995FF5DA997FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF279C 544 | 41FF109B18FF109B18FF5BA994FF72B1B8FF72B1B8FF72B1B8FF5BA8B0FF59A7 545 | AFFF70B0B7FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 546 | B8FF72B1B8FF72B1B8FF72B1B8FF3452A0FF0B0B9BFF0B0B9BFF639AB1FF72B1 547 | B8FF72B1B8FF72B1B8FF5BA8B0FF59A7AFFF70B0B7FF70B0B7FF72B1B8FF72B1 548 | B8FF72B1B8FF72B1B8FF73B1B8FFBB6998FFD31087FFB86D9AFFB1799EFFD310 549 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5BA8B0FF59A7 550 | AFFF70B0B7FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF6E9B92FF697628FF6976 551 | 28FF6D937EFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 552 | B8FF72B1B8FF72B1B8FF5BA8B0FF59A7AFFF72B1B8FF70B0B7FF72B1B8FF72B1 553 | B8FF72B1B8FF5BA994FF119A1BFF4EA581FF6CAFAFFF6FB0B3FF54A78AFF109B 554 | 18FF109B18FF109B18FF65ACA4FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8 555 | B0FF72B1B8FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF4166A4FF4871A6FF649C 556 | B2FF70ADB7FF70AEB7FF5F95AFFF141E9BFF0B0B9BFF0B0B9BFF639AB1FF72B1 557 | B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8B0FF72B1B8FF70B0B7FF72B1B8FF72B1 558 | B8FF72B1B8FF72B1B8FF72B1B8FF78AEB6FFC55292FFD31087FFCD3A8BFFD310 559 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8 560 | B0FF72B1B8FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF6E9B92FF697628FF6976 561 | 28FF6D937EFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 562 | B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8B0FF72B1B8FF72B1B8FF72B1B8FF72B1 563 | B8FF72B1B8FF5BA994FF109B18FF109B18FF109B18FF109B18FF109B18FF109B 564 | 18FF109B18FF42A16BFF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8 565 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF3D5FA3FF0B0B9BFF0B0B 566 | 9BFF0B0B9BFF0B0B9BFF0B0B9BFF0B0B9BFF0B0B9BFF3554A1FF71B0B7FF72B1 567 | B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 568 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF83A8B3FFCB3C8CFFD31087FFD310 569 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8 570 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF6E9B92FF697628FF6976 571 | 28FF697628FF697628FF697628FF697628FF697628FF697628FF6F9F98FF72B1 572 | B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 573 | B8FF72B1B8FF6EAFB2FF56A78DFF3EA166FF269C40FF159B22FF1E9B32FF37A0 574 | 5BFF57A78FFF71B1B6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8 575 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5F95AFFF466DA6FF3351 576 | A0FF24399DFF12199CFF1C2D9BFF3656A2FF5483AAFF70ADB7FF72B1B8FF72B1 577 | B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 578 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF909FAFFFD02489FFD310 579 | 87FFD31087FFAB83A3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8 580 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF6E9B92FF697628FF6976 581 | 28FF697628FF697628FF697628FF697628FF697628FF697628FF6F9F98FF72B1 582 | B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8B1FF72B1B8FF72B1B8FF72B1B8FF72B1 583 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 584 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9 585 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 586 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 587 | B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 588 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 589 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9 590 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 591 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 592 | B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 593 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 594 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF60AAB2FF5EA9 595 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 596 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 597 | B8FF72B1B8FF72B1B8FF60AAB2FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 598 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 599 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF60AAB2FF5EA9 600 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 601 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 602 | B8FF72B1B8FF72B1B8FF60AAB2FF5EA9B1FF72B1B8FF72B1B8FF72B1B8FF72B1 603 | B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAE 604 | B5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF60AA 605 | B2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAF 606 | B7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64AB 607 | B3FF64ABB3FF62AAB3FF62AAB3FF60AAB2FF72B1B8FF72B1B8FF72B1B8FF72B1 608 | B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAE 609 | B5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF60AA 610 | B2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAF 611 | B7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64AB 612 | B3FF64ABB3FF62AAB3FF62AAB3FF60AAB2FF72B1B8FF72B1B8FF72B1B8FF72B1 613 | B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAF 614 | B6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AA 615 | B3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0 616 | B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66AC 617 | B4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF72B1B8FF72B1B8FF72B1B8FF72B1 618 | B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAF 619 | B6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AA 620 | B3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0 621 | B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66AC 622 | B4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF26B611FF23B313FF23B313FF1FB0 623 | 16FF1FB016FF1CAD18FF18AA1AFF18AA1AFF15A71CFF11A41FFF11A41FFF0DA0 624 | 21FF0DA021FF0A9D23FF069A25FF069A25FF029728FF00942AFF00942AFF0094 625 | 2AFF26B611FF23B313FF23B313FF1FB016FF1FB016FF1CAD18FF18AA1AFF18AA 626 | 1AFF15A71CFF11A41FFF11A41FFF0DA021FF0DA021FF0A9D23FF069A25FF069A 627 | 25FF029728FF00942AFF00942AFF00942AFF62AAB3FF60AAB2FF60AAB2FF5EA9 628 | B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2 629 | ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559CA4FF559C 630 | A4FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8 631 | B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569F 632 | A7FF559EA5FF559CA4FF559CA4FF559CA4FF2AB90FFF26B611FF23B313FF23B3 633 | 13FF1FB016FF1FB016FF1CAD18FF18AA1AFF18AA1AFF15A71CFF11A41FFF11A4 634 | 1FFF0DA021FF0DA021FF0A9D23FF069A25FF069A25FF029728FF00942AFF0094 635 | 2AFF2AB90FFF26B611FF23B313FF23B313FF1FB016FF1FB016FF1CAD18FF18AA 636 | 1AFF18AA1AFF15A71CFF11A41FFF11A41FFF0DA021FF0DA021FF0A9D23FF069A 637 | 25FF069A25FF029728FF00942AFF00942AFF64ABB3FF62AAB3FF60AAB2FF60AA 638 | B2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8B0FF5BA8B0FF59A7AFFF58A5AEFF58A5 639 | AEFF57A2ABFF57A2ABFF57A1A9FF569FA7FF569FA7FF559EA5FF559CA4FF559C 640 | A4FF64ABB3FF62AAB3FF60AAB2FF60AAB2FF5EA9B1FF5EA9B1FF5DA8B1FF5BA8 641 | B0FF5BA8B0FF59A7AFFF58A5AEFF58A5AEFF57A2ABFF57A2ABFF57A1A9FF569F 642 | A7FF569FA7FF559EA5FF559CA4FF559CA4FF2AB90FFF2AB90FFF43CF00FF43CF 643 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 644 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF029728FF0094 645 | 2AFF2AB90FFF2AB90FFF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 646 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 647 | 00FF43CF00FF43CF00FF029728FF00942AFF64ABB3FF64ABB3FF72B1B8FF72B1 648 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 649 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF559EA5FF559C 650 | A4FF64ABB3FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 651 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 652 | B8FF72B1B8FF72B1B8FF559EA5FF559CA4FF2DBC0DFF2AB90FFF43CF00FF43CF 653 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 654 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF069A25FF0297 655 | 28FF2DBC0DFF2AB90FFF43CF00FF43CF00FF232323FF232323FF232323FF2323 656 | 23FF232323FF232323FF232323FF232323FF232323FF232323FF232323FF2323 657 | 23FF43CF00FF43CF00FF069A25FF029728FF66ACB4FF64ABB3FF72B1B8FF72B1 658 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 659 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF559E 660 | A5FF66ACB4FF64ABB3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 661 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 662 | B8FF72B1B8FF72B1B8FF569FA7FF559EA5FF2DBC0DFF2DBC0DFF43CF00FF43CF 663 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 664 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF069A25FF069A 665 | 25FF2DBC0DFF2DBC0DFF43CF00FF43CF00FF232323FF232323FF232323FF2323 666 | 23FF232323FF232323FF232323FF232323FF232323FF232323FF232323FF2323 667 | 23FF43CF00FF43CF00FF069A25FF069A25FF66ACB4FF66ACB4FF72B1B8FF72B1 668 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 669 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF569FA7FF569F 670 | A7FF66ACB4FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF74ADB4FF972010FF9720 671 | 10FF972010FF972010FF972010FF972010FF972010FF972010FF7AA0A6FF72B1 672 | B8FF72B1B8FF72B1B8FF569FA7FF569FA7FF31BF0AFF2DBC0DFF43CF00FF43CF 673 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 674 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF0A9D23FF069A 675 | 25FF31BF0AFF2DBC0DFF43CF00FF43CF00FF232323FF232323FF232323FF2323 676 | 23FF232323FF232323FF232323FF232323FF232323FF232323FF232323FF2323 677 | 23FF43CF00FF43CF00FF0A9D23FF069A25FF68ADB5FF66ACB4FF72B1B8FF72B1 678 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 679 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF569F 680 | A7FF68ADB5FF66ACB4FF72B1B8FF72B1B8FF72B1B8FF74ADB4FF972010FF9720 681 | 10FF972010FF972010FF972010FF972010FF972010FF972010FF7AA0A6FF72B1 682 | B8FF72B1B8FF72B1B8FF57A1A9FF569FA7FF35C308FF31BF0AFF43CF00FF43CF 683 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 684 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF0A9D23FF0A9D 685 | 23FF35C308FF31BF0AFF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 686 | 00FF43CF00FF43CF00FF43CF00FF232323FF232323FF43CF00FF43CF00FF43CF 687 | 00FF43CF00FF43CF00FF0A9D23FF0A9D23FF6AAEB5FF68ADB5FF72B1B8FF72B1 688 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 689 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF57A1A9FF57A1 690 | A9FF6AAEB5FF68ADB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 691 | B8FF848A8EFF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 692 | B8FF72B1B8FF72B1B8FF57A1A9FF57A1A9FF35C308FF35C308FF43CF00FF43CF 693 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 694 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF0DA021FF0A9D 695 | 23FF35C308FF35C308FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 696 | 00FF43CF00FF43CF00FF43CF00FF232323FF232323FF43CF00FF43CF00FF43CF 697 | 00FF43CF00FF43CF00FF0DA021FF0A9D23FF6AAEB5FF6AAEB5FF72B1B8FF72B1 698 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 699 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF57A2ABFF57A1 700 | A9FF6AAEB5FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 701 | B8FF848A8EFF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 702 | B8FF72B1B8FF72B1B8FF57A2ABFF57A1A9FF38C606FF35C308FF43CF00FF43CF 703 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 704 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF11A41FFF0DA0 705 | 21FF38C606FF35C308FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 706 | 00FF43CF00FF43CF00FF43CF00FF232323FF232323FF43CF00FF43CF00FF43CF 707 | 00FF43CF00FF43CF00FF11A41FFF0DA021FF6CAFB6FF6AAEB5FF72B1B8FF72B1 708 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 709 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF58A5AEFF57A2 710 | ABFF6CAFB6FF6AAEB5FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 711 | B8FF848A8EFF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 712 | B8FF72B1B8FF72B1B8FF58A5AEFF57A2ABFF38C606FF38C606FF43CF00FF43CF 713 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 714 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF11A41FFF11A4 715 | 1FFF38C606FF38C606FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 716 | 00FF43CF00FF43CF00FF43CF00FF232323FF232323FF43CF00FF43CF00FF43CF 717 | 00FF43CF00FF43CF00FF11A41FFF11A41FFF6CAFB6FF6CAFB6FF72B1B8FF72B1 718 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 719 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF58A5AEFF58A5 720 | AEFF6CAFB6FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 721 | B8FF848A8EFF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 722 | B8FF72B1B8FF72B1B8FF58A5AEFF58A5AEFF3CC904FF38C606FF43CF00FF43CF 723 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 724 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF15A71CFF11A4 725 | 1FFF3CC904FF38C606FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 726 | 00FF43CF00FF43CF00FF0700E3FF0700E3FF232323FF43CF00FF43CF00FF43CF 727 | 00FF43CF00FF43CF00FF15A71CFF11A41FFF6EAFB7FF6CAFB6FF72B1B8FF72B1 728 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 729 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF58A5 730 | AEFF6EAFB7FF6CAFB6FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 731 | B8FF848A8EFF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 732 | B8FF72B1B8FF72B1B8FF59A7AFFF58A5AEFF40CC01FF3CC904FF43CF00FF43CF 733 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 734 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF15A71CFF15A7 735 | 1CFF40CC01FF3CC904FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF0700 736 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF232323FF43CF00FF43CF00FF43CF 737 | 00FF43CF00FF43CF00FF15A71CFF15A71CFF70B0B7FF6EAFB7FF72B1B8FF72B1 738 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 739 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF59A7AFFF59A7 740 | AFFF70B0B7FF6EAFB7FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 741 | B8FF848A8EFF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 742 | B8FF72B1B8FF72B1B8FF59A7AFFF59A7AFFF40CC01FF40CC01FF43CF00FF43CF 743 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 744 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF18AA1AFF15A7 745 | 1CFF40CC01FF40CC01FF43CF00FF43CF00FF43CF00FF0700E3FF0700E3FF0700 746 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF232323FF43CF00FF43CF00FF43CF 747 | 00FF43CF00FF43CF00FF18AA1AFF15A71CFF70B0B7FF70B0B7FF72B1B8FF72B1 748 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 749 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5BA8B0FF59A7 750 | AFFF70B0B7FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF74ADB4FF972010FF9720 751 | 10FF972010FF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 752 | B8FF72B1B8FF72B1B8FF5BA8B0FF59A7AFFF43CF00FF40CC01FF43CF00FF43CF 753 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 754 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF1CAD18FF18AA 755 | 1AFF43CF00FF40CC01FF43CF00FF43CF00FF0700E3FF0700E3FF0700E3FF0700 756 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF232323FF43CF00FF43CF00FF43CF 757 | 00FF43CF00FF43CF00FF1CAD18FF18AA1AFF72B1B8FF70B0B7FF72B1B8FF72B1 758 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 759 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8 760 | B0FF72B1B8FF70B0B7FF72B1B8FF72B1B8FF72B1B8FF74ADB4FF972010FF9720 761 | 10FF972010FF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 762 | B8FF72B1B8FF72B1B8FF5DA8B1FF5BA8B0FF43CF00FF43CF00FF43CF00FF43CF 763 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 764 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF1CAD18FF1CAD 765 | 18FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF0700E3FF0700 766 | E3FF0700E3FF0700E3FF0700E3FF0700E3FF232323FF43CF00FF43CF00FF43CF 767 | 00FF43CF00FF43CF00FF1CAD18FF1CAD18FF72B1B8FF72B1B8FF72B1B8FF72B1 768 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 769 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8 770 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF73AEB5FF7AA0 771 | A6FF905959FF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 772 | B8FF72B1B8FF72B1B8FF5DA8B1FF5DA8B1FF43CF00FF43CF00FF43CF00FF43CF 773 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 774 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF1FB016FF1CAD 775 | 18FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 776 | 00FF0700E3FF0700E3FF0700E3FF0700E3FF232323FF43CF00FF43CF00FF43CF 777 | 00FF43CF00FF43CF00FF1FB016FF1CAD18FF72B1B8FF72B1B8FF72B1B8FF72B1 778 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 779 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8 780 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 781 | B8FF7B9FA4FF972010FF972010FF8B6E71FF72B1B8FF72B1B8FF72B1B8FF72B1 782 | B8FF72B1B8FF72B1B8FF5EA9B1FF5DA8B1FF43CF00FF43CF00FF43CF00FF43CF 783 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 784 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF1FB016FF1FB0 785 | 16FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 786 | 00FF43CF00FF0700E3FF0700E3FF0700E3FF232323FF43CF00FF43CF00FF43CF 787 | 00FF43CF00FF43CF00FF1FB016FF1FB016FF72B1B8FF72B1B8FF72B1B8FF72B1 788 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 789 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9 790 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 791 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 792 | B8FF72B1B8FF72B1B8FF5EA9B1FF5EA9B1FF43CF00FF43CF00FF43CF00FF43CF 793 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 794 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF23B313FF1FB0 795 | 16FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 796 | 00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF 797 | 00FF43CF00FF43CF00FF23B313FF1FB016FF72B1B8FF72B1B8FF72B1B8FF72B1 798 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 799 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF60AAB2FF5EA9 800 | B1FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 801 | B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1 802 | B8FF72B1B8FF72B1B8FF60AAB2FF5EA9B1FF43CF00FF43CF00FF43CF00FF43CF 803 | 00FF43CF00FF43CF00FF40CC01FF3CC904FF3CC904FF38C606FF38C606FF35C3 804 | 08FF31BF0AFF31BF0AFF2DBC0DFF2AB90FFF2AB90FFF26B611FF26B611FF23B3 805 | 13FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF40CC01FF3CC9 806 | 04FF3CC904FF38C606FF38C606FF35C308FF31BF0AFF31BF0AFF2DBC0DFF2AB9 807 | 0FFF2AB90FFF26B611FF26B611FF23B313FF72B1B8FF72B1B8FF72B1B8FF72B1 808 | B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAE 809 | B5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF60AA 810 | B2FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAF 811 | B7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64AB 812 | B3FF64ABB3FF62AAB3FF62AAB3FF60AAB2FF43CF00FF43CF00FF43CF00FF43CF 813 | 00FF43CF00FF43CF00FF43CF00FF40CC01FF3CC904FF3CC904FF38C606FF38C6 814 | 06FF35C308FF31BF0AFF31BF0AFF2DBC0DFF2AB90FFF2AB90FFF26B611FF26B6 815 | 11FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF43CF00FF40CC 816 | 01FF3CC904FF3CC904FF38C606FF38C606FF35C308FF31BF0AFF31BF0AFF2DBC 817 | 0DFF2AB90FFF2AB90FFF26B611FF26B611FF72B1B8FF72B1B8FF72B1B8FF72B1 818 | B8FF72B1B8FF72B1B8FF72B1B8FF70B0B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAF 819 | B6FF6AAEB5FF68ADB5FF68ADB5FF66ACB4FF64ABB3FF64ABB3FF62AAB3FF62AA 820 | B3FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF72B1B8FF70B0 821 | B7FF6EAFB7FF6EAFB7FF6CAFB6FF6CAFB6FF6AAEB5FF68ADB5FF68ADB5FF66AC 822 | B4FF64ABB3FF64ABB3FF62AAB3FF62AAB3FF424D3E000000000000003E000000 823 | 2800000050000000500000000100010000000000C00300000000000000000000 824 | 000000000000000000000000FFFFFF0000000000000000000000000000000000 825 | 0000000000000000000000000000000000000000000000000000000000000000 826 | 0000000000000000000000000000000000000000000000000000000000000000 827 | 0000000000000000000000000000000000000000000000000000000000000000 828 | 0000000000000000000000000000000000000000000000000000000000000000 829 | 0000000000000000000000000000000000000000000000000000000000000000 830 | 0000000000000000000000000000000000000000000000000000000000000000 831 | 0000000000000000000000000000000000000000000000000000000000000000 832 | 0000000000000000000000000000000000000000000000000000000000000000 833 | 0000000000000000000000000000000000000000000000000000000000000000 834 | 0000000000000000000000000000000000000000000000000000000000000000 835 | 0000000000000000000000000000000000000000000000000000000000000000 836 | 0000000000000000000000000000000000000000000000000000000000000000 837 | 0000000000000000000000000000000000000000000000000000000000000000 838 | 0000000000000000000000000000000000000000000000000000000000000000 839 | 0000000000000000000000000000000000000000000000000000000000000000 840 | 0000000000000000000000000000000000000000000000000000000000000000 841 | 0000000000000000000000000000000000000000000000000000000000000000 842 | 0000000000000000000000000000000000000000000000000000000000000000 843 | 0000000000000000000000000000000000000000000000000000000000000000 844 | 0000000000000000000000000000000000000000000000000000000000000000 845 | 0000000000000000000000000000000000000000000000000000000000000000 846 | 0000000000000000000000000000000000000000000000000000000000000000 847 | 0000000000000000000000000000000000000000000000000000000000000000 848 | 0000000000000000000000000000000000000000000000000000000000000000 849 | 0000000000000000000000000000000000000000000000000000000000000000 850 | 0000000000000000000000000000000000000000000000000000000000000000 851 | 0000000000000000000000000000000000000000000000000000000000000000 852 | 0000000000000000000000000000000000000000000000000000000000000000 853 | 0000000000000000000000000000000000000000000000000000000000000000 854 | 0000000000000000000000000000000000000000000000000000000000000000 855 | 000000000000} 856 | end 857 | end 858 | -------------------------------------------------------------------------------- /UBoardFrame.pas: -------------------------------------------------------------------------------- 1 | unit UBoardFrame; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UDoubleBufferedFrame, Vcl.ExtCtrls, UMinesweeperDataController, 8 | System.ImageList, Vcl.ImgList; 9 | 10 | type 11 | TBoardFrame = class(TDoubleBufferedFrame) 12 | Timer1: TTimer; 13 | ImageList_Fields: TImageList; 14 | procedure Timer1Timer(Sender: TObject); 15 | procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, 16 | Y: Integer); 17 | procedure PaintBox2MouseDown(Sender: TObject; Button: TMouseButton; 18 | Shift: TShiftState; X, Y: Integer); 19 | procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; 20 | Shift: TShiftState; X, Y: Integer); 21 | private 22 | { Private declarations } 23 | 24 | fController: TMineSweeperDataController; 25 | fFocusedX: Integer; 26 | fFocusedY: Integer; 27 | 28 | function GetFieldSize(): Integer; 29 | protected 30 | procedure CanvasPaint(aCanvas: TCanvas); override; 31 | 32 | public 33 | { Public declarations } 34 | 35 | function GetPreferredWidth(): Integer; 36 | function GetPreferredHeight(): Integer; 37 | 38 | property Controller: TMineSweeperDataController read fController write fController; 39 | end; 40 | 41 | var 42 | BoardFrame: TBoardFrame; 43 | 44 | implementation 45 | 46 | uses 47 | System.Math; 48 | 49 | {$R *.dfm} 50 | 51 | procedure TBoardFrame.CanvasPaint(aCanvas: TCanvas); 52 | begin 53 | inherited; 54 | 55 | aCanvas.Brush.Color := clBlack; 56 | aCanvas.FillRect(aCanvas.ClipRect); 57 | 58 | if not Assigned(Controller) then 59 | Exit(); 60 | 61 | for var y := 0 to Controller.GetHeight() - 1 do 62 | for var x := 0 to Controller.GetWidth() - 1 do 63 | begin 64 | var canvasY := y * GetFieldSize(); 65 | var canvasX := x * GetFieldSize(); 66 | var field := Controller.GetFieldAt(x, y); 67 | 68 | var imageIndex := 0; 69 | 70 | if not field.IsRevealed then 71 | imageIndex := IfThen(field.IsFlagged, 1, 0) 72 | else 73 | begin 74 | 75 | if field.HasMine then 76 | begin 77 | if field.IsExplosionSource then 78 | imageIndex := 12 79 | else if field.IsFlagged then 80 | imageIndex := 13 81 | else 82 | imageIndex := 11; 83 | end 84 | else 85 | imageIndex := field.GetNumberOfMinesAround() + 2; 86 | 87 | end; 88 | 89 | ImageList_Fields.Draw(aCanvas, canvasX, canvasY, imageIndex); 90 | 91 | end; 92 | 93 | aCanvas.Brush.Color := clWhite; 94 | aCanvas.FrameRect(TRect.Create( 95 | fFocusedX*GetFieldSize(), 96 | fFocusedY*GetFieldSize(), 97 | (fFocusedX+1)*GetFieldSize(), 98 | (fFocusedY+1)*GetFieldSize() 99 | )); 100 | end; 101 | 102 | function TBoardFrame.GetFieldSize: Integer; 103 | begin 104 | result := ImageList_Fields.Width; 105 | end; 106 | 107 | function TBoardFrame.GetPreferredHeight: Integer; 108 | begin 109 | result := GetFieldSize() * Controller.GetHeight(); 110 | end; 111 | 112 | function TBoardFrame.GetPreferredWidth: Integer; 113 | begin 114 | result := GetFieldSize() * Controller.GetWidth(); 115 | end; 116 | 117 | procedure TBoardFrame.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, 118 | Y: Integer); 119 | begin 120 | inherited; 121 | fFocusedX := X div GetFieldSize(); 122 | fFocusedY := Y div GetFieldSize(); 123 | end; 124 | 125 | procedure TBoardFrame.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; 126 | Shift: TShiftState; X, Y: Integer); 127 | begin 128 | inherited; 129 | var fieldX := X div GetFieldSize(); 130 | var fieldY := Y div GetFieldSize(); 131 | 132 | if not Controller.IsInBounds(fieldX, fieldY) then 133 | Exit(); 134 | 135 | var field := Controller.GetFieldAt(fieldX, fieldY); 136 | 137 | if Button = mbLeft then 138 | field.OnLeftClicked(); 139 | end; 140 | 141 | procedure TBoardFrame.PaintBox2MouseDown(Sender: TObject; Button: TMouseButton; 142 | Shift: TShiftState; X, Y: Integer); 143 | begin 144 | inherited; 145 | 146 | var fieldX := X div GetFieldSize(); 147 | var fieldY := Y div GetFieldSize(); 148 | 149 | if not Controller.IsInBounds(fieldX, fieldY) then 150 | Exit(); 151 | 152 | var field := Controller.GetFieldAt(fieldX, fieldY); 153 | 154 | if Button = mbLeft then 155 | field.OnLeftClicking(); 156 | 157 | if Button = mbRight then 158 | field.OnRightClicked(); 159 | end; 160 | 161 | procedure TBoardFrame.Timer1Timer(Sender: TObject); 162 | begin 163 | inherited; 164 | 165 | Redraw(); 166 | end; 167 | 168 | end. 169 | -------------------------------------------------------------------------------- /UCustomBoardForm.dfm: -------------------------------------------------------------------------------- 1 | object CustomBoardForm: TCustomBoardForm 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu] 5 | BorderStyle = bsDialog 6 | Caption = 'Custom Board' 7 | ClientHeight = 144 8 | ClientWidth = 230 9 | Color = clBtnFace 10 | Font.Charset = DEFAULT_CHARSET 11 | Font.Color = clWindowText 12 | Font.Height = -12 13 | Font.Name = 'Segoe UI' 14 | Font.Style = [] 15 | Position = poOwnerFormCenter 16 | OnCloseQuery = FormCloseQuery 17 | TextHeight = 15 18 | object Label1: TLabel 19 | Left = 24 20 | Top = 11 21 | Width = 32 22 | Height = 15 23 | Caption = 'Width' 24 | end 25 | object Label2: TLabel 26 | Left = 24 27 | Top = 41 28 | Width = 36 29 | Height = 15 30 | Caption = 'Height' 31 | end 32 | object Label3: TLabel 33 | Left = 24 34 | Top = 71 35 | Width = 32 36 | Height = 15 37 | Caption = 'Mines' 38 | end 39 | object seWidth: TSpinEdit 40 | Left = 88 41 | Top = 8 42 | Width = 121 43 | Height = 24 44 | MaxValue = 999 45 | MinValue = 1 46 | TabOrder = 0 47 | Value = 0 48 | end 49 | object seHeight: TSpinEdit 50 | Left = 88 51 | Top = 38 52 | Width = 121 53 | Height = 24 54 | MaxValue = 999 55 | MinValue = 1 56 | TabOrder = 1 57 | Value = 0 58 | end 59 | object seMines: TSpinEdit 60 | Left = 88 61 | Top = 68 62 | Width = 121 63 | Height = 24 64 | MaxValue = 999 65 | MinValue = 1 66 | TabOrder = 2 67 | Value = 0 68 | end 69 | object Button1: TButton 70 | Left = 8 71 | Top = 111 72 | Width = 75 73 | Height = 25 74 | Caption = 'Confirm' 75 | ModalResult = 1 76 | TabOrder = 3 77 | end 78 | object Button2: TButton 79 | Left = 147 80 | Top = 111 81 | Width = 75 82 | Height = 25 83 | Caption = 'Cancel' 84 | ModalResult = 2 85 | TabOrder = 4 86 | end 87 | end 88 | -------------------------------------------------------------------------------- /UCustomBoardForm.pas: -------------------------------------------------------------------------------- 1 | unit UCustomBoardForm; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Samples.Spin; 8 | 9 | type 10 | TCustomBoardForm = class(TForm) 11 | Label1: TLabel; 12 | Label2: TLabel; 13 | Label3: TLabel; 14 | seWidth: TSpinEdit; 15 | seHeight: TSpinEdit; 16 | seMines: TSpinEdit; 17 | Button1: TButton; 18 | Button2: TButton; 19 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 20 | private 21 | { Private declarations } 22 | public 23 | { Public declarations } 24 | end; 25 | 26 | implementation 27 | 28 | {$R *.dfm} 29 | 30 | procedure TCustomBoardForm.FormCloseQuery(Sender: TObject; 31 | var CanClose: Boolean); 32 | procedure _ShowErr(aMsg: String); 33 | begin 34 | MessageDlg(aMsg, TMsgDlgType.mtError, [mbOk], 0); 35 | end; 36 | 37 | begin 38 | CanClose := True; 39 | 40 | if ModalResult <> mrOk then 41 | begin 42 | Exit(); 43 | end; 44 | 45 | if (seWidth.Value <= 0) or (seHeight.Value <= 0) then 46 | begin 47 | _ShowErr('Invalid board size.'); 48 | CanClose := False; 49 | Exit(); 50 | end; 51 | 52 | if (seMines.Value <= 0) or (seMines.Value >= (seWidth.Value * seHeight.Value)) then 53 | begin 54 | _ShowErr('Invalid amount of mines.'); 55 | CanClose := False; 56 | Exit(); 57 | end; 58 | 59 | end; 60 | 61 | end. 62 | -------------------------------------------------------------------------------- /UDogFrame.pas: -------------------------------------------------------------------------------- 1 | unit UDogFrame; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UDoubleBufferedFrame, Vcl.ExtCtrls, 8 | System.ImageList, Vcl.ImgList, UMinesweeperDataController; 9 | 10 | type 11 | TDogFrame = class(TDoubleBufferedFrame) 12 | ImageList1: TImageList; 13 | Timer1: TTimer; 14 | procedure Timer1Timer(Sender: TObject); 15 | private 16 | { Private declarations } 17 | fController: TMineSweeperDataController; 18 | protected 19 | procedure CanvasPaint(aCanvas: TCanvas); override; 20 | public 21 | { Public declarations } 22 | property Controller: TMineSweeperDataController read fController write fController; 23 | end; 24 | 25 | var 26 | DogFrame: TDogFrame; 27 | 28 | implementation 29 | 30 | uses 31 | System.Math; 32 | 33 | {$R *.dfm} 34 | 35 | procedure TDogFrame.CanvasPaint(aCanvas: TCanvas); 36 | begin 37 | inherited; 38 | 39 | aCanvas.Brush.Color := $00B3CBFF; 40 | aCanvas.FillRect(aCanvas.ClipRect); 41 | 42 | if not Assigned(Controller) then 43 | Exit(); 44 | 45 | case Controller.GameState of 46 | mgsIdle: 47 | begin 48 | ImageList1.Draw(aCanvas, 0, 0, 0); 49 | var mousePosScreen := Mouse.CursorPos; 50 | var mousePosClient := ScreenToClient(mousePosScreen); 51 | var leftEyeX := Min(18, Max(11, mousePosClient.X)); 52 | var rightEyeX := Min(28, Max(24, mousePosClient.X)); 53 | aCanvas.Brush.Color := $002A2B4D; 54 | aCanvas.Ellipse(leftEyeX, 14, leftEyeX + 5, 18); 55 | aCanvas.Ellipse(rightEyeX, 14, rightEyeX + 5, 18); 56 | end; 57 | mgsLeftClick: 58 | ImageList1.Draw(aCanvas, 0, 0, 1); 59 | mgsExploded: 60 | ImageList1.Draw(aCanvas, 0, 0, 3); 61 | mgsVictory: 62 | ImageList1.Draw(aCanvas, 0, 0, 2); 63 | end; 64 | end; 65 | 66 | procedure TDogFrame.Timer1Timer(Sender: TObject); 67 | begin 68 | inherited; 69 | Redraw(); 70 | end; 71 | 72 | end. 73 | -------------------------------------------------------------------------------- /UDoubleBufferedFrame.dfm: -------------------------------------------------------------------------------- 1 | object DoubleBufferedFrame: TDoubleBufferedFrame 2 | Left = 0 3 | Top = 0 4 | Width = 678 5 | Height = 500 6 | DoubleBuffered = True 7 | ParentDoubleBuffered = False 8 | TabOrder = 0 9 | object PaintBox1: TPaintBox 10 | Left = 0 11 | Top = 0 12 | Width = 678 13 | Height = 500 14 | Align = alClient 15 | ExplicitLeft = 72 16 | ExplicitTop = 56 17 | ExplicitWidth = 105 18 | ExplicitHeight = 105 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /UDoubleBufferedFrame.pas: -------------------------------------------------------------------------------- 1 | unit UDoubleBufferedFrame; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, 7 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls; 8 | 9 | type 10 | TDoubleBufferedFrame = class(TFrame) 11 | PaintBox1: TPaintBox; 12 | private 13 | { Private declarations } 14 | protected 15 | 16 | procedure CanvasPaint(aCanvas: TCanvas); virtual; abstract; 17 | 18 | public 19 | { Public declarations } 20 | procedure Redraw(); 21 | 22 | constructor Create(AOwner: TComponent); override; 23 | end; 24 | 25 | implementation 26 | 27 | {$R *.dfm} 28 | 29 | { TFrame1 } 30 | 31 | constructor TDoubleBufferedFrame.Create(AOwner: TComponent); 32 | begin 33 | inherited; 34 | end; 35 | 36 | procedure TDoubleBufferedFrame.Redraw(); 37 | begin 38 | var canvas := TBitmap.Create(PaintBox1.Canvas.ClipRect.Width, PaintBox1.Canvas.ClipRect.Height); 39 | try 40 | CanvasPaint(canvas.Canvas); 41 | PaintBox1.Canvas.Draw(0, 0, canvas); 42 | finally 43 | FreeAndNil(canvas); 44 | end; 45 | end; 46 | 47 | end. 48 | -------------------------------------------------------------------------------- /UHighScoresForm.dfm: -------------------------------------------------------------------------------- 1 | object HighScoresForm: THighScoresForm 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'High Scores' 6 | ClientHeight = 248 7 | ClientWidth = 327 8 | Color = 196744 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -12 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | Position = poOwnerFormCenter 15 | TextHeight = 15 16 | object Label1: TLabel 17 | Left = 8 18 | Top = 8 19 | Width = 59 20 | Height = 15 21 | Caption = 'BoardSize:' 22 | Font.Charset = DEFAULT_CHARSET 23 | Font.Color = clCream 24 | Font.Height = -12 25 | Font.Name = 'Segoe UI' 26 | Font.Style = [fsBold] 27 | ParentFont = False 28 | end 29 | object lblBoardSize: TLabel 30 | Left = 104 31 | Top = 8 32 | Width = 15 33 | Height = 15 34 | Caption = '?x?' 35 | Font.Charset = DEFAULT_CHARSET 36 | Font.Color = clCream 37 | Font.Height = -12 38 | Font.Name = 'Segoe UI' 39 | Font.Style = [] 40 | ParentFont = False 41 | end 42 | object Label3: TLabel 43 | Left = 8 44 | Top = 29 45 | Width = 36 46 | Height = 15 47 | Caption = 'Mines:' 48 | Font.Charset = DEFAULT_CHARSET 49 | Font.Color = clCream 50 | Font.Height = -12 51 | Font.Name = 'Segoe UI' 52 | Font.Style = [fsBold] 53 | ParentFont = False 54 | end 55 | object lblMines: TLabel 56 | Left = 104 57 | Top = 29 58 | Width = 15 59 | Height = 15 60 | Caption = '?x?' 61 | Font.Charset = DEFAULT_CHARSET 62 | Font.Color = clCream 63 | Font.Height = -12 64 | Font.Name = 'Segoe UI' 65 | Font.Style = [] 66 | ParentFont = False 67 | end 68 | object Image1: TImage 69 | Left = 24 70 | Top = 64 71 | Width = 32 72 | Height = 32 73 | Picture.Data = { 74 | 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 75 | 00200806000000737A7AF4000000097048597300000F6100000F6101A83FA769 76 | 000001594944415478DAED97411282300C4565C6957807171C809B79186EE601 77 | 58780775E50C02929AB4F985B6525CC846C7B6F92F3F6D8AC56EE3A7F803FC32 78 | 409723492F40773BA4291F1F19015AF6BD32E2D100B3E2CDF33E7E9EAFA5110D 79 | CD3E1EA0CFB6394D00FBD275A15A0380594CE2C201CB055602AF1EFDE0EC78E4 80 | 00592F0048B8FD400C0022463F56D4AE2B06804F761603F111804A60D96F8BF3 81 | 310E5150F6E3821604B0C40751DF26E4F69BB83E005B1C956010A58C0D00DF84 82 | 1240C6F6025CDE62538DE462F0380056FDEDD84A7C08A0EE0B2F00CBD0290101 83 | 80A3094B80CA0001AC3D00ACD70134317412600966D6A2C6048FE19C0B080034 84 | 20555C0080B1E01B71690BF652B1472D4F4E00D51D50DFD0B861137D4009B1E2 85 | 008C03D331D31ACC5A00F2DEE081EAB0DA4703A8B75C0244C8647922A8FB3188 86 | D501D4B7A44488A513F57E90096059338A3C11518DE88BC96DFFDFF0052F56DF 87 | 21A823468A0000000049454E44AE426082} 88 | Transparent = True 89 | end 90 | object Image2: TImage 91 | Left = 24 92 | Top = 102 93 | Width = 32 94 | Height = 32 95 | Picture.Data = { 96 | 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 97 | 00200806000000737A7AF4000000097048597300000F6100000F6101A83FA769 98 | 000001474944415478DAED97DB0D83300C45613118823D6016D883216031AAA0 99 | 3A729D6BD709AF7ED45F2824B9C74F445D3D6CF51FE09701B63B9C3401966539 100 | A4DCB6EDFD00F33C575DD79178314022DE348D7AC9BAAEBB70B020EEF5DE0D60 101 | 89930DC310C52F0508DE22285A17005FF56821A9780B80C23D8E63B2CE5320D3 102 | 88A21201F8667918010421BECE53C0CFD35E519C3507D8A4C7881E190128F9DF 103 | ADEFFBF8AC0248710964896BE1E777F30E310144EFAA730015A507609A26997A 104 | 0800EBC22B2E534000C87B3305280D481C992C42CDFB0880C4AC4ED08CA05017 105 | 6883496D4319052F803280A0F80780F22EFB83E41DC1261533989E3B01607494 106 | 119B7B6FDE460BE8C05D65004604B2EFCB3D106B827F6482BDFBFC7A003960B8 107 | 9540E46C4E3A42425C0E80DA91A7421BB76700A8F3E06814DC73C01A461C2237 108 | 0A4583E844E79EFF377C01AE110A301D8823C20000000049454E44AE426082} 109 | Transparent = True 110 | end 111 | object Image3: TImage 112 | Left = 24 113 | Top = 140 114 | Width = 32 115 | Height = 32 116 | Picture.Data = { 117 | 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 118 | 00200806000000737A7AF4000000097048597300000F6100000F6101A83FA769 119 | 000001514944415478DAED95CD0DC2300C85A9C4995158850B08C1020CC19921 120 | 580084E834CC835414A8C1759E9D9F369403BE20D1C4EFF3B3EB569391A3FA03 121 | FC3240F38D224D80E3B69FF2EE3422402B9E0DE089AF0E4B35C9755F3F7F37EB 122 | D799F3A58EAA3E1AC01227002ECE1C181E80AA9550D3DB479C0104F5E80F6FE2 123 | 43FD7715DFE7BE0BDC019903B9F206E087D16514DC05E7800BEA3FBF6FCD4645 124 | D5A702582DE0F6531E7207024871AD05DA302AFDEFE48E0210EF6ED6AB6801CC 125 | 1635CFAF02C0B908B5C26A01CD400BE00D216C81D606AB2DE4021A4254FD1B00 126 | 89C9244E88DBAC89A3BBC0DD0E8067377221661BCABB8A1606509E352100E94A 127 | EC0A36A958C0F6583134007447E96F6ADEB48316508F5C79008603C9F9522F78 128 | 33612D992200489C220722E5B05ABD5BC1CC897200B2F7DC0182487521F6A0B9 129 | 0F38480980E032A26FBDF5D1E90D90118301148D071CD3C72138A358F0000000 130 | 0049454E44AE426082} 131 | Transparent = True 132 | end 133 | object lblPlace1Name: TLabel 134 | Left = 167 135 | Top = 70 136 | Width = 99 137 | Height = 26 138 | Caption = '' 139 | Font.Charset = EASTEUROPE_CHARSET 140 | Font.Color = clCream 141 | Font.Height = -20 142 | Font.Name = 'Yu Gothic Medium' 143 | Font.Style = [] 144 | ParentFont = False 145 | end 146 | object lblPlace2Name: TLabel 147 | Left = 167 148 | Top = 108 149 | Width = 99 150 | Height = 26 151 | Caption = '' 152 | Font.Charset = EASTEUROPE_CHARSET 153 | Font.Color = clCream 154 | Font.Height = -20 155 | Font.Name = 'Yu Gothic Medium' 156 | Font.Style = [] 157 | ParentFont = False 158 | end 159 | object lblPlace3Name: TLabel 160 | Left = 167 161 | Top = 146 162 | Width = 99 163 | Height = 26 164 | Caption = '' 165 | Font.Charset = EASTEUROPE_CHARSET 166 | Font.Color = clCream 167 | Font.Height = -20 168 | Font.Name = 'Yu Gothic Medium' 169 | Font.Style = [] 170 | ParentFont = False 171 | end 172 | object lblTime1: TLabel 173 | Left = 62 174 | Top = 70 175 | Width = 99 176 | Height = 26 177 | Caption = '' 178 | Font.Charset = EASTEUROPE_CHARSET 179 | Font.Color = clCream 180 | Font.Height = -20 181 | Font.Name = 'Yu Gothic Medium' 182 | Font.Style = [] 183 | ParentFont = False 184 | end 185 | object lblTime2: TLabel 186 | Left = 62 187 | Top = 108 188 | Width = 99 189 | Height = 26 190 | Caption = '' 191 | Font.Charset = EASTEUROPE_CHARSET 192 | Font.Color = clCream 193 | Font.Height = -20 194 | Font.Name = 'Yu Gothic Medium' 195 | Font.Style = [] 196 | ParentFont = False 197 | end 198 | object lblTime3: TLabel 199 | Left = 62 200 | Top = 146 201 | Width = 99 202 | Height = 26 203 | Caption = '' 204 | Font.Charset = EASTEUROPE_CHARSET 205 | Font.Color = clCream 206 | Font.Height = -20 207 | Font.Name = 'Yu Gothic Medium' 208 | Font.Style = [] 209 | ParentFont = False 210 | end 211 | object Button1: TButton 212 | Left = 128 213 | Top = 199 214 | Width = 75 215 | Height = 25 216 | Caption = 'Close' 217 | ModalResult = 8 218 | TabOrder = 0 219 | end 220 | end 221 | -------------------------------------------------------------------------------- /UHighScoresForm.pas: -------------------------------------------------------------------------------- 1 | unit UHighScoresForm; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, 8 | Vcl.Imaging.pngimage; 9 | 10 | type 11 | THighScoresForm = class(TForm) 12 | Label1: TLabel; 13 | lblBoardSize: TLabel; 14 | Label3: TLabel; 15 | lblMines: TLabel; 16 | Image1: TImage; 17 | Image2: TImage; 18 | Image3: TImage; 19 | lblPlace1Name: TLabel; 20 | lblPlace2Name: TLabel; 21 | lblPlace3Name: TLabel; 22 | Button1: TButton; 23 | lblTime1: TLabel; 24 | lblTime2: TLabel; 25 | lblTime3: TLabel; 26 | private 27 | { Private declarations } 28 | fPlace1Time: TDateTIme; 29 | fPlace2Time: TDateTime; 30 | fPlace3Time: TDateTime; 31 | fWidth, fHeight, fMines: Integer; 32 | 33 | function GetSectionKey(): String; 34 | public 35 | { Public declarations } 36 | procedure LoadForConfig(aWidth, aHeight, aMines: Integer); 37 | procedure NewScore(aScore: TDateTime); 38 | end; 39 | 40 | implementation 41 | 42 | uses 43 | IniFiles, DateUtils; 44 | 45 | {$R *.dfm} 46 | 47 | { THighScoresForm } 48 | 49 | function THighScoresForm.GetSectionKey: String; 50 | begin 51 | result := IntToStr(fWidth) + '/' + IntToStr(fHeight) + '/' + IntToStr(fMines); 52 | end; 53 | 54 | procedure THighScoresForm.LoadForConfig(aWidth, aHeight, aMines: Integer); 55 | begin 56 | fWidth := aWidth; 57 | fHeight := aHeight; 58 | fMines := aMines; 59 | 60 | lblBoardSize.Caption := IntToStr(fWidth) + 'x' + IntToStr(fHeight); 61 | lblMines.Caption := IntToStr(fMines); 62 | 63 | var ini := TIniFile.Create('./highscores.ini'); 64 | 65 | try 66 | var key := GetSectionKey(); 67 | 68 | fPlace1Time := ini.ReadDateTime(key, 'Place1Time', EncodeTime(23, 59, 59, 0)); 69 | fPlace2Time := ini.ReadDateTime(key, 'Place2Time', EncodeTime(23, 59, 59, 0)); 70 | fPlace3Time := ini.ReadDateTime(key, 'Place3Time', EncodeTime(23, 59, 59, 0)); 71 | 72 | lblPlace1Name.Caption := ini.ReadString(key, 'Place1Name', ''); 73 | lblPlace2Name.Caption := ini.ReadString(key, 'Place2Name', ''); 74 | lblPlace3Name.Caption := ini.ReadString(key, 'Place3Name', ''); 75 | 76 | var place1timeStr: String; 77 | var place2timeStr: String; 78 | var place3timeStr: String; 79 | DateTimeToString(place1timeStr, 'hh:mm:ss', fPlace1Time); 80 | DateTimeToString(place2timeStr, 'hh:mm:ss', fPlace2Time); 81 | DateTimeToString(place3timeStr, 'hh:mm:ss', fPlace3Time); 82 | lblTime1.Caption := place1timeStr; 83 | lblTime2.Caption := place2timeStr; 84 | lblTime3.Caption := place3timeStr; 85 | finally 86 | FreeAndNil(ini); 87 | end; 88 | end; 89 | 90 | procedure THighScoresForm.NewScore(aScore: TDateTime); 91 | function _getUserName(): String; 92 | begin 93 | InputQuery('New high score!', 'What is your name?', result); 94 | end; 95 | begin 96 | 97 | // Is score worse than 3rd place? -> exit 98 | if aScore >= fPlace3Time then 99 | Exit(); 100 | 101 | var userName := _getUserName(); 102 | 103 | fPlace3Time := aScore; 104 | lblPlace3Name.Caption := userName; 105 | 106 | // Promote to 2nd 107 | if aScore < fPlace2Time then 108 | begin 109 | fPlace3Time := fPlace2Time; 110 | lblPlace3Name.Caption := lblPlace2Name.Caption; 111 | 112 | fPlace2Time := aScore; 113 | lblPlace2Name.Caption := userName; 114 | end; 115 | 116 | // Promote to 1st 117 | if aScore < fPlace1Time then 118 | begin 119 | fPlace2Time := fPlace1Time; 120 | lblPlace2Name.Caption := lblPlace1Name.Caption; 121 | 122 | fPlace1Time := aScore; 123 | lblPlace1Name.Caption := userName; 124 | end; 125 | 126 | // Write 127 | var key := GetSectionKey(); 128 | 129 | var ini := TIniFile.Create('./highscores.ini'); 130 | try 131 | ini.WriteString(key, 'Place1Name', lblPlace1Name.Caption); 132 | ini.WriteString(key, 'Place2Name', lblPlace2Name.Caption); 133 | ini.WriteString(key, 'Place3Name', lblPlace3Name.Caption); 134 | 135 | ini.WriteDateTime(key, 'Place1Time', fPlace1Time); 136 | ini.WriteDateTime(key, 'Place2Time', fPlace2Time); 137 | ini.WriteDateTime(key, 'Place3Time', fPlace3Time); 138 | finally 139 | FreeAndNil(ini); 140 | end; 141 | 142 | // Reload 143 | LoadForConfig(fWidth, fHeight, fMines); 144 | end; 145 | 146 | end. 147 | -------------------------------------------------------------------------------- /UMain.dfm: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu] 5 | BorderStyle = bsSingle 6 | Caption = 'Minesweeper' 7 | ClientHeight = 463 8 | ClientWidth = 632 9 | Color = clBtnFace 10 | Constraints.MinHeight = 160 11 | Constraints.MinWidth = 210 12 | DoubleBuffered = True 13 | Font.Charset = DEFAULT_CHARSET 14 | Font.Color = clWindowText 15 | Font.Height = -12 16 | Font.Name = 'Segoe UI' 17 | Font.Style = [] 18 | Menu = MainMenu1 19 | Position = poScreenCenter 20 | OnCreate = FormCreate 21 | OnResize = FormResize 22 | TextHeight = 15 23 | object Panel1: TPanel 24 | Left = 0 25 | Top = 0 26 | Width = 632 27 | Height = 65 28 | Align = alTop 29 | Caption = 'Panel1' 30 | Color = 11783167 31 | ParentBackground = False 32 | ShowCaption = False 33 | TabOrder = 0 34 | DesignSize = ( 35 | 632 36 | 65) 37 | object lblTime: TLabel 38 | Left = 8 39 | Top = 21 40 | Width = 105 41 | Height = 21 42 | Caption = '00:00:00' 43 | Font.Charset = EASTEUROPE_CHARSET 44 | Font.Color = 4227072 45 | Font.Height = -16 46 | Font.Name = 'Yu Gothic' 47 | Font.Style = [fsBold] 48 | ParentFont = False 49 | end 50 | object lblMines: TLabel 51 | Left = 552 52 | Top = 21 53 | Width = 67 54 | Height = 21 55 | Anchors = [akTop, akRight] 56 | BiDiMode = bdRightToLeft 57 | Caption = '999' 58 | Font.Charset = EASTEUROPE_CHARSET 59 | Font.Color = 4194432 60 | Font.Height = -16 61 | Font.Name = 'Yu Gothic' 62 | Font.Style = [fsBold] 63 | ParentBiDiMode = False 64 | ParentFont = False 65 | end 66 | inline DogFrame1: TDogFrame 67 | Left = 256 68 | Top = 16 69 | Width = 44 70 | Height = 44 71 | DoubleBuffered = True 72 | ParentDoubleBuffered = False 73 | TabOrder = 0 74 | ExplicitLeft = 256 75 | ExplicitTop = 16 76 | end 77 | end 78 | inline BoardFrame1: TBoardFrame 79 | Left = 0 80 | Top = 65 81 | Width = 632 82 | Height = 398 83 | Align = alClient 84 | DoubleBuffered = True 85 | ParentDoubleBuffered = False 86 | TabOrder = 1 87 | ExplicitTop = 65 88 | ExplicitWidth = 632 89 | ExplicitHeight = 398 90 | inherited PaintBox1: TPaintBox 91 | Width = 632 92 | Height = 398 93 | end 94 | end 95 | object MainMenu1: TMainMenu 96 | OwnerDraw = True 97 | Left = 120 98 | Top = 65528 99 | object Game1: TMenuItem 100 | Caption = 'Game' 101 | object NewGame1: TMenuItem 102 | Caption = '&New Game' 103 | OnClick = NewGame1Click 104 | end 105 | object HighScores1: TMenuItem 106 | Caption = 'High Scores' 107 | OnClick = HighScores1Click 108 | end 109 | object HelpAremyflagsgood1: TMenuItem 110 | Caption = 'Help: Are my flags good?' 111 | OnClick = HelpAremyflagsgood1Click 112 | end 113 | object NewGame2: TMenuItem 114 | Caption = '&Exit' 115 | OnClick = NewGame2Click 116 | end 117 | end 118 | object Board1: TMenuItem 119 | Caption = 'Board' 120 | object Small1: TMenuItem 121 | Caption = 'Small' 122 | GroupIndex = 1 123 | RadioItem = True 124 | OnClick = Small1Click 125 | end 126 | object Medium1: TMenuItem 127 | Caption = 'Medium' 128 | GroupIndex = 1 129 | RadioItem = True 130 | OnClick = Medium1Click 131 | end 132 | object Medium2: TMenuItem 133 | Caption = 'Large' 134 | GroupIndex = 1 135 | RadioItem = True 136 | OnClick = Medium2Click 137 | end 138 | object Custom1: TMenuItem 139 | Caption = 'Custom...' 140 | GroupIndex = 1 141 | OnClick = Custom1Click 142 | end 143 | end 144 | end 145 | object Timer1: TTimer 146 | Interval = 100 147 | OnTimer = Timer1Timer 148 | Left = 488 149 | Top = 8 150 | end 151 | end 152 | -------------------------------------------------------------------------------- /UMain.pas: -------------------------------------------------------------------------------- 1 | unit UMain; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.WinXPickers, Vcl.ExtCtrls, 8 | System.ImageList, Vcl.ImgList, Vcl.StdCtrls, UBoardFrame, UMinesweeperGame, 9 | UDoubleBufferedFrame, Vcl.Menus, UDogFrame; 10 | 11 | type 12 | TForm1 = class(TForm) 13 | Panel1: TPanel; 14 | BoardFrame1: TBoardFrame; 15 | MainMenu1: TMainMenu; 16 | Game1: TMenuItem; 17 | NewGame1: TMenuItem; 18 | NewGame2: TMenuItem; 19 | Board1: TMenuItem; 20 | Small1: TMenuItem; 21 | Medium1: TMenuItem; 22 | Medium2: TMenuItem; 23 | Timer1: TTimer; 24 | lblTime: TLabel; 25 | lblMines: TLabel; 26 | DogFrame1: TDogFrame; 27 | Custom1: TMenuItem; 28 | HighScores1: TMenuItem; 29 | HelpAremyflagsgood1: TMenuItem; 30 | procedure FormCreate(Sender: TObject); 31 | procedure NewGame2Click(Sender: TObject); 32 | procedure NewGame1Click(Sender: TObject); 33 | procedure Small1Click(Sender: TObject); 34 | procedure Medium1Click(Sender: TObject); 35 | procedure Medium2Click(Sender: TObject); 36 | procedure Timer1Timer(Sender: TObject); 37 | procedure FormResize(Sender: TObject); 38 | procedure Custom1Click(Sender: TObject); 39 | procedure HighScores1Click(Sender: TObject); 40 | procedure HelpAremyflagsgood1Click(Sender: TObject); 41 | private 42 | { Private declarations } 43 | fGame: TMinesweeperGame; 44 | public 45 | { Public declarations } 46 | end; 47 | 48 | var 49 | Form1: TForm1; 50 | 51 | implementation 52 | 53 | uses 54 | UCustomBoardForm, UHighScoresForm; 55 | 56 | {$R *.dfm} 57 | 58 | procedure TForm1.Custom1Click(Sender: TObject); 59 | begin 60 | var customBoardForm := TCustomBoardForm.create(nil); 61 | try 62 | customBoardForm.seWidth.Value := fGame.BoardWidth; 63 | customBoardForm.seHeight.Value := fGame.BoardHeight; 64 | customBoardForm.seMines.Value := fGame.NumberOfMines; 65 | 66 | if customBoardForm.ShowModal <> mrOk then 67 | Exit(); 68 | 69 | fGame.BoardWidth := customBoardForm.seWidth.Value; 70 | fGame.BoardHeight := customBoardForm.seHeight.Value; 71 | fGame.NumberOfMines := customBoardForm.seMines.Value; 72 | 73 | fGame.NewGame(); 74 | 75 | finally 76 | FreeAndNil(customBoardForm); 77 | end; 78 | end; 79 | 80 | procedure TForm1.FormCreate(Sender: TObject); 81 | begin 82 | fGame := TMinesweeperGame.Create(Self, DogFrame1, BoardFrame1); 83 | fGame.NewGame(); 84 | end; 85 | 86 | procedure TForm1.FormResize(Sender: TObject); 87 | begin 88 | DogFrame1.Left := (ClientWidth - DogFrame1.Width) div 2; 89 | end; 90 | 91 | procedure TForm1.HelpAremyflagsgood1Click(Sender: TObject); 92 | begin 93 | fGame.HelpAreFlagsGood(); 94 | end; 95 | 96 | procedure TForm1.HighScores1Click(Sender: TObject); 97 | begin 98 | var highScoresForm := THighScoresForm.Create(nil); 99 | try 100 | highScoresForm.LoadForConfig(fGame.BoardWidth, fGame.BoardHeight, fGame.NumberOfMines); 101 | highScoresForm.ShowModal(); 102 | finally 103 | FreeAndNil(highScoresForm); 104 | end; 105 | end; 106 | 107 | procedure TForm1.Medium1Click(Sender: TObject); 108 | begin 109 | fGame.BoardWidth := 20; 110 | fGame.BoardHeight := 20; 111 | fGame.NumberOfMines := 75; 112 | fGame.NewGame(); 113 | end; 114 | 115 | procedure TForm1.Medium2Click(Sender: TObject); 116 | begin 117 | fGame.BoardWidth := 80; 118 | fGame.BoardHeight := 40; 119 | fGame.NumberOfMines := 500; 120 | fGame.NewGame(); 121 | end; 122 | 123 | procedure TForm1.NewGame1Click(Sender: TObject); 124 | begin 125 | fGame.NewGame(); 126 | end; 127 | 128 | procedure TForm1.NewGame2Click(Sender: TObject); 129 | begin 130 | Close(); 131 | end; 132 | 133 | procedure TForm1.Small1Click(Sender: TObject); 134 | begin 135 | fGame.BoardWidth := 10; 136 | fGame.BoardHeight := 10; 137 | fGame.NumberOfMines := 20; 138 | fGame.NewGame(); 139 | end; 140 | 141 | procedure TForm1.Timer1Timer(Sender: TObject); 142 | begin 143 | var timeStr: String; 144 | DateTimeToString(timeStr, 'hh:mm:ss', fGame.GetGameTime()); 145 | lblTime.Caption := timeStr; 146 | 147 | lblMines.Caption := IntToStr(fGame.GetUserRemainingMines()); 148 | end; 149 | 150 | end. 151 | -------------------------------------------------------------------------------- /UMinesweeperDataController.pas: -------------------------------------------------------------------------------- 1 | unit UMinesweeperDataController; 2 | 3 | interface 4 | 5 | uses 6 | System.Generics.Collections, System.Classes; 7 | 8 | type 9 | TMineSweeperGameState = (mgsIdle, mgsLeftClick, mgsExploded, mgsVictory); 10 | 11 | TMineSweeperDataController = class; 12 | 13 | TMineField = class 14 | private 15 | fNumberOfMinesAroundCache: Integer; 16 | fIsFlagged: Boolean; 17 | 18 | procedure SetFlagged(aValue: Boolean); 19 | public 20 | HasMine: Boolean; 21 | IsRevealed: Boolean; 22 | IsExplosionSource: Boolean; 23 | Controller: TMineSweeperDataController; 24 | X, Y: Integer; 25 | 26 | property IsFlagged: Boolean read fIsFlagged write SetFlagged; 27 | 28 | function GetNumberOfMinesAround(): Integer; 29 | procedure SwapMinesWith(aOther: TMineField); 30 | procedure OnLeftClicking(); 31 | procedure OnLeftClicked(); 32 | procedure OnRightClicked(); 33 | 34 | constructor Create(aController: TMineSweeperDataController; aX, aY: Integer); 35 | end; 36 | 37 | TMineSweeperDataController = class 38 | private 39 | fWidth, fHeight: Integer; 40 | fNumberOfMines: Integer; 41 | fNumberOfFlags: Integer; 42 | fNumberOfRevealedFields: Integer; 43 | fGameBoard: TObjectList>; 44 | fGameState: TMineSweeperGameState; 45 | fOnRestartRequired: TNotifyEvent; 46 | fOnVictory: TNotifyEvent; 47 | fIsRunning: Boolean; 48 | fStartTime: TDateTime; 49 | fEndTime: TDateTime; 50 | 51 | public 52 | constructor Create(aWidth, aHeight, aNumOfMines: Integer); 53 | 54 | function IsInBounds(aX, aY: Integer): Boolean; 55 | function GetFieldAt(aX, aY: Integer): TMineField; 56 | function GetWidth(): Integer; 57 | function GetHeight(): Integer; 58 | function GetSize(): Integer; 59 | function GetNumberOfMines: Integer; 60 | function GetNumberOfRevealedFields(): Integer; 61 | function GetGameBoard: TObjectList>; 62 | function GetStartTime: TDateTime; 63 | function GetEndTime: TDateTime; 64 | function IsGameOver: Boolean; 65 | function IsVictory: Boolean; 66 | function GetNumberOfFlags: Integer; 67 | function CheckFlagCorrectness: Boolean; 68 | procedure Shuffle(); 69 | procedure OnLeftClicking(); 70 | procedure OnLeftClicked(aSender: TMineField); 71 | procedure OnRightClicked(aSender: TMineField); 72 | procedure OnFlagged(aSender: TMineField); 73 | procedure OnUnFlagged(aSender: TMineField); 74 | 75 | property GameState: TMineSweeperGameState read fGameState write fGameState; 76 | property OnRestartRequired: TNotifyEvent read fOnRestartRequired write fOnRestartRequired; 77 | property OnVictory: TNotifyEvent read fOnVictory write fOnVictory; 78 | property IsRunning: Boolean read fIsRunning; 79 | end; 80 | 81 | 82 | implementation 83 | 84 | uses 85 | System.SysUtils, UMinesweeperGame, System.Math; 86 | 87 | { TMineSweeperDataController } 88 | 89 | function TMineSweeperDataController.CheckFlagCorrectness: Boolean; 90 | begin 91 | for var y := 0 to GetHeight() - 1 do 92 | for var x := 0 to GetWidth() - 1 do 93 | begin 94 | var currentField := GetFieldAt(x, y); 95 | if currentField.IsFlagged and not currentField.HasMine then 96 | Exit(False); 97 | end; 98 | 99 | result := True; 100 | end; 101 | 102 | constructor TMineSweeperDataController.Create(aWidth, aHeight, 103 | aNumOfMines: Integer); 104 | begin 105 | if (aNumOfMines <= 0) or (aNumOfMines >= (aWidth * aHeight)) then 106 | raise Exception.Create('Invalid amount of mines.'); 107 | 108 | if (aHeight <= 0) then 109 | raise Exception.Create('Invalid height.'); 110 | 111 | if (aWidth <= 0) then 112 | raise Exception.Create('Invalid width.'); 113 | 114 | fWidth := aWidth; 115 | fHeight := aHeight; 116 | fGameBoard := TObjectList>.Create(); 117 | fNumberOfMines := aNumOfMines; 118 | 119 | for var y := 0 to aHeight - 1 do 120 | begin 121 | var row := TObjectList.Create(); 122 | fGameBoard.Add(row); 123 | 124 | for var x := 0 to aWidth - 1 do 125 | begin 126 | var field := TMineField.Create(Self, x, y); 127 | row.Add(field); 128 | end; 129 | end; 130 | 131 | for var i := 0 to aNumOfMines - 1 do 132 | begin 133 | var y := i div aWidth; 134 | var x := i mod aWidth; 135 | GetFieldAt(x, y).HasMine := True; 136 | end; 137 | 138 | Shuffle(); 139 | end; 140 | 141 | function TMineSweeperDataController.GetEndTime: TDateTime; 142 | begin 143 | if IsGameOver then 144 | result := fEndTime 145 | else 146 | result := Now(); 147 | end; 148 | 149 | function TMineSweeperDataController.GetFieldAt(aX, aY: Integer): TMineField; 150 | begin 151 | if not IsInBounds(aX, aY) then 152 | raise Exception.Create('Position out of bounds.'); 153 | 154 | result := GetGameBoard()[aY][aX]; 155 | end; 156 | 157 | function TMineSweeperDataController.GetGameBoard: TObjectList>; 158 | begin 159 | result := fGameBoard; 160 | end; 161 | 162 | function TMineSweeperDataController.GetHeight: Integer; 163 | begin 164 | result := fHeight; 165 | end; 166 | 167 | function TMineSweeperDataController.GetNumberOfFlags: Integer; 168 | begin 169 | result := fNumberOfFlags; 170 | end; 171 | 172 | function TMineSweeperDataController.GetNumberOfMines: Integer; 173 | begin 174 | result := fNumberOfMines; 175 | end; 176 | 177 | function TMineSweeperDataController.GetNumberOfRevealedFields: Integer; 178 | begin 179 | result := fNumberOfRevealedFields; 180 | end; 181 | 182 | function TMineSweeperDataController.GetSize: Integer; 183 | begin 184 | result := GetWidth() * GetHeight(); 185 | end; 186 | 187 | function TMineSweeperDataController.GetStartTime: TDateTime; 188 | begin 189 | result := fStartTime; 190 | end; 191 | 192 | function TMineSweeperDataController.GetWidth: Integer; 193 | begin 194 | result := fWidth; 195 | end; 196 | 197 | function TMineSweeperDataController.IsGameOver: Boolean; 198 | begin 199 | result := GameState in [mgsExploded, mgsVictory]; 200 | end; 201 | 202 | function TMineSweeperDataController.IsInBounds(aX, aY: Integer): Boolean; 203 | begin 204 | result := ( 205 | (aX >= 0) and 206 | (aY >= 0) and 207 | (aX < GetWidth()) and 208 | (aY < GetHeight()) 209 | ); 210 | end; 211 | 212 | function TMineSweeperDataController.IsVictory: Boolean; 213 | begin 214 | result := (GetNumberOfMines() + GetNumberOfRevealedFields()) >= GetSize(); 215 | end; 216 | 217 | procedure TMineSweeperDataController.OnFlagged(aSender: TMineField); 218 | begin 219 | Inc(fNumberOfFlags); 220 | end; 221 | 222 | procedure TMineSweeperDataController.OnLeftClicked(aSender: TMineField); 223 | procedure _expand(aX, aY: Integer); 224 | begin 225 | if not IsInBounds(aX, aY) then 226 | Exit(); 227 | 228 | var field := GetFieldAt(aX, aY); 229 | 230 | if field.IsRevealed then 231 | Exit(); 232 | 233 | field.IsRevealed := True; 234 | field.IsFlagged := False; 235 | Inc(fNumberOfRevealedFields); 236 | 237 | if field.GetNumberOfMinesAround() = 0 then 238 | for var dy := -1 to 1 do 239 | for var dx := -1 to 1 do 240 | begin 241 | var xx := aX + dx; 242 | var yy := aY + dy; 243 | 244 | _expand(xx, yy); 245 | end; 246 | end; 247 | 248 | begin 249 | if IsGameOver then 250 | begin 251 | if Assigned(fOnRestartRequired) then 252 | fOnRestartRequired(Self); 253 | 254 | Exit; 255 | end; 256 | 257 | if not fIsRunning then 258 | begin 259 | fIsRunning := True; 260 | fStartTime := Now(); 261 | end; 262 | 263 | GameState := mgsIdle; 264 | 265 | if aSender.HasMine then 266 | begin 267 | aSender.IsExplosionSource := True; 268 | fEndTime := Now(); 269 | GameState := mgsExploded; 270 | 271 | for var y := 0 to GetHeight() - 1 do 272 | for var x := 0 to GetWidth() - 1 do 273 | begin 274 | var field := GetFieldAt(x, y); 275 | if (field.HasMine) then 276 | field.IsRevealed := True; 277 | end; 278 | 279 | end 280 | else 281 | begin 282 | _expand(aSender.X, aSender.Y); 283 | 284 | if IsVictory() then 285 | begin 286 | fEndTime := Now(); 287 | GameState := mgsVictory; 288 | if Assigned(OnVictory) then 289 | OnVictory(Self); 290 | end; 291 | end; 292 | end; 293 | 294 | procedure TMineSweeperDataController.OnLeftClicking; 295 | begin 296 | if GameState = mgsIdle then 297 | GameState := mgsLeftClick; 298 | end; 299 | 300 | procedure TMineSweeperDataController.OnRightClicked(aSender: TMineField); 301 | begin 302 | if (not IsGameOver()) and (not aSender.IsRevealed) then 303 | aSender.IsFlagged := not aSender.IsFlagged; 304 | end; 305 | 306 | procedure TMineSweeperDataController.OnUnFlagged(aSender: TMineField); 307 | begin 308 | Dec(fNumberOfFlags); 309 | end; 310 | 311 | procedure TMineSweeperDataController.Shuffle; 312 | begin 313 | for var y := 0 to GetHeight() - 1 do 314 | for var x := 0 to GetWidth() - 1 do 315 | begin 316 | var currentField := GetFieldAt(x, y); 317 | var targetField := GetFieldAt(Random(GetWidth()), Random(GetHeight())); 318 | currentField.SwapMinesWith(targetField); 319 | end; 320 | end; 321 | 322 | constructor TMineField.Create(aController: TMineSweeperDataController; aX, aY: Integer); 323 | begin 324 | Controller := aController; 325 | X := aX; 326 | Y := aY; 327 | fNumberOfMinesAroundCache := -1; 328 | end; 329 | 330 | function TMineField.GetNumberOfMinesAround: Integer; 331 | begin 332 | if fNumberOfMinesAroundCache <> -1 then 333 | Exit(fNumberOfMinesAroundCache); 334 | 335 | result := 0; 336 | 337 | for var dy := -1 to 1 do 338 | for var dx := -1 to 1 do 339 | begin 340 | if(dy = 0) and (dx = 0) then 341 | Continue; 342 | 343 | var xx := X + dx; 344 | var yy := Y + dy; 345 | 346 | if(Controller.IsInBounds(xx, yy) and (Controller.GetFieldAt(xx, yy).HasMine)) then 347 | Inc(result); 348 | end; 349 | 350 | fNumberOfMinesAroundCache := result; 351 | end; 352 | 353 | procedure TMineField.OnLeftClicked; 354 | begin 355 | Controller.OnLeftClicked(Self); 356 | end; 357 | 358 | procedure TMineField.OnLeftClicking; 359 | begin 360 | Controller.OnLeftClicking(); 361 | end; 362 | 363 | procedure TMineField.OnRightClicked; 364 | begin 365 | Controller.OnRightClicked(Self); 366 | end; 367 | 368 | procedure TMineField.SetFlagged(aValue: Boolean); 369 | begin 370 | if fIsFlagged = aValue then 371 | Exit; 372 | 373 | fIsFlagged := aValue; 374 | 375 | if aValue then 376 | Controller.OnFlagged(Self) 377 | else 378 | Controller.OnUnFlagged(Self); 379 | end; 380 | 381 | procedure TMineField.SwapMinesWith(aOther: TMineField); 382 | begin 383 | var tmp := HasMine; 384 | HasMine := aOther.HasMine; 385 | aOther.HasMine := tmp; 386 | end; 387 | 388 | end. 389 | -------------------------------------------------------------------------------- /UMinesweeperGame.pas: -------------------------------------------------------------------------------- 1 | unit UMinesweeperGame; 2 | 3 | interface 4 | 5 | uses 6 | UMinesweeperDataController, Vcl.Forms, UDogFrame, UBoardFrame; 7 | 8 | type 9 | TMinesweeperGame = class 10 | private 11 | fDataController: TMineSweeperDataController; 12 | fMainWindow: TForm; 13 | fDogFrame: TDogFrame; 14 | fBoardFrame: TBoardFrame; 15 | fBoardWidth, fBoardHeight: Integer; 16 | fNumberOfMines: Integer; 17 | 18 | procedure DataControllerOnRestartRequired(Sender: TObject); 19 | procedure DataControllerOnVictory(Sender: TObject); 20 | 21 | public 22 | constructor Create(aMainWindow: TForm; aDogFrame: TDogFrame; aBoardFrame: TBoardFrame); 23 | 24 | destructor Destroy(); override; 25 | 26 | procedure NewGame(); 27 | function GetGameTime(): TDateTime; 28 | function GetUserRemainingMines(): Integer; 29 | procedure HelpAreFlagsGood(); 30 | 31 | property BoardWidth: Integer read fBoardWidth write fBoardWidth; 32 | property BoardHeight: Integer read fBoardHeight write fBoardHeight; 33 | property NumberOfMines: Integer read fNumberOfMines write fNumberOfMines; 34 | end; 35 | 36 | implementation 37 | 38 | uses 39 | System.SysUtils, UHighScoresForm, Vcl.Dialogs; 40 | 41 | { TMinesweeperGame } 42 | 43 | constructor TMinesweeperGame.Create(aMainWindow: TForm; aDogFrame: TDogFrame; aBoardFrame: TBoardFrame); 44 | begin 45 | fMainWindow := aMainWindow; 46 | fDogFrame := aDogFrame; 47 | fBoardFrame := aBoardFrame; 48 | fBoardWidth := 10; 49 | fBoardHeight := 10; 50 | fNumberOfMines := 20; 51 | end; 52 | 53 | procedure TMinesweeperGame.DataControllerOnRestartRequired(Sender: TObject); 54 | begin 55 | NewGame(); 56 | end; 57 | 58 | procedure TMinesweeperGame.DataControllerOnVictory(Sender: TObject); 59 | begin 60 | var highScoresForm := THighScoresForm.Create(nil); 61 | try 62 | highScoresForm.LoadForConfig(BoardWidth, BoardHeight, NumberOfMines); 63 | highScoresForm.NewScore(GetGameTime()); 64 | highScoresForm.ShowModal(); 65 | finally 66 | FreeAndNil(highScoresForm); 67 | end; 68 | end; 69 | 70 | destructor TMinesweeperGame.Destroy; 71 | begin 72 | FreeAndNil(fDataController); 73 | 74 | inherited; 75 | end; 76 | 77 | function TMinesweeperGame.GetGameTime: TDateTime; 78 | begin 79 | if fDataController.IsRunning then 80 | result := fDataController.GetEndTime() - fDataController.GetStartTime() 81 | else 82 | result := 0; 83 | end; 84 | 85 | function TMinesweeperGame.GetUserRemainingMines: Integer; 86 | begin 87 | result := fDataController.GetNumberOfMines() - fDataController.GetNumberOfFlags(); 88 | end; 89 | 90 | procedure TMinesweeperGame.HelpAreFlagsGood; 91 | begin 92 | if fDataController.CheckFlagCorrectness() then 93 | ShowMessage('The all-knowing dog thinks your flags are good.') 94 | else 95 | ShowMessage('The all-knowing dog does not like your flags.'); 96 | end; 97 | 98 | procedure TMinesweeperGame.NewGame; 99 | begin 100 | var newDataController := TMineSweeperDataController.Create(fBoardWidth, fBoardHeight, fNumberOfMines); 101 | newDataController.OnRestartRequired := DataControllerOnRestartRequired; 102 | newDataController.OnVictory := DataControllerOnVictory; 103 | fBoardFrame.Controller := newDataController; 104 | fDogFrame.Controller := newDataController; 105 | 106 | FreeAndNil(fDataController); 107 | fDataController := newDataController; 108 | fMainWindow.ClientWidth := fBoardFrame.Left + fBoardFrame.GetPreferredWidth(); 109 | fMainWindow.ClientHeight := fBoardFrame.Top + fBoardFrame.GetPreferredHeight(); 110 | end; 111 | 112 | end. 113 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ForgotMyCode/Minesweeper/cd6d20bea949ba96edb4859db6b84d136d0824b5/screenshot.png --------------------------------------------------------------------------------