Compare commits

...

280 Commits

Author SHA1 Message Date
7eed550797 Merge remote-tracking branch 'origin/master' 2023-08-24 09:43:27 +02:00
cc9789c65c ring fix 2023-08-24 09:43:13 +02:00
d64b704274 update menti 2023-08-06 16:36:52 +02:00
ed23f196a6 update menti 2023-08-06 16:32:45 +02:00
b8abdb690b update menti 2023-08-06 16:30:20 +02:00
8d2aad34b2 update menti 2023-08-06 16:25:52 +02:00
e70c7d2be9 update menti 2023-08-06 16:23:55 +02:00
5005670bd3 update menti 2023-08-06 16:21:48 +02:00
b1fc655c0b update menti 2023-08-06 16:12:13 +02:00
9cc4018747 update flappy 2023-07-30 18:46:40 +02:00
849aaf8e27 update flappy 2023-07-30 18:42:53 +02:00
804f178fbf update flappy 2023-07-30 15:08:29 +02:00
c1eecfd567 update flappy 2023-07-30 15:05:47 +02:00
99a2976b61 update flappy 2023-07-30 15:01:20 +02:00
cadcfe8103 update litris with board detection 2023-07-30 14:28:15 +02:00
ab0def9115 update litris with board detection 2023-07-30 10:57:43 +02:00
b24a835f18 update litris with board detection 2023-07-30 10:08:33 +02:00
0a15b57fe5 Merge remote-tracking branch 'origin/master' 2023-07-30 10:00:17 +02:00
a7d2a73b00 update litris with board detection 2023-07-30 10:00:07 +02:00
Thaloria@web.de
3d209ca811 litris update 2023-07-30 00:49:42 +02:00
Thaloria@web.de
01768dc115 litris update 2023-07-30 00:29:36 +02:00
f32cbb8f2d update litris with board detection 2023-07-30 00:08:39 +02:00
7a539e301b update litris with board detection 2023-07-29 21:43:48 +02:00
00461177de update litris with board detection 2023-07-29 21:36:31 +02:00
7c6af4411b update litris with board detection 2023-07-29 21:32:53 +02:00
c3e677ca0a update litris with board detection 2023-07-29 21:30:00 +02:00
332190394d update litris with board detection 2023-07-29 21:20:50 +02:00
d3ace50341 update litris with board detection 2023-07-29 21:14:13 +02:00
8918683e5a update litris with board detection 2023-07-29 21:07:22 +02:00
b08356b036 update litris with board detection 2023-07-29 21:01:51 +02:00
ffca884a25 update litris with board detection 2023-07-29 20:54:00 +02:00
d3d2e1e65e update litris with board detection 2023-07-29 20:46:25 +02:00
6ec1b71d28 update litris with board detection 2023-07-29 20:20:18 +02:00
07d00404d8 update litris with board detection 2023-07-29 20:20:11 +02:00
c9081bd371 update litris with board detection 2023-07-29 20:12:51 +02:00
a9b76cde97 flappy init 2023-07-29 19:42:17 +02:00
2fa0255761 flappy init 2023-07-29 19:34:12 +02:00
c7dd04590a flappy init 2023-07-28 15:31:16 +02:00
189b81b3a0 flappy init 2023-07-28 15:28:25 +02:00
545127dcbc flappy init 2023-07-28 13:26:54 +02:00
bfd8690535 flappy init 2023-07-28 13:13:20 +02:00
c43399ac2a flappy init 2023-07-27 21:16:19 +02:00
33c7400fa4 flappy init 2023-07-27 20:55:54 +02:00
862fbf8bc6 flappy init 2023-07-27 17:58:57 +02:00
8ded30d75a menti words init 2023-07-27 13:02:42 +02:00
eff65b3ca4 menti words init 2023-07-26 22:28:30 +02:00
ef7669f015 menti words init 2023-07-26 22:00:57 +02:00
2d23f8e311 menti words init 2023-07-26 17:11:30 +02:00
38ac30cc64 menti words init 2023-07-26 17:04:53 +02:00
fc965a5133 menti words init 2023-07-26 17:02:57 +02:00
e11b2b8e94 menti words init 2023-07-26 16:58:43 +02:00
a82c069048 menti words init 2023-07-26 16:55:41 +02:00
5c24629b85 menti words init 2023-07-26 16:52:43 +02:00
f1bb158b21 menti words init 2023-07-26 16:49:09 +02:00
95f87d1c2e menti words init 2023-07-26 16:46:15 +02:00
cde729f820 menti words init 2023-07-26 16:43:36 +02:00
9841d6fae4 menti words init 2023-07-26 16:41:08 +02:00
f4d7523c3d menti words init 2023-07-26 16:37:04 +02:00
fec2651930 menti words init 2023-07-26 16:30:14 +02:00
555d66c680 menti words init 2023-07-26 16:29:45 +02:00
2c4e51b44f menti words init 2023-07-26 16:29:15 +02:00
0fcf3d88a2 menti words init 2023-07-26 16:27:23 +02:00
12f86cc7fd menti words init 2023-07-26 16:19:41 +02:00
bdb448932d menti words init 2023-07-26 16:16:13 +02:00
1893d513f2 menti words init 2023-07-26 16:10:47 +02:00
5713422f49 threading update 2023-07-26 11:33:46 +02:00
1b9711a851 added async stone detection thread 2023-07-26 09:54:49 +02:00
7b63568fa5 added async stone detection thread 2023-07-26 09:46:33 +02:00
3c02d413a2 added async stone detection thread 2023-07-26 09:31:48 +02:00
84830e94a8 added async stone detection thread 2023-07-26 09:05:27 +02:00
d2c89cdc93 added async stone detection thread 2023-07-26 08:49:50 +02:00
3d2ce694e1 added async stone detection thread 2023-07-26 08:43:30 +02:00
e0a9cbc394 added async stone detection thread 2023-07-26 08:37:04 +02:00
fd6f17c3f8 added async stone detection thread 2023-07-26 08:25:39 +02:00
Thaloria@web.de
54cb23a923 litris update 2023-07-25 12:11:56 +02:00
Thaloria@web.de
de56e687f8 litris update 2023-07-25 11:54:05 +02:00
3fa581a935 added async stone detection thread 2023-07-25 10:02:32 +02:00
e7932f5762 added async stone detection thread 2023-07-25 09:59:20 +02:00
b570813c5a added async stone detection thread 2023-07-25 09:47:52 +02:00
8049e58e71 added async stone detection thread 2023-07-25 09:41:04 +02:00
5e201ea341 added async stone detection thread 2023-07-25 09:37:41 +02:00
37cf7f2f2f added async stone detection thread 2023-07-25 09:04:26 +02:00
e5cd8d6399 added async stone detection thread 2023-07-25 08:54:13 +02:00
Thaloria@web.de
3c723fb602 litris update 2023-07-25 08:43:04 +02:00
d3fa6fe807 added async stone detection thread 2023-07-24 13:54:42 +02:00
a2575370f9 added async stone detection thread 2023-07-24 13:51:16 +02:00
22edbe9a2f added async stone detection thread 2023-07-24 13:42:41 +02:00
e832ffe9ec added async stone detection thread 2023-07-24 13:34:49 +02:00
773aa5c765 added async stone detection thread 2023-07-24 13:33:41 +02:00
687218e29d added async stone detection thread 2023-07-24 13:22:44 +02:00
f35fe32264 litris fixes 2023-07-24 11:15:11 +02:00
a21f43fcfc added async stone detection thread 2023-07-24 10:14:41 +02:00
50ab6e17ef added async stone detection thread 2023-07-24 09:59:13 +02:00
761fa778c7 added async stone detection thread 2023-07-24 09:18:30 +02:00
62ff7cb40d added first draft litris 2023-07-23 18:38:50 +02:00
e614ba8dd0 added first draft litris 2023-07-23 18:13:21 +02:00
6d6081ec57 added first draft litris 2023-07-23 17:45:37 +02:00
c4f71f469b added first draft litris 2023-07-23 17:45:22 +02:00
17ff660069 added first draft litris 2023-07-23 17:25:03 +02:00
27f7638557 added first draft litris 2023-07-23 14:28:12 +02:00
Thaloria@web.de
6012a51538 litris update 2023-07-23 14:24:09 +02:00
ba2fd6c945 added first draft litris 2023-07-23 14:03:44 +02:00
f4b949c070 added first draft litris 2023-07-23 12:01:24 +02:00
0e265b0bb6 added first draft litris 2023-07-23 11:52:55 +02:00
b9d0e829bc added first draft litris 2023-07-23 11:32:23 +02:00
76d22227bf added first draft litris 2023-07-23 11:24:54 +02:00
ae752bdb7c added first draft litris 2023-07-22 21:22:44 +02:00
aa2662003d added first draft litris 2023-07-22 20:59:06 +02:00
47a7a50335 added first draft litris 2023-07-22 20:54:29 +02:00
2d35e032b5 added first draft litris 2023-07-22 20:52:36 +02:00
21237c3729 added first draft litris 2023-07-22 20:47:42 +02:00
1d4980eb95 added first draft litris 2023-07-22 20:45:30 +02:00
d78319a9f4 added first draft litris 2023-07-22 20:39:20 +02:00
fba0c2c506 litris fixes 2023-07-22 10:54:32 +02:00
704b1f462d added first draft litris 2023-07-22 09:49:15 +02:00
3176bf5269 added first draft litris 2023-07-22 09:44:48 +02:00
c2b5416542 added first draft litris 2023-07-21 15:28:22 +02:00
2906cb10e4 added first draft litris 2023-07-21 15:18:57 +02:00
93832d8bfc added first draft litris 2023-07-21 15:09:02 +02:00
ff173fea80 added first draft litris 2023-07-21 14:36:21 +02:00
d0f4937507 added first draft litris 2023-07-21 14:31:07 +02:00
403db80292 added first draft litris 2023-07-20 20:09:23 +02:00
b76ccf448e added first draft litris 2023-07-20 19:31:27 +02:00
b08b5fcb89 added first draft litris 2023-07-20 19:19:36 +02:00
0b97e346d8 added first draft litris 2023-07-20 19:17:38 +02:00
378259ab1c added first draft litris 2023-07-20 18:55:47 +02:00
597f7f426e added first draft litris 2023-07-20 18:51:12 +02:00
5eaa9ff5d4 added first draft litris 2023-07-19 21:30:52 +02:00
4d9ccbfd90 added first draft new pickaxe try 2023-07-17 20:44:03 +02:00
95abea3920 added first draft new pickaxe try 2023-07-17 20:33:14 +02:00
0df3f2d8a9 added first draft new pickaxe try 2023-07-17 20:31:24 +02:00
40fb6b7918 added first draft new pickaxe try 2023-07-17 14:18:45 +02:00
5cd1d63fc8 added first draft new pickaxe try 2023-07-17 14:14:46 +02:00
2d46fd65b9 added smaler mining area 2023-05-06 19:26:02 +02:00
Thaloria@web.de
a9e25527f5 update farm for 4.0 2023-05-05 19:17:40 +02:00
c7deaaf6c7 added sodoku to ui 2023-05-05 19:09:44 +02:00
f49087776e Merge remote-tracking branch 'origin/master' 2023-04-30 21:04:57 +02:00
b64dad8e5b added sodoku to ui 2023-04-30 21:04:40 +02:00
Thaloria@web.de
56cf726d4f timing changes 2023-04-30 20:31:41 +02:00
7af6f0c7ed fix equipment.py 2023-04-28 18:20:54 +02:00
71871d83f0 Merge branch 'master' of http://git.face-down.de/Thaloria/Litcraft_Python_B 2023-04-28 18:08:01 +02:00
bebcac9cf3 fix equipment.py 2023-04-28 17:59:55 +02:00
059712770a fix equipment.py 2023-04-28 17:58:51 +02:00
Thaloria@web.de
2264e0fb19 added fruit game support 2023-04-28 16:09:40 +02:00
86d2542edc added sodoku game first draft 2023-04-28 15:46:36 +02:00
088a4d9030 added sodoku game first draft 2023-04-28 15:42:03 +02:00
81d0c09003 added sodoku game first draft 2023-04-28 15:32:17 +02:00
07d3f5388e added sodoku game first draft 2023-04-28 15:25:03 +02:00
Thaloria@web.de
3772fbb843 Merge remote-tracking branch 'origin/master' 2023-04-28 15:12:10 +02:00
Thaloria@web.de
187cb80cf2 added fruit game support 2023-04-28 15:12:00 +02:00
33059b0a95 added sodoku game first draft 2023-04-28 15:11:21 +02:00
c4c6c34709 4.0 fixes to fruit game 2023-04-28 07:20:39 +02:00
4c6a3d04c7 added ok button check to magic 2023-04-28 06:47:12 +02:00
aa92f20758 added ok button check to magic 2022-11-17 12:28:18 +01:00
Thaloria@web.de
79db89b90b added fruit game support 2022-10-31 17:06:38 +01:00
ec7bdf6eb1 added fruit game support 2022-10-31 16:39:07 +01:00
90b7177273 added fruit game support 2022-10-31 16:29:41 +01:00
52e3fd001a added fruit game support 2022-10-31 16:24:21 +01:00
9931b9804e added fruit game support 2022-10-31 16:19:56 +01:00
25f9cb80e0 added fruit game support 2022-10-31 16:06:23 +01:00
60889a08c6 added fruit game support 2022-10-31 16:04:42 +01:00
16b34bf7b3 added fruit game support 2022-10-31 16:00:44 +01:00
2b425186d1 added fruit game support 2022-10-31 15:59:34 +01:00
8f7cc6a38e staff 1 fix revert 2022-10-24 19:41:52 +02:00
c10e4f94f2 staff 1 fix revert 2022-10-24 19:35:40 +02:00
70623a3e6f staff 1 fix 2022-10-24 19:18:59 +02:00
f1bde80746 refactoring
bug fix equip multi
2022-10-22 12:05:45 +02:00
4bfa9aa408 fixed instance bug with member variables 2022-10-19 17:05:11 +02:00
61fc1a2837 new ui elements for timing 2022-10-19 16:58:16 +02:00
ef3e9632f6 new ui elements for timing 2022-10-19 15:33:53 +02:00
81b7fe2871 new ui elements for timing 2022-10-19 08:58:58 +02:00
46aeba1b1b new ui elements for timing 2022-10-19 08:53:20 +02:00
8b8cc4f8e7 new ui elements for timing 2022-10-19 08:51:45 +02:00
22592e3a49 new ui elements for timing 2022-10-19 08:44:50 +02:00
84c1df4e9a new ui elements for timing 2022-10-19 00:36:37 +02:00
90ff452e10 new ui elements for timing 2022-10-19 00:25:59 +02:00
1992c549c1 new ui elements for timing 2022-10-18 23:27:41 +02:00
7a1cf3f009 new ui elements for timing 2022-10-18 23:19:33 +02:00
Thaloria@web.de
3a8c8568ac bug fix 5s 2022-10-18 23:07:43 +02:00
c5921b6657 added strategy parameter
new ui elements for timing
2022-10-18 22:19:14 +02:00
1d4d415a19 added strategy parameter
new ui elements for timing
2022-10-18 22:16:39 +02:00
a4617ed062 refactoring to game base class 2022-10-18 20:42:50 +02:00
90c6920296 refactoring to game base class 2022-10-17 22:17:16 +02:00
7723ca57c2 refactoring to game base class 2022-10-17 17:40:27 +02:00
c8e7c4d60c refactoring to game base class 2022-10-17 17:25:20 +02:00
d9b8434484 refactoring to game base class 2022-10-17 17:12:27 +02:00
14a5983d17 refactoring to game base class 2022-10-17 17:11:56 +02:00
433170b4c8 fixes 2022-10-17 12:02:47 +02:00
6941b2667a fixed instance bug with member variables 2022-10-17 11:57:15 +02:00
5aa2b59b37 Merge remote-tracking branch 'origin/master' 2022-10-17 08:19:24 +02:00
3c2162d638 removed prints 2022-10-16 19:40:13 +02:00
3601e30fe4 Merge remote-tracking branch 'origin/master' 2022-10-16 19:27:25 +02:00
d2b9521031 added detonate before next level 2022-10-16 19:26:11 +02:00
e662739f57 Merge remote-tracking branch 'origin/master' 2022-10-16 18:07:15 +02:00
862ce4c837 added mining ui mode 2022-10-16 17:17:58 +02:00
43926eb6da added mining ui mode 2022-10-16 16:39:27 +02:00
08d1370001 added mining ui mode 2022-10-16 15:57:08 +02:00
df525a4215 added craft ui mode 2022-10-16 15:30:59 +02:00
5e16e3f14c added magic and craft to new ui 2022-10-16 15:12:53 +02:00
b3a32a4ad1 added magic and craft to new ui 2022-10-16 15:08:08 +02:00
d7cff148ab updated ui elements 2022-10-16 14:26:25 +02:00
82a60026b2 updated ui elements 2022-10-16 14:23:11 +02:00
4d9f3faeba new all bot ui add farm and crops 2022-10-16 13:49:11 +02:00
8b42a75956 new all bot ui and equipment added 2022-10-16 13:09:04 +02:00
b05cf3ba0f fixed double action bug 2022-10-16 01:00:52 +02:00
19926a7973 added spawn option to combine overlay
fixed perceiving red bug
2022-10-16 00:53:05 +02:00
3b43135383 added counterreset on explosive stuck 2022-10-15 21:41:31 +02:00
d67b2d7947 added counterreset on explosive stuck 2022-10-15 21:28:02 +02:00
577aab928a added reset trigger to farm 2022-10-15 21:20:00 +02:00
45451cb185 added strategy rnd 2022-10-15 20:00:16 +02:00
619d629321 added color rnd 2022-10-15 19:21:59 +02:00
4a264c3439 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	craft_table/main_craft.py
2022-10-14 20:37:01 +02:00
b6315f7b0e added pauses to loop management 2022-10-14 20:35:41 +02:00
aeb236abae fixed numerous bugs 2022-10-14 20:28:06 +02:00
d7316d7d9c added color switch and reset trigger 2022-10-14 18:10:54 +02:00
cdd0dbb780 added color switch and reset trigger 2022-10-14 17:09:55 +02:00
09d99aeafd added color switch and reset trigger 2022-10-14 17:05:44 +02:00
74c06fb6e9 added color switch and reset trigger 2022-10-14 16:57:59 +02:00
d9a304523e added color switch and reset trigger 2022-10-14 16:50:09 +02:00
a77f66cb77 added color switch and reset trigger 2022-10-14 16:39:21 +02:00
5cf2e9f72a added color switch and reset trigger 2022-10-14 16:27:32 +02:00
c89f1aa3c6 added color preference to crop bot 2022-10-14 16:22:59 +02:00
5c6abc0cda added color preference to crop bot 2022-10-13 20:43:02 +02:00
0e2c2d5318 fixed numerous bugs 2022-10-13 17:50:13 +02:00
9bc892cc75 added crop game first shot 2022-10-13 16:31:49 +02:00
c36e7a931e added crop game first shot 2022-10-13 16:31:09 +02:00
4c2e5ae77b added ui for magic combine 2022-10-11 17:52:46 +02:00
86b6d060aa big fix equip ui 2022-10-11 17:24:17 +02:00
6cd9cc84d2 added craft bot 2022-10-11 17:23:19 +02:00
8376dba417 added ui support to farm bot 2022-10-11 17:22:46 +02:00
3d408eb909 added ui support to equipment bot 2022-10-10 13:07:07 +02:00
cd59c9a838 added additional detection to farming 2022-10-10 13:06:36 +02:00
4ce0040be9 updated images for 3.3 version 2022-10-10 13:05:10 +02:00
9a2c40c5c4 added 3s with gap support
added explosive detonation on stuck
2022-10-07 16:19:35 +02:00
c20887157c added farm bot
fixed magic needles
2022-10-05 13:01:58 +02:00
8aa44a7f90 added farm bot
fixed magic needles
2022-10-05 13:01:33 +02:00
728baa010b minor fixes 2022-06-13 16:45:37 +02:00
5e25b8303f minor fixes 2022-06-13 16:42:41 +02:00
2930eb04b1 updated mask on pixel level 2022-05-23 17:07:02 +02:00
669607414e updated mask on pixel level 2022-05-23 14:13:42 +02:00
1edda09afa added rune 4 2022-05-22 14:59:34 +02:00
f015b4c3c8 added chest4 key4 support 2022-05-22 14:48:44 +02:00
df3ec676be added rune 3 to equip 2022-05-22 14:30:12 +02:00
69fe7cbec4 added timed loop exit to equip 2022-05-22 13:19:36 +02:00
ee2c8b7daf fix equip ok button 2022-05-22 01:31:51 +02:00
de7a61e127 added multi run and energy limits to equip 2022-05-21 23:53:20 +02:00
ccea230bf1 added multi run and energy limits to equip 2022-05-21 23:49:37 +02:00
36c0b2fcb0 added equip level 6-7 rings
minor digging fix
2022-05-21 17:52:59 +02:00
afe970d450 added equip level 5-7 wands 2022-05-21 14:54:44 +02:00
703d12adc9 added equip level 7 sword 2022-05-21 13:34:23 +02:00
b86b6fa879 added equip level 7 sword 2022-05-21 13:09:16 +02:00
8472ff2b7a added equip level 6 sword 2022-05-21 13:04:17 +02:00
2267b0c736 added equip ok button check 2022-05-21 11:20:37 +02:00
4f2d99f755 added equip ok button check 2022-05-21 10:49:08 +02:00
5b4dfc0a05 fixed loop for double dig
added additional sort for equip
2022-05-20 22:42:11 +02:00
6f7e40b5da added loop for double dig 2022-05-18 22:49:55 +02:00
7873de1d6f bugfix matching loop break 2022-05-18 17:16:06 +02:00
246510bf03 re-implement equipment with masks 2022-05-16 22:15:25 +02:00
a8c0b98f75 re-implement equipment with masks 2022-05-16 21:51:36 +02:00
d362b9e2c8 re-implement equipment with masks 2022-05-16 14:57:15 +02:00
7feb318a99 re-implement equipment with masks 2022-05-16 14:49:30 +02:00
4ffd873578 re-implement equipment with masks 2022-05-16 14:48:23 +02:00
a5b0f22111 re-implement equipment with masks 2022-05-15 10:46:57 +02:00
883a6f77aa re-implement equipment with masks 2022-05-15 00:50:42 +02:00
e7b15cc48a impl staff 2022-05-07 01:55:47 +02:00
3f9771a0fa impl staff 2022-05-07 01:54:41 +02:00
7f7f221faf updated digging times 2022-05-07 00:16:42 +02:00
51d4731d38 updated equip 2022-05-06 17:49:58 +02:00
485b3ba7f4 dig failed added opencv 2022-05-06 12:50:44 +02:00
a969b33c7a cleanup 2022-05-05 21:32:35 +02:00
bcaa608cd3 cleanup 2022-05-05 21:31:55 +02:00
2e97ee07b8 refactor equipemnt
fix digging overlay
2022-05-05 21:27:38 +02:00
ecb3f5df9e refactor dig 2022-05-04 01:51:45 +02:00
dddfa60c77 refactor dig 2022-05-02 21:20:15 +02:00
62dc818be1 refactor dig 2022-05-02 19:54:43 +02:00
f9455ade48 refactor dig 2022-05-02 19:54:29 +02:00
3318d309fc refactor dig 2022-05-01 20:33:53 +02:00
c0d02bf7bf refactor dig 2022-05-01 18:45:12 +02:00
1b774b0a75 refactor equip 2022-05-01 17:31:18 +02:00
6d6cabfa42 refactor digging 2022-05-01 17:18:19 +02:00
616 changed files with 5749 additions and 981 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/venv/

