From 7610163b13695c84d649590bef539b1c4555a0a7 Mon Sep 17 00:00:00 2001 From: davpapp Date: Thu, 1 Feb 2018 22:39:57 -0500 Subject: [PATCH] Creating Item and Items classes --- bin/Inventory.class | Bin 1657 -> 1611 bytes bin/InventorySlot.class | Bin 2584 -> 3076 bytes bin/InventorySlotTest.class | Bin 0 -> 1117 bytes bin/Item.class | Bin 237 -> 2590 bytes bin/Items.class | Bin 0 -> 2324 bytes bin/main.class | Bin 715 -> 676 bytes src/Inventory.java | 7 +--- src/InventorySlot.java | 78 +++++++++++++++++++++++++++--------- src/InventorySlotTest.java | 29 ++++++++++++++ src/Item.java | 62 ++++++++++++++++++++++++++++ src/Items.java | 56 ++++++++++++++++++++++++++ src/main.java | 6 ++- 12 files changed, 211 insertions(+), 27 deletions(-) create mode 100644 bin/InventorySlotTest.class create mode 100644 bin/Items.class create mode 100644 src/InventorySlotTest.java create mode 100644 src/Items.java diff --git a/bin/Inventory.class b/bin/Inventory.class index bbcd7c748e79548bc68d92db65178b1701071e48..c5560f1dd901fc4033aca6987a1f553eadcd4684 100644 GIT binary patch delta 278 zcmXAkyGjFL5QV>g|6LQ;CFG*f#9bm9&1St}M7)4@-cTz`E5US<6@DN4FKZtBbSKsJ`F0t~a9a z^5*zFjN*I!mdRq0BgwGf2m$%HZH9#cLlj9fE}F}X@S@bKlw!|n4o>1QMTTCQ_h_`l17xc`OE4!bDvn`TXR4HAr%S(j9^Apg|35}!kOZ$AvXQ9dvL=Q^#0!{GUA#1kO)85Z0nI{)iYVCR4Ysqh zN*xdj3m-sVLGT4^ER~>+*qoU&bLPy|t*|dzjdtB@p4Xdg zzje8P;6C>1@eMXnSY%m|S&MK+Ojae;tchR* T(AUc}Qk1Y#C=Ip8-M;Iv;{dim;JUX@;%jmg zT{o(3UCx|T@pU;9tLsLs?#6K%(+ZwpGCQ$7gpi77@tnZEn(mg`Yu*NdVL#kQM zyowhvDsZ%=yHXer=;gd)H@vXPGjM(6(M~CWieopMOjq|6nQ?SY;+<1*9v1|9J#n@Q zcJ2Sj_~l;Y@eKtp?zv^9%@zr(C}4qtu-m+FDW4k)agmq6-L2o4KX7rMD_tQ=iFSG%Br}OnED}ZkVRM&Rn!6n^rB36}%#4 z`*IxL!nYM%B@^j>Bj=Ss%1kOTUsR!CjiE8hs=#Exmg|zl^w^^dCFNCBq2n4ANAWCO zm<{fCUKXmZ!oYP_vuSMTW^2XZRkXOLY@52HSruMcuNg4XzJ}&jxLUg?w+cMgse;Et zpvSapfr`SsveJE1#j9`_n2+pr!Io58;Df%$u8@d}n+n?W>E+ie#DeCM+&VT`b#0C9 zA;P_RnTFchl>a!vDiX+cTAT=7;bJi4f-n@k#)4IiR@2lr=j1jS%N2G91wRltvhxoCAAMF*P*KJk&1V1InP1($gOlXRf{48{9CyqDqN)LWP5);z?m5N{E zH%vbzqFXFs_F;nif}eoTv~=-1>Eicn5f20G-uOoqf5M+x3)l9eVzVE82uHuGGIPv{ zS9*54lHGPHx-2I9?4D~qDRYG(7F52aqIiOz7)J_6A@p$E+cl1Jb{|xJ1ATbRd$JSr z*~2saNb>stM=#Nv^tUgwjf0u=;5H6@z+s5)z+-YLi3qpGaS&;aj``a$h%a#@L5_H^ z(mF~j#6P~40{53mPx=_h+{dxibRtt9Obpi(nZ)omzWg^lwTl(!Ip7fg2D)$tIyeIz zoPhvGU<9K)HO6xh;$^&m8cd5s92w7igr`2jg#XC-j}!jm=`EaE$V_bG%q{^x*fcXd zh~o@yH`tL5i4n|TmQX_sbdHt`mOcFoB$m7tpg%Ldg|lyA--nn_E^gtXgbRDQ_2WIp zk_>rJkMjr*bfEe@0D)!igh&vT-TXl$ae(1U1zZY0cONUO$<=LKSz}QCZEyQkz#O;_!#S+7JcK&@kDpJuz=FZN)2K&XtyNE{a zhVOO=pYYT)Oa{kkjj+VyEY$?dlEq2Bdr#Az{E?zrIz zM!r{OU@|dD#@Jw9BS_JM6jqczMq$y4d8v33u^qz36bJ>U`B{+<;J=89Cqkd1_f!7h z2+4jLDDdxe8)Fbtne;a7#S9g02e~<%O+_bVLME&C(CT5p;k#ZAVt01_6WNXYh!?^0 zbn^o5(hOxbi(y7_oOTW`dQqP7K{`=RVUsf?#@`{gXodJ0$9M1=>GbjRcWFgf{G)iC zD^V{tD)2KLQ1Ax-MN(?(d-#43hR!`wAXzHuKHgj%4^Q61?QQ%l`SUIOay&A*h2Q#S zRGM4(L!dVQCi`kzWQmGhYRh)$X7LviVgr}2iU9IeLdu(zQ$C5WhSUAndA+zANhf-4 x`DQeoNCajqofz=Vg^Blhq#JaJ`Y3sze(T6}Ky#o136|x42_K^USMT)O{{z@>il+bo literal 2584 zcmah~`*Raj6#j0LHfdO-q_j|)V37h%3Pk0hHi-5GU9D|xYimKpZE~9|B)f65X$$y% zD?a}Y#~F2?Wn{)5>~H>2jNjeerVT}$Om^?N_ny~xzH|1U2Y>zr;4FTQph;l2ZY@j8 zwVfL?CEJZ4EYNn%ST-^x!zyGZ7q7{jE3ikOm>Zp#ot$2{I)eLRKGMftM(rVbX9YXlvcH9yOTAyQgcU4hqmchAU?k3a>jK`tB@6F zH(goQt%mpnTE=y5^Ej@w8DmM#+QUZ0tvOO)pKr)maWm7K$GqEe-n2~jfhP~(%2=%4rVh}i>p$l<=gi zue)|7GhMS}HD^@hpgv{hs+or1tC?1MNNU&xjgXF;mYk@S7o{_6ES4C2eB90%r8&bf zl^kq_-J)4lw;N0`r;uZ>FteOps+Fw>j#A$Pu_5;udU0H(*e4KS?kal~L|VfhvWCl4%N(3UOG{{#BxqK@?_4jD;1gV@lx+G zt3CEoPnFaeh~Yd275+o?5ai@FR={#ax)EHAV3d@rm(MfP2(5-oVAn+paFd6ws{Id&PFjI&~&0lX-+B4*9A^KDzN{wpaP!JFss68WjH=# zl)X6(^LUd%y0)Jl`>}6lDA^b;M3UY{r|sv2C>1a=XNnc8B&{$9V?9^V5|u!BPts}KQ)pti~0i)M+l zN#K@-_wfM_XxZzF38TzZI@Ju@Q68eYioqB@#-|Z{LM)WE)r=R8>Il`J`lN=>@VQDz zwVuG>jy9Vng|_;6rx$;R233&R)MZZ0fcy=OJjm`*mHSH7=xc#v+bQOMRI-oAA&PI+ z9IAgPqWF%Lxf;a}9NDJ`6i;XDnv;{tJttm+(^D#C942z=lhcfY{I^hwP-;Sya_crZ z#$66#K7rkM!h3Tj^4(0Gy@>PKPU#A*DSLa<>)4m>POM{pI)3mj62Eh^35WQMBOE;2 z5yL(j>A;iR>G2i$K1_)w@RS#TS{>o4i9ddA0!OzPXftmm+tL@>de4Q^_tCr1oh&9g z!o_4qcpb;?BK5G-19Z_v#cm|{Q%=wLM(R$Jb*IU|X^2Sl(|w3~ojAc&m?50RsUVQE zw9>@C*m9;|1WhUjo&I6nfj|aN^IYH=Jj=7wyrT@BQSgaWkk!T?ICmfC7vdMz@pAtf zhS#9SUt7Z@*VA0D;f*yc1eX%`@D8te=gEf;<9QyX?;v#tOPfY~(QFh;jiOyQ)E{UE zTK=o#zj(_T2zQ0!%lEOmkWM7madRCX-or=pTW}mCW+0kJITD8Wyp3b{702;6`nJ_z zqYlwV01>d^RYRe>;Z-9k6!nVqHpM#>j}smkN<@h*-DE>oyk& jwfLS3g7+IQ`)u@U)xV8_sd^x(IvG*{83caxG=KURyO&~B diff --git a/bin/InventorySlotTest.class b/bin/InventorySlotTest.class new file mode 100644 index 0000000000000000000000000000000000000000..a355f15507881689c9a141ea9bba903ffa0072f3 GIT binary patch literal 1117 zcmaJ=YflqF6g@)=3+qy#mGTsd&$eI(-;bgRzLHI<7$HsIiy7LX47R(Q-6^8~%0z)k z;t%jg8SiY1&_w;v*_nIio^$S<)1SY-{{V0gPb~B?jJe*v^t2y-T5tM#Lq^&{l3{dD z>D}GHht0Gk9+zlr6u8J5kz4%5NaoC1JiKhB2Eu=|Rj|dxMxMff<#TuKPljRYUE9;DC95h@q;1vnd@bT4 zhS`cAHuzqfq|h2DEkiB>#bb>&G0r;}#h`@+2Imz0m1@dCTwy5lUB4xHJrF^_U&!c# z_5)6AGOCF{uDWkkEsCKc9@RoAy=d3h%kP&CSxJH3y4WqFIDe)EP=$49XjQW& z&roba1JZ<&Ifs<`gEUD<2~5$QB;ibBmUf2u5`7JRi?T-UeDM%-C&+E4FCXD*W$_p{ zUKhV2yL5<~$GCMym?c5L1i?)b$rRB}V-7Phd9DN1B~OtB9^fI7WvIbNcuZ2s(^TDu FmEY?S{WJgo literal 0 HcmV?d00001 diff --git a/bin/Item.class b/bin/Item.class index 45f6372f4ecf4aee16db0087c5558676f2072a4f..7432017200ced071822d3baaed8bfc1c7b274de6 100644 GIT binary patch literal 2590 zcma)7-%}G;7(I8hVIeLUh!HWAf?6dBA;k(>v8W(wT7IY?7Ok~QvLuU1Hg1AiANu4! z;hW5K#up#jnU>hv>2s&Aed|Ba|Dn@L&)r=@lsfGIyZ7$*-S3?9-E%L$zWVWJ0HdgB zPz2OW%`9n91;T5_eIs2o%K7yC%9@$23A9-ZW=clh6zH3AiP^W(d}#Fqp@(+{&|rDoaXs)juR5f{R;)0z23gcPUj zoEbs@9Xd4Z6$lK*mqHNe)X{}jfxQygGK$tC(!lUbSu|FPq~A4TXN}^L z;aGC+e^hG)t4iiGvI&&XDfM2k9E!J{FRvK2f?T-M7hjA(t4y3TN~VUGfWA%pqE#eO zfp>KD;a!1!YqnLEWo}rtf(*(f0;m38gLVUla1aBs35Nut|58M@yc#m;O>Y=w+ zvZHd(GV?l)VUR6#Od}^S?AKsivKx@iaFB>;e8y}F!Gw`yx!{g04D^r`$loyoL?0<+AP!aJT#cM8n4dy>9p4!b8UlW+^dm)^1oi>2n^cj9g5MT#=zRhAx{{zQB9n z(0_=^NL3ju=vc&c_MS_xU78dK4rVg4s=y5$pJG`cRWTSbRT#+S6*s&k*nYD`&;0qlFR%m+ZJeo`g`jhEm3cCAPoj?YL~^K( z@VA^Qi169rg_y20y&e1bt>6C^#eUAX5ZySya&pwek-{I|n7e@TB%(5_`y~!8yFk5l z^v@+yFL3yK#NPxB6TFiUT`p+CTZ(Pa?gnVL586RpNeq#kBJV{KYE~C{iPUoP1=4kl z4sBv=6Q{o+7f)r2%RbtqF46#sG=L&LkiZ1a`sJ^)g2FoCM6!-^PtYdcQ_lm>`7O}Y z!5;SGAO-ch82i074U8}@a*G5mxvNA6!#ub?#BCp>5 zoTCI=ndEGU&je2L+Z1nmY0e4P>(dR2(>_Iz;!WIgdpU*AI0}&H1a5Pr(zrwToTH$- z1z`mL=6`(g7lNW!`IAva-YdSqAGlJUr;$XgjyrP+n)uFX)m7P(iUx;!C~`RW0@>ED z5ez(cwY6+){m~?*j|UMr!7`&fQ)BeWN&ZJYg`*s&G2SF(q#QvBRv!Db_ETs%5bMO&SM$qiEZq9Y z8wO+Hus>{xg%5bc*`b|76Jj~gIw_oU347NBtg<3HaC#u0kc_wG%t|H K$iN4d;RgU2hY$Y% diff --git a/bin/Items.class b/bin/Items.class new file mode 100644 index 0000000000000000000000000000000000000000..d87b8c79280eac3088134f794855d8a734d8b3a7 GIT binary patch literal 2324 zcmah~Yf~F#6n@?$5C{u|yIf1HEx7<|FV>b&Y$?UYa5_dJ(#-Zy{$`{yeF@8RnxLJAF8*DN|w zL=@t?#y5suFzju8d2`pyxr|y8Rp?sqVpZ2F=noBNXVEBU6q;A9ZQF3G6;olNK4aQn z@(QlH70cevEC^a=hI<>QE!%Qu6vBz*nnLWs^PE|Bt&&YHtpxP&tdgExK8`3v?w7XA z7{Z8aXhy6FoeC*^r&Kict+G)r>vN{F=a$O)A9|B#>kaEJxnF7HmjrTEjRdNSokGMv;;3M6%uo z;i+qQ7gt%gTy=$5*5*hkjGaTOzJM6nVb#i6G29)o(qmaWFbYkQ=<{sz<45WgT31~o zw?|~p_9$+h8e)IuqL^aa&M{_MW~f(m&uI7ncR9}mIxbLbT}L8$W)I;`agO3XCsM@6 zFpCFL?W$Pwp@xUZa)jxkM8!$zpReJ{IS!rc@gN>)SimCNLyr}1)o%39XQsxlV5PQH zu*4=ES?D)4BCl+}e;5OYB^1N^Sk>?ZpKt~&d&_*joTtP@Hkp;sQw^VDoi;huO~*UW z3cZPJwiYuu=Pa71k3ODeIa%9r4LfH_z3YJx<6Bp^ipI97&sOt!vtn*#<*im!P%X*n z9K;tIzQk7wExD5I8kX%mGS42=BNLdfu&E)3Eq|J&4+;ad79Q31U62;$HEe@p7#DvQ z4L7%AIvyn+%m3k=+@LM8Eyy47JM$)qBB!9C2%FvIm?)eYiz6BJ?d3(eTB=rZraw$E z(dA6asli1`4)bDH{O4uD?xFXptsROj9Iy(-~^_#b) zkDqN`u^7`^xK+bjT+{q?^kcxw<3(Cm^cU`HWOOQZh{5#(4F7?VRQdp;>r)M{Zbrg0 zKVz`JVffnO_&(lw0WFp00|`w27*@kQk)K}wBOJmI4g+4Lb~1=#6df2tCvTlNZu1Hk zKBFGTselhLaShkWag;eX_zM@pO=k5W{F;6@(uOFfSn=~V&>do!S1r@Uixrj<_u39| zd7X4K!tc(nTnTwp#61wSnP4Z-ZO71U0dzCHzvn@RG1>1 zEv5K5KNU&+j*?uGyW literal 0 HcmV?d00001 diff --git a/bin/main.class b/bin/main.class index 32d83809cf00718eaf40de49800663357f2ce37a..2ecbb460b49de23e54545e975bc32786d55e2bc6 100644 GIT binary patch delta 227 zcmX@jx`dVM)W2Q(7#J8#8FVLd{nBRjEJ@8R=3)?I;N)bGVvu2HkY;2M$Vx0r)Xz!G zOV0U-l};BE%7$n6XgKARXMh2*y} zC~gD_GBI!gNj?Tx delta 266 zcmZ3&dYYB%)W2Q(7#J8#84MW(Sr3ER8 zC8?YYvJCR<404PN0$GV=iTXK-dFlGWmBl5gxjYOC42qNW85Q)E85uZ&OOumRi;ESx z7*rY5*%{Or8HB+aGV}EViZb&`f=h~06M=d(7&Ir>F*=HKX2PsyWZ?FJyJPY>#=3-1 z1|}e6U=ZESAQriuLBdCS8-wH~1{ooxZ44?Kff7s%TtHHYfdxqNFmN#N0!e-b5ugY+ dP(%!(nL&#|8^{C6>M-asFan_-kk7=R4**tEH9i0U diff --git a/src/Inventory.java b/src/Inventory.java index 4e063df..5a92901 100644 --- a/src/Inventory.java +++ b/src/Inventory.java @@ -6,10 +6,6 @@ import java.io.IOException; public class Inventory { - /*x0 = 655; - x1 = 697; - x2 = 738; - x3 = 781;*/ public static final int INVENTORY_OFFSET_WIDTH = 655; //top left corner of inventory, fromm top left corner of screen public static final int INVENTORY_OFFSET_HEIGHT = 290; public static final int INVENTORY_WIDTH = 820 - 649;// 820 @@ -29,7 +25,6 @@ public class Inventory { inventorySlots = new InventorySlot[4][7]; for (int row = 0; row < 4; row++) { for (int column = 0; column < 7; column++) { - // might need to manually create these inventorySlots[row][column] = new InventorySlot(row, column); } } @@ -43,7 +38,7 @@ public class Inventory { private void updateAllInventorySlots(BufferedImage image) throws IOException { for (int row = 0; row < 4; row++) { for (int column = 0; column < 7; column++) { - inventorySlots[row][column].writeInventorySlotToImage(image, row, column); + inventorySlots[row][column].updateInventorySlot(image); } } } diff --git a/src/InventorySlot.java b/src/InventorySlot.java index f1789f5..8e56fa9 100644 --- a/src/InventorySlot.java +++ b/src/InventorySlot.java @@ -8,8 +8,8 @@ import javax.imageio.ImageIO; public class InventorySlot { - private static final int INVENTORY_WIDTH = 171; - private static final int INVENTORY_HEIGHT = 254; + private static final int INVENTORY_SLOT_WIDTH = 171 / 4; + private static final int INVENTORY_SLOT_HEIGHT = 254 / 7; String screenshotOutputDirectory; Item itemInInventorySlot; @@ -17,29 +17,69 @@ public class InventorySlot { public InventorySlot(int row, int column) { initializeRectangleToCapture(row, column); - this.screenshotOutputDirectory = "/home/dpapp/Desktop/RunescapeAIPics/InventorySlots/"; } private void initializeRectangleToCapture(int row, int column) { - int slotWidth = INVENTORY_WIDTH / 4; - int slotHeight = INVENTORY_HEIGHT / 7; - //System.out.println("SlotWidth: " + slotWidth + ", slotHeight: " + slotHeight); - rectangleToCapture = new Rectangle(row * slotWidth, column * slotHeight, slotWidth, slotHeight); + rectangleToCapture = new Rectangle(row * INVENTORY_SLOT_WIDTH, column * INVENTORY_SLOT_HEIGHT, INVENTORY_SLOT_WIDTH, INVENTORY_SLOT_HEIGHT); } - public void updateInventorySlot(BufferedImage image) { - //BufferedImage croppedInventorySlotArea = image.getSubimage(rectangleToCapture.x, rectangleToCapture.y, rectangleToCapture.width, rectangleToCapture.height); - } - - public void writeInventorySlotToImage(BufferedImage image, int row, int column) throws IOException { - System.out.println("Pre-cropped image is of size:" + image.getWidth() + ", " + image.getHeight()); - System.out.println(row + ", " + column); - System.out.println("Getting image from: " + rectangleToCapture.x + ", " + rectangleToCapture.y + ", " + rectangleToCapture.width + ", " + rectangleToCapture.height); + public void updateInventorySlot(BufferedImage image) throws IOException { BufferedImage croppedInventorySlotArea = image.getSubimage(rectangleToCapture.x, rectangleToCapture.y, rectangleToCapture.width, rectangleToCapture.height); - ImageIO.write(croppedInventorySlotArea, "png", new File(getImageName(row, column))); + setItemInInventorySlotFromImage(croppedInventorySlotArea); } - - private String getImageName(int row, int column) { - return this.screenshotOutputDirectory + "screenshot" + row + "_" + column + ".png"; + + private void setItemInInventorySlotFromImage(BufferedImage croppedInventorySlotArea) throws IOException { + if (itemIsLog(croppedInventorySlotArea)) System.out.println("LOG!"); } + + public boolean itemIsLog(BufferedImage croppedInventorySlotArea) throws IOException { + int matchingPixel = 0; + //int nonMatchingPixel = 0; + File image = new File("/home/dpapp/Desktop/RunescapeAIPics/Items/willowLogs.png"); + BufferedImage logImage = ImageIO.read(image); + /*System.out.println(logImage.getWidth() + ", " + logImage.getHeight()); + System.out.println(INVENTORY_SLOT_WIDTH + ", " + INVENTORY_SLOT_HEIGHT); + System.out.println("Dimension match?");*/ + for (int row = 0; row < INVENTORY_SLOT_WIDTH; row++) { + for (int col = 0; col < INVENTORY_SLOT_HEIGHT; col++) { + if (pixelsWithinRGBTolerance(croppedInventorySlotArea.getRGB(row, col), logImage.getRGB(row, col))) { + matchingPixel++; + } + /*else { + nonMatchingPixel++; + }*/ + } + } + + if (matchingPixel > 300) { + //System.out.println("Found log with " + matchingPixel + " matches!" + nonMatchingPixel); + return true; + } + //System.out.println("No match!" + matchingPixel + ", nonmatching: " + nonMatchingPixel); + return false; + } + + private boolean pixelsWithinRGBTolerance(int rgb1, int rgb2) { + int[] colors1 = getRGBValuesFromPixel(rgb1); + int[] colors2 = getRGBValuesFromPixel(rgb2); + for (int i = 0; i < 3; i++) { + if (Math.abs(colors1[i] - colors2[i]) > 5) { + return false; + } + } + /*displayColor(colors1); + System.out.println("vs"); + displayColor(colors2); + System.out.println();*/ + return true; + } + + private void displayColor(int[] colors) { + System.out.println(colors[0] + "," + colors[1] + "," + colors[2]); + } + + private int[] getRGBValuesFromPixel(int pixel) { + int[] colors = {(pixel)&0xFF, (pixel>>8)&0xFF, (pixel>>16)&0xFF, (pixel>>24)&0xFF}; + return colors; + } } diff --git a/src/InventorySlotTest.java b/src/InventorySlotTest.java new file mode 100644 index 0000000..f749035 --- /dev/null +++ b/src/InventorySlotTest.java @@ -0,0 +1,29 @@ +import static org.junit.jupiter.api.Assertions.*; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +import org.junit.Before; +import org.junit.jupiter.api.Test; + +class InventorySlotTest { + + + InventorySlot inventorySlot; + + void initialize() { + inventorySlot = new InventorySlot(0, 0); + } + + @Test + void test() throws IOException { + initialize(); + File image = new File("/home/dpapp/Desktop/RunescapeAIPics/Tests/screenshot0_0.png"); + BufferedImage testImage = ImageIO.read(image); + assertTrue(inventorySlot.itemIsLog(testImage)); + } + +} diff --git a/src/Item.java b/src/Item.java index 22a7e83..b8b9533 100644 --- a/src/Item.java +++ b/src/Item.java @@ -1,4 +1,66 @@ +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; public class Item { + + private BufferedImage itemImage; + + public Item(String itemDirectoryPath, String itemName) throws IOException { + initializeImage(itemDirectoryPath, itemName); + } + + private void initializeImage(String itemDirectoryPath, String itemName) throws IOException { + File itemImageFile = new File(joinPathWithFileName(itemDirectoryPath, itemName)); + this.itemImage = ImageIO.read(itemImageFile); + } + + private String joinPathWithFileName(String itemDirectoryPath, String itemName) { + return (itemDirectoryPath + itemName); + } + public boolean itemMatchesImage(BufferedImage itemImageToCompare) { + if (imagesAreTheSameSize(itemImageToCompare)) { + return imagesMatch(itemImageToCompare); + } + return false; + } + + private boolean imagesAreTheSameSize(BufferedImage itemImageToCompare) { + return (itemImage.getWidth() == itemImageToCompare.getWidth()) && (itemImage.getHeight() == itemImageToCompare.getHeight()); + } + + private boolean imagesMatch(BufferedImage itemImageToCompare) { + return false; + } + + private boolean imagesMatch(BufferedImage itemImageToCompare, int pixelTolerance) { + int matchingPixel = 0; + for (int row = 0; row < itemImageToCompare.getWidth(); row++) { + for (int col = 0; col < itemImageToCompare.getHeight(); col++) { + if (pixelsAreWithinRGBTolerance(itemImage.getRGB(row, col), itemImageToCompare.getRGB(row, col))) { + matchingPixel++; + } + } + } + return true; + } + + private boolean pixelsAreWithinRGBTolerance(int rgb1, int rgb2) { + int[] colors1 = getRGBValuesFromPixel(rgb1); + int[] colors2 = getRGBValuesFromPixel(rgb2); + for (int i = 0; i < 3; i++) { + if (Math.abs(colors1[i] - colors2[i]) > 5) { + return false; + } + } + return true; + } + + private int[] getRGBValuesFromPixel(int pixel) { + int[] colors = {(pixel)&0xFF, (pixel>>8)&0xFF, (pixel>>16)&0xFF, (pixel>>24)&0xFF}; + return colors; + } } diff --git a/src/Items.java b/src/Items.java new file mode 100644 index 0000000..7ac0f99 --- /dev/null +++ b/src/Items.java @@ -0,0 +1,56 @@ +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; + +public class Items { + // TODO: write tests + HashMap items; + + public Items() throws IOException { + initializeItemsFromDirectory("/home/dpapp/Desktop/RunescapeAIPics/Items/"); + } + + private void initializeItemsFromDirectory(String itemDirectoryPath) throws IOException { + this.items = new HashMap(); + for (File itemFile : getListOfFilesFromItemDirectory(itemDirectoryPath)) { + if (itemFile.isFile()) { + putItemInMap(itemDirectoryPath, itemFile.getName()); + } + } + } + + private File[] getListOfFilesFromItemDirectory(String itemDirectoryPath) { + File itemDirectory = new File(itemDirectoryPath); + return itemDirectory.listFiles(); + } + + private void putItemInMap(String itemDirectoryPath, String itemFileName) throws IOException { + Item item = new Item(itemDirectoryPath, itemFileName); + String itemName = getItemNameFromFile(itemFileName); + this.items.put(itemName, item); + } + + private String getItemNameFromFile(String fileName) { + return fileName.substring(0, fileName.indexOf('.')); + } + + public boolean isInstanceOf(BufferedImage itemImage, String itemName) { + if (items.containsKey(itemName)) { + return getItem(itemName).itemMatchesImage(itemImage); + } + return false; + } + + private Item getItem(String itemName) { + return items.get(itemName); + } + + /*public void displayItems() { + for (HashMap.Entry entry : items.entrySet()) { + String itemName = entry.getKey(); + Item item = entry.getValue(); + System.out.println("Item name: " + itemName); + } + }*/ +} diff --git a/src/main.java b/src/main.java index 68e1016..22eef7e 100644 --- a/src/main.java +++ b/src/main.java @@ -9,8 +9,10 @@ public class main { public static void main(String[] args) throws AWTException, InterruptedException, IOException { //Cursor cursor = new Cursor(); - Inventory inventory = new Inventory(); - inventory.update(); + //Inventory inventory = new Inventory(); + //inventory.update(); + Items items = new Items(); + //items.displayItems(); System.out.println("Success!"); //cursor.moveCursorToCoordinates(new Point(620, 420));