diff --git a/.gitattributes b/.gitattributes index 1951068d42c..547fc79fa74 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,7 +12,6 @@ /pom.xml svneol=native#text/xml res/ai/Default.ai -text res/blockdata/blocks.txt svneol=native#text/plain -res/blockdata/boosters.txt -text res/blockdata/fantasyblocks.txt -text res/blockdata/fatpacks.txt -text res/blockdata/formats.txt -text diff --git a/res/blockdata/boosters.txt b/res/blockdata/boosters.txt index 446036a892f..70623dcb8af 100644 --- a/res/blockdata/boosters.txt +++ b/res/blockdata/boosters.txt @@ -1,79 +1,79 @@ -Set:10E|LandSet:10E|Commons:10|Uncommons:3|Rares:1 -Set:2ED|Commons:11|Uncommons:3|Rares:1 -Set:3ED|Commons:11|Uncommons:3|Rares:1 -Set:4ED|Commons:11|Uncommons:3|Rares:1 -Set:5DN|Commons:11|Uncommons:3|Rares:1 -Set:5ED|Commons:11|Uncommons:3|Rares:1 -Set:6ED|Commons:11|Uncommons:3|Rares:1 -Set:7ED|Commons:10|Uncommons:3|Rares:1 -Set:8ED|Commons:10|Uncommons:3|Rares:1 -Set:9ED|Commons:10|Uncommons:3|Rares:1 -Set:ALA|Commons:10|Uncommons:3|Rares:1 -Set:ALL|Commons:8|Uncommons:3|Rares:1 -Set:APC|Commons:11|Uncommons:3|Rares:1 -Set:ARB|LandSet:ALA|Commons:10|Uncommons:3|Rares:1 -Set:ARN|Commons:6|Uncommons:2 -Set:ATQ|Commons:5|Uncommons:2|Rares:1 -Set:AVR|Commons:10|Uncommons:3|Rares:1 -Set:BOK|Commons:11|Uncommons:3|Rares:1 -Set:CFX|LandSet:ALA|Commons:10|Uncommons:3|Rares:1 -Set:CHK|Commons:11|Uncommons:3|Rares:1 -Set:CHR|Commons:9|Uncommons:3 -Set:CSP|Commons:11|Uncommons:3|Rares:1 -Set:DIS|Commons:11|Uncommons:3|Rares:1 -Set:DRK|Commons:6|Rares:2 -Set:DST|Commons:11|Uncommons:3|Rares:1 -Set:EVE|Commons:11|Uncommons:3|Rares:1 -Set:EXO|Commons:11|Uncommons:3|Rares:1 -Set:FEM|Commons:5|Uncommons:2|Rares:1 -Set:FUT|Commons:11|Uncommons:3|Rares:1 -Set:GPT|Commons:11|Uncommons:3|Rares:1 -Set:GTC|Commons:10|Uncommons:3|Rares:1 -Set:HML|Commons:6|Uncommons:2 -Set:ICE|Commons:11|Uncommons:3|Rares:1 -Set:INV|Commons:11|Uncommons:3|Rares:1 -Set:JUD|Commons:11|Uncommons:3|Rares:1 -Set:LEA|Commons:11|Uncommons:3|Rares:1 -Set:LEB|Commons:11|Uncommons:3|Rares:1 -Set:LEG|Commons:11|Uncommons:3|Rares:1 -Set:LGN|Commons:11|Uncommons:3|Rares:1 -Set:LRW|Commons:11|Uncommons:3|Rares:1 -Set:M10|Commons:10|Uncommons:3|Rares:1 -Set:M11|Commons:10|Uncommons:3|Rares:1 -Set:M12|Commons:10|Uncommons:3|Rares:1 -Set:M13|Commons:10|Uncommons:3|Rares:1 -Set:MBS|Commons:10|Uncommons:3|Rares:1 -Set:MIR|Commons:11|Uncommons:3|Rares:1 -Set:MMQ|Commons:11|Uncommons:3|Rares:1 -Set:MOR|Commons:11|Uncommons:3|Rares:1 -Set:MRD|Commons:11|Uncommons:3|Rares:1 -Set:NMS|Commons:11|Uncommons:3|Rares:1 -Set:NPH|Commons:10|Uncommons:3|Rares:1 -Set:ODY|Commons:11|Uncommons:3|Rares:1 -Set:ONS|Commons:11|Uncommons:3|Rares:1 -Set:PO2|Commons:11|Uncommons:3|Rares:1 -Set:PCY|Commons:11|Uncommons:3|Rares:1 -Set:PLC|Commons:11|Uncommons:3|Rares:1 -Set:PLS|Commons:11|Uncommons:3|Rares:1 -Set:POR|Commons:11|Uncommons:3|Rares:1 -Set:PTK|Commons:5|Uncommons:2|Rares:1 -Set:RAV|Commons:11|Uncommons:3|Rares:1 -Set:ROE|Commons:10|Uncommons:3|Rares:1 -Set:RTR|Commons:10|Uncommons:3|Rares:1 -Set:SCG|Commons:11|Uncommons:3|Rares:1 -Set:SHM|Commons:11|Uncommons:3|Rares:1 -Set:SOK|Commons:11|Uncommons:3|Rares:1 -Set:SOM|Commons:10|Uncommons:3|Rares:1 -Set:STH|Commons:11|Uncommons:3|Rares:1 -Set:TMP|Commons:11|Uncommons:3|Rares:1 -Set:TOR|Commons:11|Uncommons:3|Rares:1 -Set:TSP|Commons:10|Uncommons:3|Rares:1|Special:1 -Set:UDS|Commons:11|Uncommons:3|Rares:1 -Set:ULG|Commons:11|Uncommons:3|Rares:1 -Set:USG|Commons:11|Uncommons:3|Rares:1 -Set:VIS|Commons:11|Uncommons:3|Rares:1 -Set:WTH|Commons:11|Uncommons:3|Rares:1 -Set:WWK|LandSet:ZEN|Commons:10|Uncommons:3|Rares:1 -Set:ZEN|Commons:10|Uncommons:3|Rares:1 -Set:ISD|Commons:9|Uncommons:3|DoubleFaced:1|Rares:1 -Set:DKA|LandSet:ISD|Commons:9|Uncommons:3|DoubleFaced:1|Rares:1 \ No newline at end of file +Set:10E|LandSet:10E|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:2ED|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:3ED|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:4ED|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:5DN|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:5ED|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:6ED|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:7ED|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:8ED|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:9ED|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:ALA|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:ALL|Commons:8|Uncommons:3|Rares:1|Images:1 +Set:APC|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:ARB|LandSet:ALA|Commons:10|Uncommons:3|Rares:1|Images:3 +Set:ARN|Commons:6|Uncommons:2|Images:1 +Set:ATQ|Commons:5|Uncommons:2|Rares:1|Images:1 +Set:AVR|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:BOK|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:CFX|LandSet:ALA|Commons:10|Uncommons:3|Rares:1|Images:3 +Set:CHK|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:CHR|Commons:9|Uncommons:3|Images:1 +Set:CSP|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:DIS|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:DKA|LandSet:ISD|Commons:9|Uncommons:3|DoubleFaced:1|Rares:1|Images:3 +Set:DRK|Commons:6|Rares:2|Images:1 +Set:DST|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:EVE|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:EXO|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:FEM|Commons:5|Uncommons:2|Rares:1|Images:1 +Set:FUT|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:GPT|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:GTC|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:HML|Commons:6|Uncommons:2|Images:1 +Set:ICE|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:INV|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:ISD|Commons:9|Uncommons:3|DoubleFaced:1|Rares:1|Images:5 +Set:JUD|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:LEA|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:LEB|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:LEG|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:LGN|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:LRW|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:M10|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:M11|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:M12|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:M13|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:MBS|Commons:10|Uncommons:3|Rares:1|Images:3 +Set:MIR|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:MMQ|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:MOR|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:MRD|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:NMS|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:NPH|Commons:10|Uncommons:3|Rares:1|Images:3 +Set:ODY|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:ONS|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:PCY|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:PLC|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:PLS|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:PO2|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:POR|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:PTK|Commons:5|Uncommons:2|Rares:1|Images:1 +Set:RAV|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:ROE|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:RTR|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:SCG|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:SHM|Commons:11|Uncommons:3|Rares:1|Images:5 +Set:SOK|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:SOM|Commons:10|Uncommons:3|Rares:1|Images:5 +Set:STH|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:TMP|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:TOR|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:TSP|Commons:10|Uncommons:3|Rares:1|Special:1|Images:5 +Set:UDS|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:ULG|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:USG|Commons:11|Uncommons:3|Rares:1|Images:3 +Set:VIS|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:WTH|Commons:11|Uncommons:3|Rares:1|Images:1 +Set:WWK|LandSet:ZEN|Commons:10|Uncommons:3|Rares:1|Images:3 +Set:ZEN|Commons:10|Uncommons:3|Rares:1|Images:5 diff --git a/res/lists/booster-images.txt b/res/lists/booster-images.txt index a408c188996..91e2da9b8de 100644 --- a/res/lists/booster-images.txt +++ b/res/lists/booster-images.txt @@ -1,80 +1,240 @@ -http://www.cardforge.org/fpics/products/boosters/10E.png +http://www.cardforge.org/fpics/products/boosters/10E_1.png +http://www.cardforge.org/fpics/products/boosters/10E_2.png +http://www.cardforge.org/fpics/products/boosters/10E_3.png +http://www.cardforge.org/fpics/products/boosters/10E_4.png +http://www.cardforge.org/fpics/products/boosters/10E_5.png http://www.cardforge.org/fpics/products/boosters/2ED.png http://www.cardforge.org/fpics/products/boosters/3ED.png -http://www.cardforge.org/fpics/products/boosters/4ED.png -http://www.cardforge.org/fpics/products/boosters/5DN.png -http://www.cardforge.org/fpics/products/boosters/5ED.png +http://www.cardforge.org/fpics/products/boosters/4ED_1.png +http://www.cardforge.org/fpics/products/boosters/4ED_2.png +http://www.cardforge.org/fpics/products/boosters/4ED_3.png +http://www.cardforge.org/fpics/products/boosters/4ED_4.png +http://www.cardforge.org/fpics/products/boosters/4ED_5.png +http://www.cardforge.org/fpics/products/boosters/5DN_1.png +http://www.cardforge.org/fpics/products/boosters/5DN_2.png +http://www.cardforge.org/fpics/products/boosters/5DN_3.png +http://www.cardforge.org/fpics/products/boosters/5ED_1.png +http://www.cardforge.org/fpics/products/boosters/5ED_2.png +http://www.cardforge.org/fpics/products/boosters/5ED_3.png +http://www.cardforge.org/fpics/products/boosters/5ED_4.png +http://www.cardforge.org/fpics/products/boosters/5ED_5.png http://www.cardforge.org/fpics/products/boosters/6ED.png -http://www.cardforge.org/fpics/products/boosters/7ED.png -http://www.cardforge.org/fpics/products/boosters/8ED.png -http://www.cardforge.org/fpics/products/boosters/9ED.png -http://www.cardforge.org/fpics/products/boosters/ALA.png +http://www.cardforge.org/fpics/products/boosters/7ED_1.png +http://www.cardforge.org/fpics/products/boosters/7ED_2.png +http://www.cardforge.org/fpics/products/boosters/7ED_3.png +http://www.cardforge.org/fpics/products/boosters/7ED_4.png +http://www.cardforge.org/fpics/products/boosters/7ED_5.png +http://www.cardforge.org/fpics/products/boosters/8ED_1.png +http://www.cardforge.org/fpics/products/boosters/8ED_2.png +http://www.cardforge.org/fpics/products/boosters/8ED_3.png +http://www.cardforge.org/fpics/products/boosters/8ED_4.png +http://www.cardforge.org/fpics/products/boosters/8ED_5.png +http://www.cardforge.org/fpics/products/boosters/9ED_1.png +http://www.cardforge.org/fpics/products/boosters/9ED_2.png +http://www.cardforge.org/fpics/products/boosters/9ED_3.png +http://www.cardforge.org/fpics/products/boosters/9ED_4.png +http://www.cardforge.org/fpics/products/boosters/9ED_5.png +http://www.cardforge.org/fpics/products/boosters/ALA_1.png +http://www.cardforge.org/fpics/products/boosters/ALA_2.png +http://www.cardforge.org/fpics/products/boosters/ALA_3.png +http://www.cardforge.org/fpics/products/boosters/ALA_4.png +http://www.cardforge.org/fpics/products/boosters/ALA_5.png http://www.cardforge.org/fpics/products/boosters/ALL.png http://www.cardforge.org/fpics/products/boosters/APC.png -http://www.cardforge.org/fpics/products/boosters/ARB.png +http://www.cardforge.org/fpics/products/boosters/ARB_1.png +http://www.cardforge.org/fpics/products/boosters/ARB_2.png +http://www.cardforge.org/fpics/products/boosters/ARB_3.png http://www.cardforge.org/fpics/products/boosters/ARN.png http://www.cardforge.org/fpics/products/boosters/ATQ.png -http://www.cardforge.org/fpics/products/boosters/AVR.png -http://www.cardforge.org/fpics/products/boosters/BOK.png -http://www.cardforge.org/fpics/products/boosters/CFX.png -http://www.cardforge.org/fpics/products/boosters/CHK.png +http://www.cardforge.org/fpics/products/boosters/AVR_1.png +http://www.cardforge.org/fpics/products/boosters/AVR_2.png +http://www.cardforge.org/fpics/products/boosters/AVR_3.png +http://www.cardforge.org/fpics/products/boosters/AVR_4.png +http://www.cardforge.org/fpics/products/boosters/AVR_5.png +http://www.cardforge.org/fpics/products/boosters/BOK_1.png +http://www.cardforge.org/fpics/products/boosters/BOK_2.png +http://www.cardforge.org/fpics/products/boosters/BOK_3.png +http://www.cardforge.org/fpics/products/boosters/CFX_1.png +http://www.cardforge.org/fpics/products/boosters/CFX_2.png +http://www.cardforge.org/fpics/products/boosters/CFX_3.png +http://www.cardforge.org/fpics/products/boosters/CHK_1.png +http://www.cardforge.org/fpics/products/boosters/CHK_2.png +http://www.cardforge.org/fpics/products/boosters/CHK_3.png +http://www.cardforge.org/fpics/products/boosters/CHK_4.png +http://www.cardforge.org/fpics/products/boosters/CHK_5.png http://www.cardforge.org/fpics/products/boosters/CHR.png -http://www.cardforge.org/fpics/products/boosters/CSP.png -http://www.cardforge.org/fpics/products/boosters/DIS.png -http://www.cardforge.org/fpics/products/boosters/DKA.png +http://www.cardforge.org/fpics/products/boosters/CSP_1.png +http://www.cardforge.org/fpics/products/boosters/CSP_2.png +http://www.cardforge.org/fpics/products/boosters/CSP_3.png +http://www.cardforge.org/fpics/products/boosters/DIS_1.png +http://www.cardforge.org/fpics/products/boosters/DIS_2.png +http://www.cardforge.org/fpics/products/boosters/DIS_3.png +http://www.cardforge.org/fpics/products/boosters/DKA_1.png +http://www.cardforge.org/fpics/products/boosters/DKA_2.png +http://www.cardforge.org/fpics/products/boosters/DKA_3.png http://www.cardforge.org/fpics/products/boosters/DRK.png -http://www.cardforge.org/fpics/products/boosters/DST.png -http://www.cardforge.org/fpics/products/boosters/EVE.png +http://www.cardforge.org/fpics/products/boosters/DST_1.png +http://www.cardforge.org/fpics/products/boosters/DST_2.png +http://www.cardforge.org/fpics/products/boosters/DST_3.png +http://www.cardforge.org/fpics/products/boosters/EVE_1.png +http://www.cardforge.org/fpics/products/boosters/EVE_2.png +http://www.cardforge.org/fpics/products/boosters/EVE_3.png http://www.cardforge.org/fpics/products/boosters/EXO.png http://www.cardforge.org/fpics/products/boosters/FEM.png -http://www.cardforge.org/fpics/products/boosters/FUT.png -http://www.cardforge.org/fpics/products/boosters/GPT.png -http://www.cardforge.org/fpics/products/boosters/GTC.png +http://www.cardforge.org/fpics/products/boosters/FUT_1.png +http://www.cardforge.org/fpics/products/boosters/FUT_2.png +http://www.cardforge.org/fpics/products/boosters/FUT_3.png +http://www.cardforge.org/fpics/products/boosters/GPT_1.png +http://www.cardforge.org/fpics/products/boosters/GPT_2.png +http://www.cardforge.org/fpics/products/boosters/GPT_3.png +http://www.cardforge.org/fpics/products/boosters/GTC_1.png +http://www.cardforge.org/fpics/products/boosters/GTC_2.png +http://www.cardforge.org/fpics/products/boosters/GTC_3.png +http://www.cardforge.org/fpics/products/boosters/GTC_4.png +http://www.cardforge.org/fpics/products/boosters/GTC_5.png http://www.cardforge.org/fpics/products/boosters/HML.png -http://www.cardforge.org/fpics/products/boosters/ICE.png -http://www.cardforge.org/fpics/products/boosters/INV.png -http://www.cardforge.org/fpics/products/boosters/ISD.png +http://www.cardforge.org/fpics/products/boosters/ICE_1.png +http://www.cardforge.org/fpics/products/boosters/ICE_2.png +http://www.cardforge.org/fpics/products/boosters/ICE_3.png +http://www.cardforge.org/fpics/products/boosters/ICE_4.png +http://www.cardforge.org/fpics/products/boosters/ICE_5.png +http://www.cardforge.org/fpics/products/boosters/INV_1.png +http://www.cardforge.org/fpics/products/boosters/INV_2.png +http://www.cardforge.org/fpics/products/boosters/INV_3.png +http://www.cardforge.org/fpics/products/boosters/ISD_1.png +http://www.cardforge.org/fpics/products/boosters/ISD_2.png +http://www.cardforge.org/fpics/products/boosters/ISD_3.png +http://www.cardforge.org/fpics/products/boosters/ISD_4.png +http://www.cardforge.org/fpics/products/boosters/ISD_5.png http://www.cardforge.org/fpics/products/boosters/JUD.png http://www.cardforge.org/fpics/products/boosters/LEA.png http://www.cardforge.org/fpics/products/boosters/LEB.png http://www.cardforge.org/fpics/products/boosters/LEG.png -http://www.cardforge.org/fpics/products/boosters/LGN.png -http://www.cardforge.org/fpics/products/boosters/LRW.png -http://www.cardforge.org/fpics/products/boosters/M10.png -http://www.cardforge.org/fpics/products/boosters/M11.png -http://www.cardforge.org/fpics/products/boosters/M12.png -http://www.cardforge.org/fpics/products/boosters/M13.png -http://www.cardforge.org/fpics/products/boosters/MBS.png -http://www.cardforge.org/fpics/products/boosters/MIR.png -http://www.cardforge.org/fpics/products/boosters/MMQ.png -http://www.cardforge.org/fpics/products/boosters/MOR.png -http://www.cardforge.org/fpics/products/boosters/MRD.png +http://www.cardforge.org/fpics/products/boosters/LGN_1.png +http://www.cardforge.org/fpics/products/boosters/LGN_2.png +http://www.cardforge.org/fpics/products/boosters/LGN_3.png +http://www.cardforge.org/fpics/products/boosters/LRW_1.png +http://www.cardforge.org/fpics/products/boosters/LRW_2.png +http://www.cardforge.org/fpics/products/boosters/LRW_3.png +http://www.cardforge.org/fpics/products/boosters/LRW_4.png +http://www.cardforge.org/fpics/products/boosters/LRW_5.png +http://www.cardforge.org/fpics/products/boosters/M10_1.png +http://www.cardforge.org/fpics/products/boosters/M10_2.png +http://www.cardforge.org/fpics/products/boosters/M10_3.png +http://www.cardforge.org/fpics/products/boosters/M10_4.png +http://www.cardforge.org/fpics/products/boosters/M10_5.png +http://www.cardforge.org/fpics/products/boosters/M11_1.png +http://www.cardforge.org/fpics/products/boosters/M11_2.png +http://www.cardforge.org/fpics/products/boosters/M11_3.png +http://www.cardforge.org/fpics/products/boosters/M11_4.png +http://www.cardforge.org/fpics/products/boosters/M11_5.png +http://www.cardforge.org/fpics/products/boosters/M12_1.png +http://www.cardforge.org/fpics/products/boosters/M12_2.png +http://www.cardforge.org/fpics/products/boosters/M12_3.png +http://www.cardforge.org/fpics/products/boosters/M12_4.png +http://www.cardforge.org/fpics/products/boosters/M12_5.png +http://www.cardforge.org/fpics/products/boosters/M13_1.png +http://www.cardforge.org/fpics/products/boosters/M13_2.png +http://www.cardforge.org/fpics/products/boosters/M13_3.png +http://www.cardforge.org/fpics/products/boosters/M13_4.png +http://www.cardforge.org/fpics/products/boosters/M13_5.png +http://www.cardforge.org/fpics/products/boosters/MBS_1.png +http://www.cardforge.org/fpics/products/boosters/MBS_2.png +http://www.cardforge.org/fpics/products/boosters/MBS_3.png +http://www.cardforge.org/fpics/products/boosters/MIR_1.png +http://www.cardforge.org/fpics/products/boosters/MIR_2.png +http://www.cardforge.org/fpics/products/boosters/MIR_3.png +http://www.cardforge.org/fpics/products/boosters/MIR_4.png +http://www.cardforge.org/fpics/products/boosters/MIR_5.png +http://www.cardforge.org/fpics/products/boosters/MMQ_1.png +http://www.cardforge.org/fpics/products/boosters/MMQ_2.png +http://www.cardforge.org/fpics/products/boosters/MMQ_3.png +http://www.cardforge.org/fpics/products/boosters/MOR_1.png +http://www.cardforge.org/fpics/products/boosters/MOR_2.png +http://www.cardforge.org/fpics/products/boosters/MOR_3.png +http://www.cardforge.org/fpics/products/boosters/MRD_1.png +http://www.cardforge.org/fpics/products/boosters/MRD_2.png +http://www.cardforge.org/fpics/products/boosters/MRD_3.png +http://www.cardforge.org/fpics/products/boosters/MRD_4.png +http://www.cardforge.org/fpics/products/boosters/MRD_5.png http://www.cardforge.org/fpics/products/boosters/NMS.png -http://www.cardforge.org/fpics/products/boosters/NPH.png -http://www.cardforge.org/fpics/products/boosters/ODY.png -http://www.cardforge.org/fpics/products/boosters/ONS.png +http://www.cardforge.org/fpics/products/boosters/NPH_1.png +http://www.cardforge.org/fpics/products/boosters/NPH_2.png +http://www.cardforge.org/fpics/products/boosters/NPH_3.png +http://www.cardforge.org/fpics/products/boosters/ODY_1.png +http://www.cardforge.org/fpics/products/boosters/ODY_2.png +http://www.cardforge.org/fpics/products/boosters/ODY_3.png +http://www.cardforge.org/fpics/products/boosters/ONS_1.png +http://www.cardforge.org/fpics/products/boosters/ONS_2.png +http://www.cardforge.org/fpics/products/boosters/ONS_3.png +http://www.cardforge.org/fpics/products/boosters/ONS_4.png +http://www.cardforge.org/fpics/products/boosters/ONS_5.png http://www.cardforge.org/fpics/products/boosters/PCY.png -http://www.cardforge.org/fpics/products/boosters/PLC.png +http://www.cardforge.org/fpics/products/boosters/PLC_1.png +http://www.cardforge.org/fpics/products/boosters/PLC_2.png +http://www.cardforge.org/fpics/products/boosters/PLC_3.png http://www.cardforge.org/fpics/products/boosters/PLS.png http://www.cardforge.org/fpics/products/boosters/PO2.png -http://www.cardforge.org/fpics/products/boosters/POR.png +http://www.cardforge.org/fpics/products/boosters/POR_1.png +http://www.cardforge.org/fpics/products/boosters/POR_2.png +http://www.cardforge.org/fpics/products/boosters/POR_3.png +http://www.cardforge.org/fpics/products/boosters/POR_4.png +http://www.cardforge.org/fpics/products/boosters/POR_5.png http://www.cardforge.org/fpics/products/boosters/PTK.png -http://www.cardforge.org/fpics/products/boosters/RAV.png -http://www.cardforge.org/fpics/products/boosters/ROE.png -http://www.cardforge.org/fpics/products/boosters/RTR.png +http://www.cardforge.org/fpics/products/boosters/RAV_1.png +http://www.cardforge.org/fpics/products/boosters/RAV_2.png +http://www.cardforge.org/fpics/products/boosters/RAV_3.png +http://www.cardforge.org/fpics/products/boosters/RAV_4.png +http://www.cardforge.org/fpics/products/boosters/RAV_5.png +http://www.cardforge.org/fpics/products/boosters/ROE_1.png +http://www.cardforge.org/fpics/products/boosters/ROE_2.png +http://www.cardforge.org/fpics/products/boosters/ROE_3.png +http://www.cardforge.org/fpics/products/boosters/ROE_4.png +http://www.cardforge.org/fpics/products/boosters/ROE_5.png +http://www.cardforge.org/fpics/products/boosters/RTR_1.png +http://www.cardforge.org/fpics/products/boosters/RTR_2.png +http://www.cardforge.org/fpics/products/boosters/RTR_3.png +http://www.cardforge.org/fpics/products/boosters/RTR_4.png +http://www.cardforge.org/fpics/products/boosters/RTR_5.png http://www.cardforge.org/fpics/products/boosters/S99.png -http://www.cardforge.org/fpics/products/boosters/SCG.png -http://www.cardforge.org/fpics/products/boosters/SHM.png -http://www.cardforge.org/fpics/products/boosters/SOK.png -http://www.cardforge.org/fpics/products/boosters/SOM.png +http://www.cardforge.org/fpics/products/boosters/SCG_1.png +http://www.cardforge.org/fpics/products/boosters/SCG_2.png +http://www.cardforge.org/fpics/products/boosters/SCG_3.png +http://www.cardforge.org/fpics/products/boosters/SHM_1.png +http://www.cardforge.org/fpics/products/boosters/SHM_2.png +http://www.cardforge.org/fpics/products/boosters/SHM_3.png +http://www.cardforge.org/fpics/products/boosters/SHM_4.png +http://www.cardforge.org/fpics/products/boosters/SHM_5.png +http://www.cardforge.org/fpics/products/boosters/SOK_1.png +http://www.cardforge.org/fpics/products/boosters/SOK_2.png +http://www.cardforge.org/fpics/products/boosters/SOK_3.png +http://www.cardforge.org/fpics/products/boosters/SOM_1.png +http://www.cardforge.org/fpics/products/boosters/SOM_2.png +http://www.cardforge.org/fpics/products/boosters/SOM_3.png +http://www.cardforge.org/fpics/products/boosters/SOM_4.png +http://www.cardforge.org/fpics/products/boosters/SOM_5.png http://www.cardforge.org/fpics/products/boosters/STH.png -http://www.cardforge.org/fpics/products/boosters/TMP.png +http://www.cardforge.org/fpics/products/boosters/TMP_1.png +http://www.cardforge.org/fpics/products/boosters/TMP_2.png +http://www.cardforge.org/fpics/products/boosters/TMP_3.png http://www.cardforge.org/fpics/products/boosters/TOR.png -http://www.cardforge.org/fpics/products/boosters/TSP.png +http://www.cardforge.org/fpics/products/boosters/TSP_1.png +http://www.cardforge.org/fpics/products/boosters/TSP_2.png +http://www.cardforge.org/fpics/products/boosters/TSP_3.png +http://www.cardforge.org/fpics/products/boosters/TSP_4.png +http://www.cardforge.org/fpics/products/boosters/TSP_5.png http://www.cardforge.org/fpics/products/boosters/UDS.png http://www.cardforge.org/fpics/products/boosters/ULG.png -http://www.cardforge.org/fpics/products/boosters/USG.png +http://www.cardforge.org/fpics/products/boosters/USG_1.png +http://www.cardforge.org/fpics/products/boosters/USG_2.png +http://www.cardforge.org/fpics/products/boosters/USG_3.png http://www.cardforge.org/fpics/products/boosters/VIS.png http://www.cardforge.org/fpics/products/boosters/WTH.png -http://www.cardforge.org/fpics/products/boosters/WWK.png -http://www.cardforge.org/fpics/products/boosters/ZEN.png +http://www.cardforge.org/fpics/products/boosters/WWK_1.png +http://www.cardforge.org/fpics/products/boosters/WWK_2.png +http://www.cardforge.org/fpics/products/boosters/WWK_3.png +http://www.cardforge.org/fpics/products/boosters/ZEN_1.png +http://www.cardforge.org/fpics/products/boosters/ZEN_2.png +http://www.cardforge.org/fpics/products/boosters/ZEN_3.png +http://www.cardforge.org/fpics/products/boosters/ZEN_4.png +http://www.cardforge.org/fpics/products/boosters/ZEN_5.png diff --git a/src/main/java/forge/ImageCache.java b/src/main/java/forge/ImageCache.java index adee70608ba..a4b7b5435b6 100644 --- a/src/main/java/forge/ImageCache.java +++ b/src/main/java/forge/ImageCache.java @@ -18,8 +18,10 @@ package forge; import java.awt.image.BufferedImage; -import java.io.IOException; +import java.io.File; import java.io.InputStream; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.ExecutionException; import javax.imageio.ImageIO; @@ -70,22 +72,30 @@ public class ImageCache { public static final String PRECON_PREFIX = "p:"; public static final String TOURNAMENTPACK_PREFIX = "o:"; - static private final LoadingCache CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader()); - private static final BufferedImage emptyImage = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB); - private static BufferedImage defaultImage = emptyImage; - static { + private static final Set _missingIconKeys = new HashSet(); + private static final LoadingCache _CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader()); + private static final BufferedImage _defaultImage; + static { + BufferedImage defImage = null; try { ClassLoader cl = Thread.currentThread().getContextClassLoader(); InputStream isNoCardJpg = cl.getResourceAsStream("no_card.jpg"); - defaultImage = ImageIO.read(isNoCardJpg); - } catch (IOException e) { - // TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log. - e.printStackTrace(); + defImage = ImageIO.read(isNoCardJpg); + } catch (Exception e) { + // resource not found; perhaps we're running straight from source + try { + defImage = ImageIO.read(new File("src/main/resources/no_card.jpg")); + } catch (Exception ex) { + System.err.println("could not load default card image"); + } + } finally { + _defaultImage = (null == defImage) ? new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB) : defImage; } } public static void clear() { - CACHE.invalidateAll(); + _CACHE.invalidateAll(); + _missingIconKeys.clear(); } /** @@ -99,7 +109,7 @@ public class ImageCache { } else { key = card.getImageKey(); } - return scaleImage(key, width, height); + return scaleImage(key, width, height, true); } /** @@ -107,7 +117,7 @@ public class ImageCache { * and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension. */ public static BufferedImage getImage(InventoryItem ii, int width, int height) { - return scaleImage(getImageKey(ii, false), width, height); + return scaleImage(getImageKey(ii, false), width, height, true); } /** @@ -115,40 +125,42 @@ public class ImageCache { * in the cache and cannot be loaded from disk. */ public static ImageIcon getIcon(IHasIcon ihi) { - BufferedImage i = scaleImage(ihi.getIconImageKey(), -1, -1); - if (null == i) { + String imageKey = ihi.getIconImageKey(); + final BufferedImage i; + if (_missingIconKeys.contains(imageKey) || + null == (i = scaleImage(ihi.getIconImageKey(), -1, -1, false))) { + _missingIconKeys.add(imageKey); return FSkin.getIcon(FSkin.InterfaceIcons.ICO_UNKNOWN); } return new ImageIcon(i); } - private static BufferedImage scaleImage(String key, final int width, final int height) { + private static BufferedImage scaleImage(String key, final int width, final int height, boolean useDefaultImage) { if (StringUtils.isEmpty(key) || (3 > width && -1 != width) || (3 > height && -1 != height)) { // picture too small or key not defined; return a blank return null; } - StringBuilder rsKey = new StringBuilder(key); - rsKey.append("#").append(width).append('x').append(height); - String resizedKey = rsKey.toString(); + String resizedKey = String.format("%s#%dx%d", key, width, height); - final BufferedImage cached = CACHE.getIfPresent(resizedKey); + final BufferedImage cached = _CACHE.getIfPresent(resizedKey); if (null != cached) { + //System.out.println("found cached image: " + resizedKey); return cached; } - boolean mayEnlarge = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER); BufferedImage original = getImage(key); - if (null == original) { - original = defaultImage; - CACHE.put(key, defaultImage); // This instructs cache to give up finding a picture if it was not found once - } - - if (original == emptyImage) { // the found image is a placeholder for missing picture? - return null; + if (!useDefaultImage) { + return null; + } + + // henceforth use a default picture for this key if image not found + original = _defaultImage; + _CACHE.put(key, _defaultImage); } + boolean mayEnlarge = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER); double scale = Math.min( -1 == width ? 1 : (double)width / original.getWidth(), -1 == height? 1 : (double)height / original.getHeight()); @@ -162,12 +174,22 @@ public class ImageCache { } else { int destWidth = (int)(original.getWidth() * scale); int destHeight = (int)(original.getHeight() * scale); - ResampleOp resampler = new ResampleOp(destWidth, destHeight); - result = resampler.filter(original, null); - CACHE.put(resizedKey, result); + // if this scale has been used before, get the cached version instead of rescaling + String effectiveResizedKey = String.format("%s#%dx%d", key, destWidth, destHeight); + result = _CACHE.getIfPresent(effectiveResizedKey); + if (null == result) { + ResampleOp resampler = new ResampleOp(destWidth, destHeight); + result = resampler.filter(original, null); + //System.out.println("caching resized image: " + effectiveResizedKey); + _CACHE.put(effectiveResizedKey, result); + //} else { + // System.out.println("retrieved resized image: " + effectiveResizedKey); + } } + //System.out.println("caching image: " + resizedKey); + _CACHE.put(resizedKey, result); return result; } @@ -176,7 +198,7 @@ public class ImageCache { */ private static BufferedImage getImage(final String key) { try { - return ImageCache.CACHE.get(key); + return ImageCache._CACHE.get(key); } catch (final ExecutionException ex) { if (ex.getCause() instanceof NullPointerException) { return null; @@ -196,8 +218,11 @@ public class ImageCache { return getImageKey((CardPrinted)ii, altState, true); if ( ii instanceof TournamentPack ) return ImageCache.TOURNAMENTPACK_PREFIX + ((TournamentPack)ii).getEdition(); - if ( ii instanceof BoosterPack ) - return ImageCache.BOOSTER_PREFIX + ((BoosterPack)ii).getEdition(); + if ( ii instanceof BoosterPack ) { + BoosterPack bp = (BoosterPack)ii; + String suffix = (1 >= bp.getBoosterData().getArtIndices()) ? "" : ("_" + bp.getArtIndex()); + return ImageCache.BOOSTER_PREFIX + bp.getEdition() + suffix; + } if ( ii instanceof FatPack ) return ImageCache.FATPACK_PREFIX + ((FatPack)ii).getEdition(); if ( ii instanceof PreconDeck ) diff --git a/src/main/java/forge/card/BoosterData.java b/src/main/java/forge/card/BoosterData.java index 1552ac5397a..8a3d536b9c5 100644 --- a/src/main/java/forge/card/BoosterData.java +++ b/src/main/java/forge/card/BoosterData.java @@ -16,16 +16,15 @@ public class BoosterData extends PackData { private final int foilRate; private static final int CARDS_PER_BOOSTER = 15; - public BoosterData(final String edition, final String editionLand, final int nC, final int nU, final int nR, final int nS, final int nDF) { + public BoosterData(String edition, String editionLand, int nC, int nU, int nR, int nS, int nDF, int artIndices) { // if this booster has more that 10 cards, there must be a land in // 15th slot unless it's already taken - this(edition, editionLand, nC, nU, nR, nS, nDF, (nC + nR + nU + nS + nDF) > 10 ? BoosterData.CARDS_PER_BOOSTER - nC - nR - nU - - nS - nDF : 0, 68); + this(edition, editionLand, nC, nU, nR, nS, nDF, artIndices, + (nC + nR + nU + nS + nDF) > 10 ? BoosterData.CARDS_PER_BOOSTER - nC - nR - nU - nS - nDF : 0, 68); } - public BoosterData(final String edition0, final String editionLand, final int nC, final int nU, final int nR, final int nS, final int nDF, final int nL, - final int oneFoilPer) { - super(edition0, editionLand, nL > 0 ? nL : 0); + public BoosterData(String edition, String editionLand, int nC, int nU, int nR, int nS, int nDF, int artIndices, int nL, int oneFoilPer) { + super(edition, editionLand, nL > 0 ? nL : 0, artIndices); this.nCommon = nC; this.nUncommon = nU; this.nRare = nR; @@ -41,6 +40,7 @@ public class BoosterData extends PackData { public final Predicate getEditionFilter() { return IPaperCard.Predicates.printedInSets(getEdition()); } + public final Predicate getLandEditionFilter() { return IPaperCard.Predicates.printedInSets(getLandEdition()); } @@ -141,6 +141,7 @@ public class BoosterData extends PackData { int nR = section.getInt("Rares", 0); int nS = section.getInt("Special", 0); int nDf = section.getInt("DoubleFaced", 0); + int artIndices = section.getInt("Images", 1); int nLand = section.getInt("BasicLands", 0); int nFoilRate = section.getInt("FoilRate", 68); String edition = section.get("Set"); @@ -149,7 +150,7 @@ public class BoosterData extends PackData { editionLand = edition; } - return new BoosterData(edition, editionLand, nC, nU, nR, nS, nDf, nLand, nFoilRate); + return new BoosterData(edition, editionLand, nC, nU, nR, nS, nDf, artIndices, nLand, nFoilRate); } } } diff --git a/src/main/java/forge/card/FatPackData.java b/src/main/java/forge/card/FatPackData.java index c03e038351f..b318b918f79 100644 --- a/src/main/java/forge/card/FatPackData.java +++ b/src/main/java/forge/card/FatPackData.java @@ -15,7 +15,7 @@ public class FatPackData extends PackData { public FatPackData(String edition0, String landEdition0, int nBoosters, int nBasicLands) { - super(edition0, landEdition0, nBasicLands); + super(edition0, landEdition0, nBasicLands, 1); cntBoosters = nBoosters; } diff --git a/src/main/java/forge/card/PackData.java b/src/main/java/forge/card/PackData.java index 64e9b7d9332..499d0b31a8a 100644 --- a/src/main/java/forge/card/PackData.java +++ b/src/main/java/forge/card/PackData.java @@ -18,29 +18,39 @@ package forge.card; +import org.apache.commons.lang.NullArgumentException; + import com.google.common.base.Function; public class PackData { private final String edition; + private final String landEdition; + private final int cntLands; + private final int artIndices; + public final String getEdition() { return edition; } - private final String landEdition; public final String getLandEdition() { return landEdition == null ? edition : landEdition; } - private final int cntLands; public int getCntLands() { return cntLands; } + + public int getArtIndices() { + return artIndices; + } - public PackData(String edition0, String landEdition0, int nBasicLands) + public PackData(String edition0, String landEdition0, int nBasicLands, int artIndices0) { + if (null == edition0) { throw new NullArgumentException("edition0"); } edition = edition0; landEdition = landEdition0; cntLands = nBasicLands; + artIndices = artIndices0; } public static final Function FN_GET_CODE = new Function() { @@ -49,4 +59,24 @@ public class PackData { return arg1.edition; } }; + + @Override + public final boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (this.getClass() != obj.getClass()) { + return false; + } + PackData other = (PackData)obj; + return edition.equals(other.edition); + } + + @Override + public final int hashCode() { + return edition.hashCode(); + } } diff --git a/src/main/java/forge/item/BoosterPack.java b/src/main/java/forge/item/BoosterPack.java index 192ab2073d3..b2472f4148d 100644 --- a/src/main/java/forge/item/BoosterPack.java +++ b/src/main/java/forge/item/BoosterPack.java @@ -46,4 +46,8 @@ public class BoosterPack extends OpenablePack { public final Object clone() { return new BoosterPack(name, contents); } + + public BoosterData getBoosterData() { + return contents; + } } diff --git a/src/main/java/forge/item/FatPack.java b/src/main/java/forge/item/FatPack.java index 699d8915138..058e5a4742f 100644 --- a/src/main/java/forge/item/FatPack.java +++ b/src/main/java/forge/item/FatPack.java @@ -28,8 +28,6 @@ import forge.card.CardEdition; import forge.card.FatPackData; public class FatPack extends OpenablePack { - - /** The Constant fnFromSet. */ public static final Function FN_FROM_SET = new Function() { @Override public FatPack apply(final CardEdition arg1) { diff --git a/src/main/java/forge/item/OpenablePack.java b/src/main/java/forge/item/OpenablePack.java index cac3021cd62..c05253be8d3 100644 --- a/src/main/java/forge/item/OpenablePack.java +++ b/src/main/java/forge/item/OpenablePack.java @@ -20,6 +20,8 @@ package forge.item; import java.util.List; +import org.apache.commons.lang.NullArgumentException; + import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; @@ -28,23 +30,28 @@ import forge.card.BoosterData; import forge.card.BoosterGenerator; import forge.card.CardRulesPredicates; import forge.util.Aggregates; +import forge.util.MyRandom; public abstract class OpenablePack implements InventoryItemFromSet { protected final BoosterData contents; - protected final String name; + private final int artIndex; + private final int hash; private List cards = null; - private BoosterGenerator generator = null; - public OpenablePack(final String name0, final BoosterData boosterData) { - this.contents = boosterData; - this.name = name0; + public OpenablePack(String name0, BoosterData boosterData) { + if (null == name0) { throw new NullArgumentException("name0"); } + if (null == boosterData) { throw new NullArgumentException("boosterData"); } + contents = boosterData; + name = name0; + artIndex = MyRandom.getRandom().nextInt(boosterData.getArtIndices()) + 1; + hash = name.hashCode() ^ getClass().hashCode() ^ contents.hashCode() ^ artIndex; } @Override public final String getName() { - return this.name + " " + this.getItemType(); + return name + " " + getItemType(); } public String getDescription() { @@ -53,23 +60,27 @@ public abstract class OpenablePack implements InventoryItemFromSet { @Override public final String getEdition() { - return this.contents.getEdition(); + return contents.getEdition(); + } + + public final int getArtIndex() { + return artIndex; } public final List getCards() { - if (null == this.cards) { - this.cards = this.generate(); + if (null == cards) { + cards = generate(); } - return this.cards; + return cards; } public int getTotalCards() { - return this.contents.getTotal(); + return contents.getTotal(); } @Override - public final boolean equals(final Object obj) { + public final boolean equals(Object obj) { if (this == obj) { return true; } @@ -79,34 +90,25 @@ public abstract class OpenablePack implements InventoryItemFromSet { if (this.getClass() != obj.getClass()) { return false; } - final OpenablePack other = (OpenablePack) obj; - if (this.contents == null) { - if (other.contents != null) { - return false; - } - } else if (!this.contents.equals(other.contents)) { - return false; - } - return true; + OpenablePack other = (OpenablePack)obj; + return name.equals(other.name) && contents.equals(other.contents) && artIndex == other.artIndex; } @Override public final int hashCode() { - final int prime = 31; - int result = 1; - result = (prime * result) + ((this.contents == null) ? 0 : this.contents.hashCode()); - return result; + System.out.println(String.format("returning hash: %d for edition=%s; idx=%d", hash, getEdition(), getArtIndex())); + return hash; } protected List generate() { - if (null == this.generator) { - this.generator = new BoosterGenerator(this.contents.getEditionFilter()); + if (null == generator) { + generator = new BoosterGenerator(contents.getEditionFilter()); } - final List myCards = this.generator.getBoosterPack(this.contents); + final List myCards = generator.getBoosterPack(contents); - final int cntLands = this.contents.getCntLands(); + final int cntLands = contents.getCntLands(); if (cntLands > 0) { - myCards.add(this.getRandomBasicLand(this.contents.getLandEdition())); + myCards.add(getRandomBasicLand(contents.getLandEdition())); } return myCards; }