3
.idea/misc.xml generated
View File

@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectPlainTextFileTypeManager">
<file url="file://$PROJECT_DIR$/sharpening.py" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (lc-py-b)" project-jdk-type="Python SDK" />
</project>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -1,202 +0,0 @@
import random
from time import time
from window_capture import WindowCapture
from vision import Vision
import cv2 as cv
import pytesseract
from hsvfilter import HsvFilter
from config_file import UserConfigs
# import pyautogui
import pydirectinput
import keyboard
def run():
# initialize the user-class
config = UserConfigs()
# initialize the StunWindowCapture class
try:
capture_window = WindowCapture(
None, "magic", config)
video_mode = False
except:
# StunWindowCapture.list_window_names()
# print("Game not running, switching to video mode")
# capture_window = cv.VideoCapture("snip_slam.mp4")
video_mode = True
# initialize the StunVision class
vision_stun = Vision()
# initialize the StunOverlay class
hsv_filter_orange = HsvFilter(10, 156, 0, 17, 255, 255, 0, 0, 0, 0)
hsv_filter_p = HsvFilter(130, 156, 0, 179, 255, 255, 0, 0, 0, 0)
hsv_filter_b = HsvFilter(88, 156, 0, 128, 255, 255, 0, 0, 0, 0)
hsv_filter_g = HsvFilter(34, 156, 0, 74, 255, 255, 0, 0, 0, 0)
hsv_filter_y = HsvFilter(24, 156, 0, 33, 255, 255, 0, 0, 0, 0)
hsv_filter_0 = HsvFilter(0, 0, 0, 179, 255, 255, 255, 0, 0, 0)
hsv_filter_w = HsvFilter(69, 25, 0, 94, 255, 255, 0, 0, 0, 0)
loop_time = time()
pause = True
magic_list = {"1": "body", "2": "finding", "3": "mind", "4": "perceiving", "5": "physical", "6": "seeing",
"7": "spiritual"}
tier_list = {"1": "0", "2": "orange", "3": "y", "4": "g", "5": "b", "6": "p"} # , "w"}
hsv_filter_list = {"1": hsv_filter_0, "2": hsv_filter_orange, "3": hsv_filter_y, "4": hsv_filter_g,
"5": hsv_filter_b, "6": hsv_filter_p}
needle_list = []
hsv_list = []
for key1 in tier_list:
for key2 in magic_list:
needle_list.append(cv.imread("magic/" + magic_list[key2] + "_" + tier_list[key1] + ".jpg",
cv.IMREAD_UNCHANGED))
hsv_list.append(hsv_filter_list[key1])
while True:
if keyboard.is_pressed('p') == True:
pause = True
print('q pressed')
elif keyboard.is_pressed('o') == True:
pause = False
print('o pressed')
if pause:
# cv.waitKey(500)
print("pausing")
continue
if video_mode:
break
else:
try:
# get an updated image of the game
screenshot = capture_window.get_screenshot()
# screenshot = cv.imread("buffbar.jpg")
except:
capture_window.release()
print("Game window not available - shutting down application")
break
#cv.imshow("screenshot", screenshot)
#cv.waitKey(150)
#continue
spawn_1 = vision_stun.find(screenshot, cv.imread("magic/spawn_1.jpg", cv.IMREAD_UNCHANGED), 0.5, 1)
if len(spawn_1) == 1:
spawn_button_active = True
points = vision_stun.get_click_points(spawn_1)
for i in range(0, 200, 1):
pydirectinput.moveTo(points[0][0], points[0][1])
pydirectinput.mouseDown()
w = random.randint(1, 50)
cv.waitKey(30 + w)
pydirectinput.mouseUp()
else:
spawn_0 = vision_stun.find(screenshot, cv.imread("magic/spawn_0.jpg", cv.IMREAD_UNCHANGED), 0.7, 1)
points = vision_stun.get_click_points(spawn_0)
for point in points:
pydirectinput.moveTo(point[0], point[1])
pydirectinput.mouseDown()
cv.waitKey(500)
pydirectinput.mouseUp()
continue
# for needles in needle_list:
for rer in range(0, len(needle_list), 1):
#for needle in needle_list:
# do object detection
# processed_image = vision_stun.apply_hsv_filter(screenshot, hsv_filter)
# screenshot = capture_window.get_screenshot()
#cv.imshow("output_image", needle_list[rer])
#cv.waitKey(150)
while True:
screenshot = capture_window.get_screenshot()
processed_screenshot = vision_stun.apply_hsv_filter(screenshot, hsv_list[rer])
processed_needle = vision_stun.apply_hsv_filter(needle_list[rer], hsv_list[rer])
#cv.imshow("output_image", processed_screenshot)
cv.imshow("output_needle", processed_needle)
cv.waitKey(150)
rectangles = vision_stun.find(processed_screenshot, processed_needle, 0.70, 2)
# draw the detection results onto the original image
#output_image = vision_stun.draw_rectangles(screenshot, rectangles)
#cv.imshow("output_image", output_image)
#cv.waitKey(150)
# only trigger ocr reading if a stun is detected
points = vision_stun.get_click_points(rectangles)
if len(points) == 2:
pydirectinput.moveTo(points[0][0], points[0][1])
pydirectinput.mouseDown()
w = random.randint(1, 100)
cv.waitKey(250 + w)
pydirectinput.moveTo(points[1][0], points[1][1])
pydirectinput.mouseUp()
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
else:
break
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
needles_white = []
needles_white.append(cv.imread("magic/body_w.jpg", cv.IMREAD_UNCHANGED))
needles_white.append(cv.imread("magic/finding_w.jpg", cv.IMREAD_UNCHANGED))
needles_white.append(cv.imread("magic/mind_w.jpg", cv.IMREAD_UNCHANGED))
needles_white.append(cv.imread("magic/perceiving_w.jpg", cv.IMREAD_UNCHANGED))
needles_white.append(cv.imread("magic/physical_w.jpg", cv.IMREAD_UNCHANGED))
needles_white.append(cv.imread("magic/seeing_w.jpg", cv.IMREAD_UNCHANGED))
needles_white.append(cv.imread("magic/spiritual_w.jpg", cv.IMREAD_UNCHANGED))
for needle_w in needles_white:
# do object detection
screenshot = capture_window.get_screenshot()
processed_screenshot = vision_stun.apply_hsv_filter(screenshot,hsv_filter_w)
processed_needle = vision_stun.apply_hsv_filter(needle_w, hsv_filter_w)
rectangles = vision_stun.find(processed_screenshot, processed_needle, 0.7, 1)
# draw the detection results onto the original image
# output_image = vision_stun.draw_rectangles(screenshot, rectangles)
# cv.imshow("output_image", output_image)
# cv.waitKey(150)
points = vision_stun.get_click_points(rectangles)
if len(points) >= 1:
pydirectinput.moveTo(points[0][0], points[0][1])
pydirectinput.mouseDown()
w = random.randint(1, 100)
cv.waitKey(100 + w)
pydirectinput.mouseUp()
screenshot = capture_window.get_screenshot()
rectangles = vision_stun.find(screenshot, cv.imread("magic/collect.jpg", cv.IMREAD_UNCHANGED), 0.8, 1)
points = vision_stun.get_click_points(rectangles)
if len(points) >= 1:
pydirectinput.moveTo(points[0][0], points[0][1])
pydirectinput.mouseDown()
w = random.randint(1, 100)
cv.waitKey(100 + w)
pydirectinput.mouseUp()
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
# debug the loop rate
print('FPS {}'.format(1 / (time() - loop_time)))
loop_time = time()
cv.waitKey(150)
if __name__ == "__main__":
run()

