├── 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 |
134 | dfm
135 |
136 |
137 |
138 |
139 |
140 | dfm
141 | TFrame
142 |
143 |
144 |
145 | dfm
146 | TFrame
147 |
148 |
149 |
150 | dfm
151 | TFrame
152 |
153 |
154 |
155 | dfm
156 |
157 |
158 |
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 | 
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
--------------------------------------------------------------------------------