84
combined_bot_main.py Normal file
View File

@@ -0,0 +1,84 @@
import sys
import cv2 as cv
from combined_user_interface import PrimaryOverlay
from equipment import Equipment
from crops import Crops
from farm import Farm
from magic import Magic
from craft import Craft
from mine import Mine
from sodoku import Sodoku
from fruit import Fruit
from pickaxe import Pickaxe_Field
from litris import Litris
from menti_words import MentiWords
from flappy import Flappy
def run():
overlay = PrimaryOverlay()
while True:
if overlay.run_mode == 'stopped':
overlay.update_status_label("stopped")
overlay.run_mode = 'init'
continue
elif overlay.run_mode == 'started':
cv.waitKey(1000)
pass
elif overlay.run_mode == 'init':
cv.waitKey(1)
continue
elif overlay.run_mode == 'paused':
continue
elif overlay.run_mode == 'finished':
overlay.update_status_label("finished")
overlay.run_mode = 'init'
continue
elif overlay.run_mode == 'quit':
return
else:
break
if overlay.rb_int.get() == 1:
equip = Equipment(overlay)
equip.execute_main_loop()
elif overlay.rb_int.get() == 2:
crops = Crops(overlay)
crops.execute_main_loop()
elif overlay.rb_int.get() == 3:
farm = Farm(overlay)
farm.execute_main_loop()
elif overlay.rb_int.get() == 4:
magic = Magic(overlay)
magic.execute_main_loop()
elif overlay.rb_int.get() == 5:
craft = Craft(overlay)
craft.execute_main_loop()
elif overlay.rb_int.get() == 6:
mine = Mine(overlay)
mine.execute_main_loop()
elif overlay.rb_int.get() == 7:
fruit = Fruit(overlay)
fruit.execute_main_loop()
elif overlay.rb_int.get() == 8:
sodo = Sodoku(overlay)
sodo.execute_main_loop()
elif overlay.rb_int.get() == 9:
paxe = Pickaxe_Field(overlay)
paxe.execute_main_loop()
elif overlay.rb_int.get() == 10:
ltris = Litris(overlay)
ltris.execute_main_loop()
ltris.stone_id_thread.run_mode = 'stop'
elif overlay.rb_int.get() == 11:
menti = MentiWords(overlay)
menti.execute_main_loop()
elif overlay.rb_int.get() == 12:
flappy = Flappy(overlay)
flappy.execute_main_loop()
flappy.flappy_pos_disc.run_mode = 'stop'
if __name__ == "__main__":
run()
sys.exit()

375
combined_user_interface.py Normal file
View File

@@ -0,0 +1,375 @@
# Run tkinter code in another thread
import threading
import tkinter as tk
import game_base_class
from tkinter import ttk
from mine_overlay import DiggingOverlay
class PrimaryOverlay(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.MiningOverlay = DiggingOverlay
self.run_mode = 'init'
self.root = tk.Tk
self.rb_frame = tk.Frame
self.ButtonFrame = tk.Frame
self.parameter_frame = tk.Frame
self.parameter_label_frame = tk.Frame
self.timing_frame = tk.Frame
self.rb_int = tk.IntVar
self.energy_use = tk.StringVar
self.spawn_use = tk.StringVar
self.emitter_use = tk.StringVar
self.EnergyLabel = tk.Label
self.EnergyEntry = tk.Entry
self.SpawnLabel = tk.Label
self.SpawnEntry = tk.Entry
self.EmitterLabel = tk.Label
self.Emitter_Box = ttk.Combobox
self.RadioButtons = dict
self.RadioButtonNames = ["Equip", "Crops", "Farm", "Magic", "Craft", "Mine", "Fruit", "Sodo", "PAxe", "Ltris", "Menti", "Flapp"]
self.RadioButton1 = tk.Radiobutton
self.RadioButton2 = tk.Radiobutton
self.RadioButton3 = tk.Radiobutton
self.RadioButton4 = tk.Radiobutton
self.RadioButton5 = tk.Radiobutton
self.RadioButton6 = tk.Radiobutton
self.RadioButton7 = tk.Radiobutton
self.RadioButton8 = tk.Radiobutton
self.RadioButton9 = tk.Radiobutton
self.RadioButton10 = tk.Radiobutton
self.RadioButton11 = tk.Radiobutton
self.RadioButton12 = tk.Radiobutton
self.StartButton = tk.Button
self.StopButton = tk.Button
self.PauseButton = tk.Button
self.QuitButton = tk.Button
self.TkPosition = '133x454+60+600'
self.setDaemon(True)
self.StatusLabel = tk.Label
self.global_timeout_label = tk.Label
self.hourly_breaks_label = tk.Label
self.break_duration_label = tk.Label
self.global_timeout_entry = tk.Entry
self.hourly_breaks_entry = tk.Entry
self.break_duration_entry = tk.Entry
self.global_timeout_use = tk.StringVar
self.hourly_breaks_use = tk.StringVar
self.break_duration_use = tk.StringVar
# self.TkPosition = config.returnEnemyPlayerOverlayPos()
#
self.start()
def run(self):
self.MiningOverlay = DiggingOverlay(game_base_class.MINING_LARGE)
self.root = tk.Tk()
self.rb_frame = tk.Frame(self.root)
self.rb_int = tk.IntVar(self.root, value=1)
self.RadioButtons = dict()
# var = tk.IntVar(value=1)
for i in range(1, 13):
self.RadioButtons[i] = tk.Radiobutton(self.rb_frame, text=self.RadioButtonNames[i - 1],
variable=self.rb_int,
value=i, command=self.radio_button_callback)
self.RadioButtons[i].grid(row=i, column=0, sticky='w')
self.parameter_frame = tk.Frame(self.root)
self.energy_use = tk.StringVar(self.root, value='2000')
self.spawn_use = tk.StringVar(self.root, value='25')
self.emitter_use = tk.StringVar(self.root, value='multi')
self.EnergyLabel = tk.Label(self.parameter_frame, text="Runs:", font=("Helvetica", 10, "bold"),
background="grey", width='6')
self.EnergyEntry = tk.Entry(self.parameter_frame, textvariable=self.energy_use, font=("Helvetica", 10, "bold"),
width='10')
self.SpawnLabel = tk.Label(self.parameter_frame, text="Spawn:", font=("Helvetica", 10, "bold"),
background="grey", width='6')
self.SpawnEntry = tk.Entry(self.parameter_frame, textvariable=self.spawn_use, font=("Helvetica", 10, "bold"),
width='10')
self.EmitterLabel = tk.Label(self.parameter_frame, text="Emitter:", font=("Helvetica", 10, "bold"),
background="grey", width='6')
self.Emitter_Box = ttk.Combobox(self.parameter_frame, textvariable=self.emitter_use,
font=("Helvetica", 8, "bold"),
width='9')
self.Emitter_Box['values'] = ('multi', 'main', 'mushroom', 'amulett', 'sword', 'staff', 'wand', 'ring')
self.EnergyLabel.grid(row=0, column=0, sticky='w')
self.EnergyEntry.grid(row=0, column=1)
self.SpawnLabel.grid(row=1, column=0, sticky='w')
self.SpawnEntry.grid(row=1, column=1)
self.EmitterLabel.grid(row=2, column=0, sticky='w')
self.Emitter_Box.grid(row=2, column=1)
self.ButtonFrame = tk.Frame(self.root)
self.StartButton = tk.Button(self.ButtonFrame, text="Start", command=self.start_button_callback, width='5')
self.StopButton = tk.Button(self.ButtonFrame, text="Stop", command=self.stop_button_callback, width='5',
state=tk.DISABLED)
self.PauseButton = tk.Button(self.ButtonFrame, text="Pause", command=self.pause_button_callback, width='5',
state=tk.DISABLED)
self.QuitButton = tk.Button(self.ButtonFrame, text="Quit", command=self.quit_button_callback, width='5',
state=tk.NORMAL)
self.StartButton.grid(row=0, column=0)
self.StopButton.grid(row=1, column=0)
self.PauseButton.grid(row=2, column=0)
self.QuitButton.grid(row=4, column=0)
self.StatusLabel = tk.Label(self.root, text="Nothing to see here", font=("Helvetica", 10, "bold"),
background="grey", anchor=tk.CENTER)
self.timing_frame = tk.Frame(self.root)
self.global_timeout_use = tk.StringVar(self.root, value='0')
self.hourly_breaks_use = tk.StringVar(self.root, value='0')
self.break_duration_use = tk.StringVar(self.root, value='1-3')
self.global_timeout_label = tk.Label(self.timing_frame, text="Stop after (h):", font=("Helvetica", 10, "bold"),
background="grey", width='12')
self.hourly_breaks_label = tk.Label(self.timing_frame, text="Breaks:", font=("Helvetica", 10, "bold"),
background="grey", width='12')
self.break_duration_label = tk.Label(self.timing_frame, text="Break time (m):", font=("Helvetica", 10, "bold"),
background="grey", width='12')
self.global_timeout_entry = tk.Entry(self.timing_frame, textvariable=self.global_timeout_use, font=("Helvetica", 10, "bold"),
width='3')
self.hourly_breaks_entry = tk.Entry(self.timing_frame, textvariable=self.hourly_breaks_use, font=("Helvetica", 10, "bold"),
width='3')
self.break_duration_entry = tk.Entry(self.timing_frame, textvariable=self.break_duration_use, font=("Helvetica", 10, "bold"),
width='3', state=tk.DISABLED)
self.global_timeout_label.grid(row=0, column=0, sticky='w', columnspan=2 )
self.global_timeout_entry.grid(row=0, column=3)
self.hourly_breaks_label.grid(row=1, column=0, sticky='w', columnspan=2)
self.hourly_breaks_entry.grid(row=1, column=3)
self.break_duration_label.grid(row=2, column=0, sticky='w', columnspan=2)
self.break_duration_entry.grid(row=2, column=3)
self.rb_frame.grid(row=0, column=0, sticky='w')
self.ButtonFrame.grid(row=0, column=1, sticky='w')
self.parameter_frame.grid(row=1, column=0, columnspan=2, sticky='w')
self.timing_frame.grid(row=2, column=0, columnspan=2, sticky='w')
self.StatusLabel.grid(row=3, column=0, columnspan=2)
# self.ClearButton.pack(side="top")
self.root.geometry(self.TkPosition)
self.root.overrideredirect(1) # fenster ohne aussen rum :-)
# self.root.attributes('-alpha', 0.7) # fenster transparent
self.root.attributes('-topmost', 1) # fenster immer im vordergrund
# self.root.wm_attributes("-disabled", True)
# self.root.configure(background='black')
self.hide_mining_overlay()
self.root.mainloop()
def callback(self):
self.root.quit()
def destroy(self):
self.hide_mining_overlay()
del self.MiningOverlay
self.root.destroy()
def start_button_callback(self):
self.StartButton.configure(state=tk.DISABLED)
self.StopButton.configure(state=tk.NORMAL)
self.PauseButton.configure(state=tk.NORMAL)
self.QuitButton.configure(state=tk.DISABLED)
for i in range(1, 9):
tt = self.rb_int.get()
if self.rb_int.get() != i:
(self.RadioButtons[i]).configure(state=tk.DISABLED)
self.StatusLabel.configure(text='started')
self.run_mode = 'started'
def stop_button_callback(self):
self.StartButton.configure(state=tk.NORMAL)
self.StopButton.configure(state=tk.DISABLED)
self.PauseButton.configure(state=tk.DISABLED)
self.QuitButton.configure(state=tk.NORMAL)
for i in range(1, 9):
self.RadioButtons[i].configure(state=tk.NORMAL)
self.run_mode = 'stopped'
def pause_button_callback(self):
self.StartButton.configure(state=tk.NORMAL)
self.StopButton.configure(state=tk.NORMAL)
self.PauseButton.configure(state=tk.DISABLED)
self.QuitButton.configure(state=tk.DISABLED)
self.run_mode = 'paused'
def quit_button_callback(self):
self.run_mode = 'quit'
def radio_button_callback(self):
if self.rb_int.get() == 1:
self.EnergyEntry.configure(state=tk.NORMAL)
self.energy_use.set('2000')
self.SpawnEntry.configure(state=tk.NORMAL)
self.spawn_use.set('25')
self.Emitter_Box.configure(state=tk.NORMAL)
self.Emitter_Box.configure(values=('multi', 'main', 'mushroom', 'amulett', 'sword', 'staff', 'wand', 'ring'))
self.EmitterLabel.configure(text="Emitter:")
self.SpawnLabel.configure(text="Spawn:")
self.EnergyLabel.configure(text="Runs:")
self.emitter_use.set('multi')
self.hide_mining_overlay()
elif self.rb_int.get() == 2:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.NORMAL)
self.Emitter_Box.configure(values=('rainbow', 'bigbomb', 'rocket', 'bomb'))
self.emitter_use.set('rainbow')
self.EmitterLabel.configure(text="Strat:")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 3:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 4:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.NORMAL)
self.spawn_use.set('100')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="Spawn:")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 5:
self.EnergyEntry.configure(state=tk.NORMAL)
self.energy_use.set('100')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.NORMAL)
self.Emitter_Box.configure(values=('m25x1', 'm10x2', 'm5x3', 'simple', 'm1x5_T', 'm1x5_X', 'house'))
self.emitter_use.set('simple')
self.EmitterLabel.configure(text="Mode:")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="Runs:")
self.hide_mining_overlay()
elif self.rb_int.get() == 6:
self.EnergyEntry.configure(state=tk.NORMAL)
self.energy_use.set('2')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="Runs:")
self.show_mining_overlay()
elif self.rb_int.get() == 7:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 8:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 9:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 10:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 11:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
elif self.rb_int.get() == 12:
self.EnergyEntry.configure(state=tk.DISABLED)
self.energy_use.set('')
self.SpawnEntry.configure(state=tk.DISABLED)
self.spawn_use.set('')
self.Emitter_Box.configure(state=tk.DISABLED)
self.emitter_use.set('')
self.EmitterLabel.configure(text="")
self.SpawnLabel.configure(text="")
self.EnergyLabel.configure(text="")
self.hide_mining_overlay()
def get_run_mode(self):
return self.run_mode
def update_status_label(self, msg):
self.StatusLabel.configure(text=msg)
def hide_mining_overlay(self):
self.MiningOverlay.hide_window()
def show_mining_overlay(self):
self.MiningOverlay.show_window()
def get_strategy_value_as_int(self):
if self.emitter_use.get() == "rainbow":
return 11
elif self.emitter_use.get() == "bigbomb":
return 9
elif self.emitter_use.get() == "rocket":
return 7
elif self.emitter_use.get() == "bomb":
return 5
else:
return 11

View File

@@ -17,7 +17,17 @@ class UserConfigs:
elif user_from_env == self.EDDIEUSER:
self.user = self.EDDIEUSER
else:
self.user = self.ADWAUSER
self.user = self.THALOUSER
def returnOKWindowPos(self):
if self.user == self.THALOUSER:
return [310, 200, 1120, 920]
elif self.user == self.ADWAUSER:
return [740, 450, 1625, 985]
elif self.user == self.EDDIEUSER:
return [740, 450, 1625, 985]
else:
pass
def returnMagicWindowPos(self):
if self.user == self.THALOUSER:
@@ -49,9 +59,12 @@ class UserConfigs:
else:
pass
def returnEquipmentWindowPos(self):
def returnDiggingWindowPos2(self, large=True):
if self.user == self.THALOUSER:
return [1800, 1150, 0, 0]
if large:
return [1440, 1150, 570, 22]
else:
return [1440, 210, 560, 700]
elif self.user == self.ADWAUSER:
return [740, 450, 1625, 985]
elif self.user == self.EDDIEUSER:
@@ -59,6 +72,26 @@ class UserConfigs:
else:
pass
def returnEquipmentWindowPos(self):
if self.user == self.THALOUSER:
return [1800, 1150, 250, 250]
elif self.user == self.ADWAUSER:
return [740, 450, 1625, 985]
elif self.user == self.EDDIEUSER:
return [740, 450, 1625, 985]
else:
pass
def returnDiggingOverlayPos(self):
if self.user == self.THALOUSER:
return '1440x1150+570+22'
elif self.user == self.ADWAUSER:
return '160x160+-900+600'
elif self.user == self.EDDIEUSER:
return '330x45+-900+920'
else:
pass
def return_database_ip(self):
if self.user == self.THALOUSER:
return "192.168.178.201"

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
control_elements/play.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

332
craft.py Normal file
View File

@@ -0,0 +1,332 @@
import cv2 as cv
from utils import get_click_point, dig_point, check_for_craft_ok_button, check_for_craft_button
import pydirectinput
from config_file import UserConfigs
from window_capture import WindowCapture
from vision import Vision
from game_base_class import GameBase
MODE25X1 = "m25x1"
MODE10X2 = "m10x2"
MODE5X3 = "m5x3"
MODE_SIMPLE_STACK = "simple"
MODE1X5_T = "m1x5_T"
MODE1X5_X = "m1x5_X"
MODE_HOUSE = "house"
class Craft(GameBase):
def __init__(self, overlay):
super().__init__(overlay)
self.mode = str(overlay.emitter_use.get())
self.run_target = int(overlay.energy_use.get())
self.run_counter = 0
self.dimension = 172
def assess_playfield_and_make_move(self):
if self.run_counter >= self.run_target:
self.run_counter = 0
self.overlay.run_mode = 'finished'
return
ab1 = [420, 1180, 142, 142]
ab2 = [562, 1180, 142, 142]
ab3 = [704, 1180, 142, 142]
ab4 = [846, 1180, 142, 142]
ab5 = [986, 1180, 142, 142]
ab6 = [1128, 1180, 142, 142]
ab10 = [1698, 1180, 142, 142]
if self.mode == MODE25X1:
self.click_square_center(ab1)
# grid 770 1630 160 1020 172 o
self.dimension = 172
for i in range(0, 5, 1):
for e in range(0, 5, 1):
self.click_square_center(
[770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension])
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_craft_button()
for i in range(0, 5, 1):
for e in range(0, 5, 1):
self.collect_grid_reverse_click(
[770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension])
self.run_counter = self.run_counter + 1
self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab10)
elif self.mode == MODE10X2:
for r in range(0, 2, 1):
# grid 770 1630 160 1020 172
if r == 0:
self.click_square_center(ab1)
start = 0
target = 3
else:
self.click_square_center(ab2)
start = 1
target = 4
for i in range(start, target, 2):
for e in range(0, 5, 1):
self.click_square_center(
[770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension,
self.dimension])
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_craft_button()
for i in range(0, 4, 2):
for e in range(0, 5, 1):
self.collect_grid_reverse_click(
[770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension])
self.run_counter = self.run_counter + 1
self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab10)
elif self.mode == MODE5X3:
for r in range(0, 3, 1):
# grid 770 1630 160 1020 172oo
self.dimension = 172
if r == 0:
self.click_square_center(ab1)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
start = 0
target = 1
elif r == 1:
self.click_square_center(ab2)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
start = 1
target = 2
else:
self.click_square_center(ab3)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
start = 2
target = 3
for i in range(start, target, 1):
for e in range(0, 5, 1):
self.click_square_center(
[770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension,
self.dimension])
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_craft_button()
for i in range(0, 1, 1):
if self.overlay.run_mode == 'stopped':
return
for e in range(0, 5, 1):
self.collect_grid_reverse_click(
[770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension])
self.run_counter = self.run_counter + 1
self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab10)
elif self.mode == MODE1X5_T:
tps = [ab1,
[770 + (0 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension],
[770 + (1 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension],
ab2,
[770 + (2 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension],
[770 + (2 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension],
[770 + (2 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension]]
result_tp = [770 + (0 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension]
for tp in tps:
self.click_square_center(tp)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_craft_button()
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(result_tp)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab10)
self.run_counter = self.run_counter + 1
self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
elif self.mode == MODE1X5_X:
tps = [ab1,
[770 + (0 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (1 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (2 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (1 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension],
[770 + (1 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension]]
result_tp = [770 + (0 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension]
for tp in tps:
self.click_square_center(tp)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_craft_button()
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(result_tp)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab10)
self.run_counter = self.run_counter + 1
self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
elif self.mode == MODE_HOUSE:
cements = [[770 + (0 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension],
[770 + (1 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension],
[770 + (2 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension],
[770 + (3 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension],
[770 + (4 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension]]
bricks = [[770 + (0 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (1 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (3 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (4 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (0 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension],
[770 + (2 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension],
[770 + (4 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension]]
boards = [[770 + (2 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension],
[770 + (0 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension],
[770 + (1 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension],
[770 + (2 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension],
[770 + (3 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension],
[770 + (4 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension],
[770 + (2 * self.dimension), 160 + (0 * self.dimension), self.dimension, self.dimension]]
glasses = [[770 + (1 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension],
[770 + (3 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension]]
tp_hammer = [770 + (1 * self.dimension), 160 + (0 * self.dimension), self.dimension, self.dimension]
tp_nails = [770 + (3 * self.dimension), 160 + (0 * self.dimension), self.dimension, self.dimension]
tp_result = [770 + (0 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension]
self.click_square_center(ab1)
for cement in cements:
self.click_square_center(cement)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab2)
for brick in bricks:
self.click_square_center(brick)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab3)
for board in boards:
self.click_square_center(board)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab4)
for glass in glasses:
self.click_square_center(glass)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab5)
self.click_square_center(tp_hammer)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(ab6)
self.click_square_center(tp_nails)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_craft_button()
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.click_square_center(tp_result)
self.click_square_center(ab10)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.run_counter = self.run_counter + 1
self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
elif self.mode == MODE_SIMPLE_STACK:
# initialize the StunWindowCapture class
capture_config = UserConfigs()
# capture_window = WindowCapture(None, "screen_conf", capture_config)
capture_window2 = WindowCapture(None, "bla", capture_config)
# initialize the StunVision class
vision_stun = Vision()
# dig_overlay = DiggingOverlay(config)
check_for_craft_button(capture_window2, vision_stun)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
check_for_craft_ok_button(capture_window2, vision_stun)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
self.run_counter = self.run_counter + 1
self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter))
# check_for_ok_button(capture_window, vision_stun, capture_config)
def collect_grid_reverse_click(self, square):
pydirectinput.moveTo(get_click_point(square)[0], get_click_point(square)[1])
cv.waitKey(50)
pydirectinput.mouseUp()
cv.waitKey(50)
pydirectinput.mouseDown()
cv.waitKey(100)
def click_craft_button(self):
dig_point(1910, 330, 100)
cv.waitKey(1500)
def click_square_center(self, square):
cp = get_click_point(square)
dig_point(cp[0], cp[1], 100)
cv.waitKey(100)

BIN
craft_table/ok_button.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
craft_table/play.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

23
create_mask_from_png.py Normal file
View File

@@ -0,0 +1,23 @@
import cv2 as cv
import os
import numpy as np
from window_capture import WindowCapture
from config_file import UserConfigs
#uc = UserConfigs()
#wc = WindowCapture(None, None, uc)
#screen = wc.get_screenshot(False)
# load the original input image and display it to our screen
#filename = "equip/chests/chest_23_32"
path = "flappy/"
os.chdir(path)
for entry in os.listdir():
if entry.endswith('.png'):
nelk = entry[:len(entry)-4]
if nelk.find('-mask') == -1:
out = nelk + "-mask.png"
img = cv.imread(entry, cv.IMREAD_UNCHANGED)
cv.imwrite(out, img[:, :, 3])

BIN
crop/arrow_down.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
crop/arrow_right.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
crop/artisent.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
crop/bigbomb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
crop/blue.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
crop/bomb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
crop/chemtrant.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
crop/cibutrant.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
crop/green.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
crop/maginent.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
crop/playfield.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
crop/purple.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
crop/rainbow.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
crop/red.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
crop/tenesent.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
crop/yellow.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

394
crops.py Normal file
View File

@@ -0,0 +1,394 @@
import random
import cv2 as cv
import numpy as np
import pydirectinput
from utils import mse
from utils import get_click_point
from hsvfilter import HsvFilter
from game_base_class import GameBase
GREEN = 1
YELLOW = 2
RED = 3
BLUE = 4
PURPLE = 5
RAINBOW = 6
BIGBOMB = 7
BOMB = 8
ARROW_DOWN = 9
ARROW_RIGHT = 10
ROCK_1 = 11
ROCK_2 = 12
ROCK_3 = 13
BURGER = 14
PAB1 = 15
GOLDBAR = 16
MAGINENT = 21
CHEMTRANT = 22
TENESENT = 23
CIBUTRANT = 24
ARTISENT = 25
STATUS_FOUND_CONTINUATION = "1"
STATUS_FOUND_DEADEND = "2"
STATUS_FOUND_ENDING = "3"
RAINBOW_STRATEGY = 11
BIGBOMB_STRATEGY = 9
ROCKET_STRATEGY = 7
BOMB_STRATEGY = 5
class Crops(GameBase):
def __init__(self, overlay):
super().__init__(overlay)
self.screenshot = []
self.needles = {}
self.hsh_needles = {}
self.colors.append(PURPLE)
self.current_strategy = overlay.get_strategy_value_as_int()
self.fill_data_coordinates()
self.set_color_order((GREEN, YELLOW, RED, BLUE, PURPLE))
def set_color_order(self, order):
self.needles.clear()
self.needles = {order[0]: cv.imread("crop/green.jpg", cv.IMREAD_COLOR),
order[1]: cv.imread("crop/yellow.jpg", cv.IMREAD_COLOR),
order[2]: cv.imread("crop/red.jpg", cv.IMREAD_COLOR),
order[3]: cv.imread("crop/blue.jpg", cv.IMREAD_COLOR),
order[4]: cv.imread("crop/purple.jpg", cv.IMREAD_COLOR),
RAINBOW: cv.imread("crop/rainbow.jpg", cv.IMREAD_COLOR),
BIGBOMB: cv.imread("crop/bigbomb.jpg", cv.IMREAD_COLOR),
BOMB: cv.imread("crop/bomb.jpg", cv.IMREAD_COLOR),
ARROW_DOWN: cv.imread("crop/arrow_down.jpg", cv.IMREAD_COLOR),
ARROW_RIGHT: cv.imread("crop/arrow_right.jpg", cv.IMREAD_COLOR),
MAGINENT: cv.imread("crop/maginent.jpg", cv.IMREAD_COLOR),
CHEMTRANT: cv.imread("crop/chemtrant.jpg", cv.IMREAD_COLOR),
TENESENT: cv.imread("crop/tenesent.jpg", cv.IMREAD_COLOR),
CIBUTRANT: cv.imread("crop/cibutrant.jpg", cv.IMREAD_COLOR),
ARTISENT: cv.imread("crop/artisent.jpg", cv.IMREAD_COLOR)
}
self.hsh_needles.clear()
self.hsh_needles = {order[0]: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
order[1]: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
order[2]: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
order[3]: HsvFilter(60, 40, 0, 115, 255, 255, 0, 0, 0, 0),
order[4]: HsvFilter(120, 45, 0, 170, 255, 255, 0, 0, 0, 0),
RAINBOW: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
BIGBOMB: HsvFilter(60, 40, 0, 179, 129, 129, 0, 0, 0, 0),
BOMB: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
ARROW_DOWN: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
ARROW_RIGHT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
MAGINENT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
CHEMTRANT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
TENESENT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
CIBUTRANT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
ARTISENT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0)
}
def assess_playfield_and_make_move(self):
new_observation, new_screenshot = self.get_current_board_state()
# wrong movement detection
# last board state is same as actual
if mse(new_observation, self.observation) == 0.0:
# no movement detected -> blow explosives or reset
self.reset_counter += 1
if self.reset_counter == 1:
pass
elif self.reset_counter == 2:
if self.detonate_explosive_when_stuck(new_observation):
new_observation, new_screenshot = self.get_current_board_state()
if mse(new_observation, self.observation) != 0.0:
self.reset_counter = 0
return
elif self.reset_counter >= 3:
screenshot = self.capture_window.get_screenshot()
if self.check_for_button_and_execute(screenshot, self.reset_board):
cv.waitKey(500)
screenshot = self.capture_window.get_screenshot()
if self.check_for_button_and_execute(screenshot, self.reset_confirm):
cv.waitKey(500)
color_list = [PURPLE, BLUE, RED, YELLOW, GREEN]
random.shuffle(color_list)
self.set_color_order(color_list)
self.current_strategy = random.choice([RAINBOW_STRATEGY, BIGBOMB_STRATEGY,
ROCKET_STRATEGY, BOMB_STRATEGY])
self.reset_counter = 0
return
else:
return
self.find_patterns_and_valid_moves(new_observation)
self.observation = new_observation
return new_observation
def get_current_board_state(self):
# get an updated image of the game
screenshot = self.capture_window.get_screenshot()
# screenshot = cv.imread("playfield.jpg")
screenshot = screenshot[190:1230, 260:2090]
self.screenshot = screenshot
# gray = cv.cvtColor(screenshot, cv.COLOR_BGR2GRAY)
# thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)[1]
offset_left = 230
offset_down = 58
if self.check_for_button_and_execute(screenshot, self.next_level, offset_left, offset_down):
self.set_color_order((GREEN, YELLOW, RED, BLUE, PURPLE))
self.current_strategy = RAINBOW_STRATEGY
cv.waitKey(500)
screenshot = self.capture_window.get_screenshot()
screenshot = screenshot[190:1230, 260:2090]
if self.check_for_button_and_execute(screenshot, self.next_level_x, offset_left, offset_down):
cv.waitKey(500)
screenshot = self.capture_window.get_screenshot()
screenshot = screenshot[190:1230, 260:2090]
# cv.imshow("screenshot", screenshot)
# cv.waitKey(150)
# continue
data_coords = np.zeros((8, 14), dtype=object)
# field = Pickaxe_Field()
for needle_key in self.needles.keys():
# gray_needle = cv.cvtColor(self.needles[needle_key], cv.COLOR_BGR2GRAY)
# thresh_needle = cv.threshold(gray_needle, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)[1]
processed_screenshot = self.vision_stun.apply_hsv_filter(screenshot, self.hsh_needles[needle_key])
processed_needle = self.vision_stun.apply_hsv_filter(self.needles[needle_key], self.hsh_needles[needle_key])
rectangles = self.vision_stun.find(processed_screenshot, processed_needle, 0.70, 56)
# rectangles = self.vision_stun.find(screenshot, self.needles[needle_key], 0.70, 56)
if len(rectangles) == 0:
continue
points = self.vision_stun.get_click_points(rectangles)
for point in points:
x, y = self.point_in_rect(point)
if x is not None and y is not None:
data_coords[x][y] = int(needle_key)
# self.change_value(x, y, int(needle_key))
# print(field.data_value_grid)
# cv.circle(screenshot, points[0], 7, (0, 255, 0), -1)
# output_image = vision_stun.draw_rectangles(screenshot, rectangles)
# cv.imshow("output_image", output_image)
# cv.waitKey(150)
score_map = np.zeros((8, 14), dtype=object)
for x in range(0, 8, 1):
for y in range(0, 14, 1):
score_map[x, y] = self.score_for_attached_same_color_all_directions(data_coords, x, y)
#cv.putText(screenshot, str(score_map[x, y]),
# self.get_click_point(self.data_coordinates[x, y]), cv.FONT_HERSHEY_SIMPLEX,
# 1, (0, 0, 0), 3, 2)
#cv.imwrite('screenshot_scored.jpg', screenshot)
return data_coords, screenshot
def find_patterns_and_valid_moves(self, state):
# score_map = np.zeros((8, 14), dtype=object)
for x in range(0, 8, 1):
for y in range(0, 14, 1):
self.data_score_map[x, y] = self.score_for_attached_same_color_all_directions(state, x, y)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
full_moves = []
reserve_moves = []
for x in range(0, 8, 1):
for y in range(0, 14, 1):
if self.check_explosives(state, x, y):
return
if self.data_score_map[x, y] >= 4:
path_option = [[x, y]]
recursion_reminder = [[x, y]]
result = self.find_next_same_color_all_directions_recursion(state, x, y, path_option,
recursion_reminder, True)
if result == STATUS_FOUND_ENDING:
path_option.append([x, y])
if len(path_option) >= 5:
full_moves.append((state[x, y], path_option))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.data_score_map[x, y] >= 1:
path_option = [[x, y]]
self.find_next_same_color_all_directions_recursion2(state, x, y, path_option)
if len(path_option) >= 3:
reserve_moves.append((state[x, y], path_option))
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
# print(self.data_score_map)
# screenshot = cv.imread("screenshot_scored.jpg")
full_dic = self.convert_moves_to_dic_by_color(full_moves)
res_dic = self.convert_moves_to_dic_by_color(reserve_moves)
full_moves.sort(key=len, reverse=True)
reserve_moves.sort(key=len, reverse=True)
if len(full_dic) >= 1:
for key in sorted(full_dic):
if len(full_dic[key]) >= self.current_strategy:
#self.print_move(full_dic[key])
self.execute_move(full_dic[key])
return
if len(reserve_moves) >= 1:
for key in sorted(res_dic):
#self.print_move(res_dic[key])
self.execute_move(res_dic[key])
break
@staticmethod
def convert_moves_to_dic_by_color(reserve_moves):
dic = {}
for color, move in reserve_moves:
if color in dic:
if len(move) > len(dic[color]):
dic[color] = move
else:
dic[color] = move
return dic
def print_move(self, move):
mp = []
for point in move:
cp = self.get_click_point(self.data_coordinates[point[0], point[1]])
mp.append(cp)
cv.polylines(self.screenshot,
[np.array(mp)],
isClosed=False,
color=(0, 255, 0),
thickness=3)
cv.imwrite('screenshot_pathed.jpg', self.screenshot)
def execute_move(self, move):
offset_left = 230
offset_down = 58
first = True
for cords in move:
square = self.data_coordinates[cords[0], cords[1]]
pydirectinput.moveTo(get_click_point(square)[0] + offset_left, get_click_point(square)[1] + offset_down)
cv.waitKey(50)
if first:
pydirectinput.mouseDown()
cv.waitKey(100)
first = False
pydirectinput.mouseUp()
cv.waitKey(50)
@staticmethod
def get_directions_array(current_x, current_y):
left_x = current_x
left_y = current_y - 1
right_x = current_x
right_y = current_y + 1
upper_x = current_x - 1
upper_y = current_y
lower_x = current_x + 1
lower_y = current_y
lower_left_x = current_x + 1
lower_left_y = current_y - 1
lower_right_x = current_x + 1
lower_right_y = current_y + 1
upper_left_x = current_x - 1
upper_left_y = current_y - 1
upper_right_x = current_x - 1
upper_right_y = current_y + 1
directions = [[left_x, left_y], [lower_left_x, lower_left_y], [lower_x, lower_y],
[lower_right_x, lower_right_y], [right_x, right_y], [upper_right_x, upper_right_y],
[upper_x, upper_y], [upper_left_x, upper_left_y]]
return directions
def find_next_same_color_all_directions_recursion(self, state, current_x, current_y, path_store, recursion_reminder,
look_for_ending):
directions = self.get_directions_array(current_x, current_y)
color = state[current_x, current_y]
for direction in directions:
if self.is_direction_in_bounce_and_same_color(state, direction, color) == 1:
if (self.data_score_map[direction[0], direction[1]] >= 2) and (direction not in recursion_reminder):
recursion_reminder.append(direction)
result = self.find_next_same_color_all_directions_recursion(state, direction[0], direction[1],
path_store, recursion_reminder,
look_for_ending)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
break
if result == STATUS_FOUND_CONTINUATION:
path_store.append(direction)
return STATUS_FOUND_CONTINUATION
elif result == STATUS_FOUND_DEADEND:
if look_for_ending:
continue
else:
path_store.append(direction)
return STATUS_FOUND_DEADEND
elif result == STATUS_FOUND_ENDING:
path_store.append(direction)
return STATUS_FOUND_ENDING
if look_for_ending:
for direction in directions:
if direction == path_store[0]:
# path_store.append(direction)
return STATUS_FOUND_ENDING
return STATUS_FOUND_DEADEND
def find_next_same_color_all_directions_recursion2(self, state, current_x, current_y, path_store):
directions = self.get_directions_array(current_x, current_y)
color = state[current_x, current_y]
for direction in directions:
if self.is_direction_in_bounce_and_same_color(state, direction, color) == 1:
if (self.data_score_map[direction[0], direction[1]] >= 1) and (direction not in path_store):
path_store.append(direction)
result = self.find_next_same_color_all_directions_recursion2(state, direction[0], direction[1],
path_store)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
break
if result == STATUS_FOUND_DEADEND:
return STATUS_FOUND_DEADEND
return STATUS_FOUND_DEADEND
def score_for_attached_same_color_all_directions(self, state, current_x, current_y):
directions = self.get_directions_array(current_x, current_y)
score = 0
color = state[current_x, current_y]
if color not in self.colors:
return score
for direction in directions:
score = score + self.is_direction_in_bounce_and_same_color(state, direction, color)
return score

172
cv_test_2.py Normal file
View File

@@ -0,0 +1,172 @@
from __future__ import print_function
import sys
import cv2 as cv
import numpy as np
from hsvfilter import HsvFilter
use_mask = False
img = None
templ = None
mask = None
image_window = "Source Image"
result_window = "Result window"
match_method = 3
max_Trackbar = 5
def main():
global img
global templ
img = cv.imread("equip/rings/test_screen.jpg", cv.IMREAD_COLOR)
templ = cv.imread("equip/rings/ring_1_32.jpg", cv.IMREAD_COLOR)
hsv = HsvFilter(13, 40, 85, 135, 255, 255, 0, 0, 55, 53)
#img = apply_hsv_filter(img, hsv)
#templ = apply_hsv_filter(templ, hsv)
global use_mask
use_mask = True
global mask
mask = cv.imread("equip/rings/ring_1_32-mask.png", cv.IMREAD_COLOR)
cv.namedWindow(image_window, cv.WINDOW_AUTOSIZE)
cv.namedWindow(result_window, cv.WINDOW_AUTOSIZE)
trackbar_label = 'Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED'
cv.createTrackbar(trackbar_label, image_window, match_method, max_Trackbar, MatchingMethod)
MatchingMethod(match_method)
cv.waitKey(0)
return 0
def draw_rectangles(haystack_img, rectangles):
# these colors are actually BGR
line_color = (0, 255, 0)
line_type = cv.LINE_4
pic = None
for (x, y, w, h) in rectangles:
# determine the box positions
top_left = (x, y)
bottom_right = (x + w, y + h)
# draw the box
cv.rectangle(haystack_img, top_left, bottom_right, line_color, lineType=line_type)
#pic = haystack_img[y:y + h, x:x + w]
return haystack_img
def shift_channel(c, amount):
if amount > 0:
lim = 255 - amount
c[c >= lim] = 255
c[c < lim] += amount
elif amount < 0:
amount = -amount
lim = amount
c[c <= lim] = 0
c[c > lim] -= amount
return c
def apply_hsv_filter(original_image, hsv_filter):
# convert image to HSV
hsv = cv.cvtColor(original_image, cv.COLOR_BGR2HSV)
# add/subtract saturation and value
h, s, v = cv.split(hsv)
s = shift_channel(s, hsv_filter.sAdd)
s = shift_channel(s, -hsv_filter.sSub)
v = shift_channel(v, hsv_filter.vAdd)
v = shift_channel(v, -hsv_filter.vSub)
hsv = cv.merge([h, s, v])
# Set minimum and maximum HSV values to display
lower = np.array([hsv_filter.hMin, hsv_filter.sMin, hsv_filter.vMin])
upper = np.array([hsv_filter.hMax, hsv_filter.sMax, hsv_filter.vMax])
# Apply the thresholds
mask = cv.inRange(hsv, lower, upper)
result = cv.bitwise_and(hsv, hsv, mask=mask)
# convert back to BGR for imshow() to display it properly
img = cv.cvtColor(result, cv.COLOR_HSV2BGR)
return img
def MatchingMethod(param):
global match_method
match_method = param
img_display = img.copy()
method_accepts_mask = (cv.TM_SQDIFF == match_method or match_method == cv.TM_CCORR_NORMED)
if (use_mask and method_accepts_mask):
result = cv.matchTemplate(img, templ, match_method, None, mask)
else:
result = cv.matchTemplate(img, templ, match_method)
#_minVal, _maxVal, minLoc, maxLoc = cv.minMaxLoc(result, None)
cv.normalize(result, result, 0, 1, cv.NORM_MINMAX, -1)
#_minVal, _maxVal, minLoc, maxLoc = cv.minMaxLoc(result, None)
locations = np.where(result >= 0.91)
locations = list(zip(*locations[::-1]))
needle_w = templ.shape[1]
needle_h = templ.shape[0]
find_num = 20
idx_1d = np.argpartition(result.flatten(), -find_num)[-find_num:]
#new_res = result.flatten()[idx_1d]
#new_res.append()
idx_2d = np.unravel_index(idx_1d, result.shape)
rectangles = []
for i in range(0, len(idx_2d[0]), 1):
y = int(idx_2d[0][i])
x = int(idx_2d[1][i])
rect = [x, y, needle_w, needle_h]
# Add every box to the list twice in order to retain single (non-overlapping) boxes
rectangles.append(rect)
rectangles.append(rect)
for loc in locations:
rect = [int(loc[0]), int(loc[1]), needle_w, needle_h]
# Add every box to the list twice in order to retain single (non-overlapping) boxes
#rectangles.append(rect)
#rectangles.append(rect)
rectangles, weights = cv.groupRectangles(rectangles, groupThreshold=1, eps=0.5)
keep_rects = []
for rect in rectangles:
w = rect[0]
h = rect[1]
x = rect[2] + w
y = rect[3] + h
screenshot_pos = img_display[h:y, w:x] # (w, h, x+w, y+h)
result2 = cv.matchTemplate(screenshot_pos, templ, 5)
_minVal2, _maxVal2, minLoc2, maxLoc2 = cv.minMaxLoc(result2, None)
if _maxVal2 >= 0.5:
keep_rects.append(rect)
print("matching error")
res1 = draw_rectangles(img_display, keep_rects)
res2 = draw_rectangles(img, keep_rects)
cv.imshow(image_window, res1)
cv.imshow(result_window, res2)
if __name__ == "__main__":
main()

BIN
dig/digging2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
dig/digging3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 770 KiB

BIN
dig/digging4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
dig/down.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
dig/left.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
dig/right.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
dig/test1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
dig/up.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

View File

@@ -1,164 +0,0 @@
import random
from time import time
from window_capture import WindowCapture
from vision import Vision
import cv2 as cv
import pytesseract
from hsvfilter import HsvFilter
from config_file import UserConfigs
#import pyautogui
import pydirectinput
import keyboard
from tresh_util import super_tresh_main, super_tresh_needle
def run():
# initialize the user-class
config = UserConfigs()
# initialize the StunWindowCapture class
try:
capture_window = WindowCapture(
None, "dig", config)
video_mode = False
except:
# StunWindowCapture.list_window_names()
#print("Game not running, switching to video mode")
#capture_window = cv.VideoCapture("snip_slam.mp4")
video_mode = True
# initialize the StunVision class
vision_stun = Vision()
# initialize the StunOverlay class
hsv_filter = HsvFilter(0, 0, 124, 15, 255, 168, 0, 255, 0, 0)
loop_time = time()
event_time = 0.0
pointstore = []
max_results = 0
pause = True
while True:
if keyboard.is_pressed('p') == True:
pause = True
print('q pressed')
elif keyboard.is_pressed('o') == True:
pause = False
print('o pressed')
if pause:
#cv.waitKey(500)
print("pausing")
continue
if video_mode:
break
else:
try:
# get an updated image of the game
screenshot = capture_window.get_screenshot()
# screenshot = cv.imread("buffbar.jpg")
except:
capture_window.release()
print("Game window not available - shutting down application")
break
#cv.imshow("screenshot", screenshot)
#cv.waitKey(150)
#continue
needles = []
#needles.append(cv.imread("wtf.jpg", cv.IMREAD_UNCHANGED))
needles.append(cv.imread("dig/Brown0.jpg", cv.IMREAD_UNCHANGED))
needles.append(cv.imread("dig/1.jpg", cv.IMREAD_UNCHANGED))
needles.append(cv.imread("dig/2.jpg", cv.IMREAD_UNCHANGED))
needles.append(cv.imread("dig/3.jpg", cv.IMREAD_UNCHANGED))
needles.append(cv.imread("dig/4.jpg", cv.IMREAD_UNCHANGED))
#needles.append(cv.imread("H1.jpg", cv.IMREAD_UNCHANGED))
#needles.append(cv.imread("H2.jpg", cv.IMREAD_UNCHANGED))
#needles.append(cv.imread("H3.jpg", cv.IMREAD_UNCHANGED))
#needles.append(cv.imread("H4.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D1.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D2.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D3.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D3.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D4.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D5.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D6.jpg", cv.IMREAD_UNCHANGED))
# needles.append(cv.imread("D7.jpg", cv.IMREAD_UNCHANGED))
for needle in needles:
# do object detection
screenshot = capture_window.get_screenshot()
rectangles = vision_stun.find(screenshot, needle, 0.7, 1)
# draw the detection results onto the original image
if len(rectangles) == 0:
continue
#output_image = vision_stun.draw_rectangles(screenshot, rectangles)
#cv.imshow("output_image", output_image)
#cv.waitKey(150)
# only trigger ocr reading if a stun is detected
points = vision_stun.get_click_points(rectangles)
for point in points:
# 46 + 1 * 30 1410 == 1815 - 405 return [1410, 1128, 402, 22]
# 44 + 1 * 30 1350 == 1790 - 440
# left_border = 402, 432
# right_border = 1812, 1782
# upper_border = 22, 50
# lower_border = 1150, 1120
size = rectangles[0][2] + 1
left = int(round(rectangles[0][0] / size, 0)) # 4
down = int(round(rectangles[0][1] / size, 0)) # 23
offset_left = config.returnMagicWindowPos()[2]
offset_down = config.returnMagicWindowPos()[3]
# 167 1055 start
# 3x47 left 26x right to 30
# 1x down 22x up to 24
# start 167, end 167 - (47 * 3), step -47
start_left = point[0] - (size * left)
start_up = point[1] - (size * down)
for f in range(start_up, start_up + (size * 24), size):
for i in range(start_left, start_left + (size * 30), size):
pydirectinput.moveTo(i + offset_left, f + offset_down)
pydirectinput.mouseDown()
w = random.randint(1, 50)
cv.waitKey(850 + w)
pydirectinput.mouseUp()
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
screenshot = capture_window.get_screenshot()
rectangles = vision_stun.find(screenshot, cv.imread("dig/ok_button.jpg", cv.IMREAD_UNCHANGED), 0.8, 1)
# draw the detection results onto the original image
output_image = vision_stun.draw_rectangles(screenshot, rectangles)
if len(rectangles) == 1:
pointis = vision_stun.get_click_points(rectangles)
for pointi in pointis:
pydirectinput.moveTo(pointi[0] + offset_left, pointi[1] + offset_down)
pydirectinput.mouseDown()
w = random.randint(1, 100)
cv.waitKey(150 + w)
pydirectinput.mouseUp()
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
if keyboard.is_pressed('p') == True or pause == True:
pause = True
break
# debug the loop rate
print('FPS {}'.format(1 / (time() - loop_time)))
loop_time = time()
cv.waitKey(150)
if __name__ == "__main__":
run()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
equip/amus/amu_1_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
equip/amus/amu_1_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

BIN
equip/amus/amu_2_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
equip/amus/amu_2_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 B

BIN
equip/amus/amu_3_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
equip/amus/amu_3_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

BIN
equip/amus/amu_4_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
equip/amus/amu_4_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

BIN
equip/amus/amu_5_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
equip/amus/amu_5_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
equip/amus/amu_6_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
equip/amus/amu_7_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

BIN
equip/bags/bag_1_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
equip/bags/bag_1_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

BIN
equip/bags/bag_2_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
equip/bags/bag_2_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

BIN
equip/bags/bag_3_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
equip/bags/bag_3_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

BIN
equip/bags/bag_4_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
equip/bags/bag_4_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

BIN
equip/bags/bag_5_32.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
equip/bags/bag_5_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Some files were not shown because too many files have changed in this diff Show More