mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Fix Meld cards fetch (#7981)
* BOM * ANB Update * J25 Update * SIR update * Mend * Find the right back for meld cards * ANB Update * J25 Update * SIR update * Mend * Find the right back for meld cards * Update PW25 * Update SPG * Typo * Update ACR * Update CMM * Add PFDN and Invasion alternate arts * Update MKM * Update NPH * J25 -> J22 for non-existing cards * Update WOC * Update HBG * Use printsheet * Use helper functions
This commit is contained in:
@@ -21,6 +21,7 @@ import com.google.common.collect.ListMultimap;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Multimaps;
|
import com.google.common.collect.Multimaps;
|
||||||
|
import forge.ImageKeys;
|
||||||
import forge.StaticData;
|
import forge.StaticData;
|
||||||
import forge.card.CardEdition.EditionEntry;
|
import forge.card.CardEdition.EditionEntry;
|
||||||
import forge.card.CardEdition.Type;
|
import forge.card.CardEdition.Type;
|
||||||
@@ -200,7 +201,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isArtIndex(String s) {
|
private static boolean isArtIndex(String s) {
|
||||||
return StringUtils.isNumeric(s) && s.length() <= 2 ; // only artIndex between 1-99
|
return StringUtils.isNumeric(s) && s.length() <= 2; // only artIndex between 1-99
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isSetCode(String s) {
|
private static boolean isSetCode(String s) {
|
||||||
@@ -241,8 +242,8 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
|
|||||||
setCode = info[index];
|
setCode = info[index];
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
if(info.length > index && isArtIndex(info[index])) {
|
if(info.length > index && isArtIndex(info[index].replace(ImageKeys.BACKFACE_POSTFIX, ""))) {
|
||||||
artIndex = Integer.parseInt(info[index]);
|
artIndex = Integer.parseInt(info[index].replace(ImageKeys.BACKFACE_POSTFIX, ""));
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
if(info.length > index && isCollectorNumber(info[index])) {
|
if(info.length > index && isCollectorNumber(info[index])) {
|
||||||
|
|||||||
@@ -154,6 +154,31 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
|
|||||||
return this.noSellVersion;
|
return this.noSellVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PaperCard getMeldBaseCard() {
|
||||||
|
if (getRules().getSplitType() != CardSplitType.Meld) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is the base part of the meld duo
|
||||||
|
if (getRules().getOtherPart() == null) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
String meldWith = getRules().getMeldWith();
|
||||||
|
if (meldWith == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<PrintSheet> sheets = StaticData.instance().getCardEdition(this.edition).getPrintSheetsBySection();
|
||||||
|
for (PrintSheet sheet : sheets) {
|
||||||
|
if (sheet.contains(this)) {
|
||||||
|
return sheet.find(PaperCardPredicates.name(meldWith));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public PaperCard copyWithoutFlags() {
|
public PaperCard copyWithoutFlags() {
|
||||||
if(this.flaglessVersion == null) {
|
if(this.flaglessVersion == null) {
|
||||||
if(this.flags == PaperCardFlags.IDENTITY_FLAGS)
|
if(this.flags == PaperCardFlags.IDENTITY_FLAGS)
|
||||||
|
|||||||
@@ -231,7 +231,27 @@ public class ImageUtil {
|
|||||||
}
|
}
|
||||||
String versionParam = useArtCrop ? "art_crop" : "normal";
|
String versionParam = useArtCrop ? "art_crop" : "normal";
|
||||||
String faceParam = "";
|
String faceParam = "";
|
||||||
if (cp.getRules().getOtherPart() != null) {
|
if (cp.getRules().getSplitType() == CardSplitType.Meld) {
|
||||||
|
if (face.equals("back")) {
|
||||||
|
PaperCard meldBasePc = cp.getMeldBaseCard();
|
||||||
|
cardCollectorNumber = meldBasePc.getCollectorNumber();
|
||||||
|
String collectorNumberSuffix = "";
|
||||||
|
|
||||||
|
if (cardCollectorNumber.endsWith("a")) {
|
||||||
|
cardCollectorNumber = cardCollectorNumber.substring(0, cardCollectorNumber.length() - 1);
|
||||||
|
} else if (cardCollectorNumber.endsWith("as")) {
|
||||||
|
cardCollectorNumber = cardCollectorNumber.substring(0, cardCollectorNumber.length() - 2);
|
||||||
|
collectorNumberSuffix = "s";
|
||||||
|
} else if (cardCollectorNumber.endsWith("ap")) {
|
||||||
|
cardCollectorNumber = cardCollectorNumber.substring(0, cardCollectorNumber.length() - 2);
|
||||||
|
collectorNumberSuffix = "p";
|
||||||
|
}
|
||||||
|
|
||||||
|
cardCollectorNumber += "b" + collectorNumberSuffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
faceParam = "&face=front";
|
||||||
|
} else if (cp.getRules().getOtherPart() != null) {
|
||||||
faceParam = (face.equals("back") && cp.getRules().getSplitType() != CardSplitType.Flip
|
faceParam = (face.equals("back") && cp.getRules().getSplitType() != CardSplitType.Flip
|
||||||
? "&face=back"
|
? "&face=back"
|
||||||
: "&face=front");
|
: "&face=front");
|
||||||
|
|||||||
@@ -1051,7 +1051,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
// it was always created), adjust threshold based on its existence.
|
// it was always created), adjust threshold based on its existence.
|
||||||
int threshold = states.containsKey(CardStateName.FaceDown) ? 2 : 1;
|
int threshold = states.containsKey(CardStateName.FaceDown) ? 2 : 1;
|
||||||
|
|
||||||
int numStates = states.keySet().size();
|
int numStates = states.size();
|
||||||
|
|
||||||
return numStates > threshold;
|
return numStates > threshold;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7444,8 +7444,8 @@ Gandalf the White|LTR
|
|||||||
1 Reckless Amplimancer|J25
|
1 Reckless Amplimancer|J25
|
||||||
1 Defend the Celestus|J25
|
1 Defend the Celestus|J25
|
||||||
1 Snakeskin Veil|J25
|
1 Snakeskin Veil|J25
|
||||||
1 Cultivate|J25
|
1 Cultivate|J22
|
||||||
1 Declare Dominance|J25
|
1 Declare Dominance|J22
|
||||||
1 Audacity|J25
|
1 Audacity|J25
|
||||||
1 Warbriar Blessing|J25
|
1 Warbriar Blessing|J25
|
||||||
1 Wolfrider's Saddle|J25
|
1 Wolfrider's Saddle|J25
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ ScryfallCode=HBG
|
|||||||
1 R Klement, Novice Acolyte @Maria Poliakova
|
1 R Klement, Novice Acolyte @Maria Poliakova
|
||||||
2 R Lae'zel, Githyanki Warrior @John Stanko
|
2 R Lae'zel, Githyanki Warrior @John Stanko
|
||||||
3 U Lulu, Forgetful Hollyphant @Jakob Eirich
|
3 U Lulu, Forgetful Hollyphant @Jakob Eirich
|
||||||
4 U Rasaad, Monk of Selûne @Dan Scott
|
4 U Rasaad, Monk of Selûne @Dan Murayama Scott
|
||||||
5 U Alora, Rogue Companion @Aaron Miller
|
5 U Alora, Rogue Companion @Aaron Miller
|
||||||
6 M Gale, Conduit of the Arcane @Cristi Balanescu
|
6 M Gale, Conduit of the Arcane @Cristi Balanescu
|
||||||
7 R Imoen, Trickster Friend @Alix Branwyn
|
7 R Imoen, Trickster Friend @Alix Branwyn
|
||||||
@@ -276,26 +276,26 @@ ScryfallCode=HBG
|
|||||||
264 C Prophetic Prism @Diego Gisbert
|
264 C Prophetic Prism @Diego Gisbert
|
||||||
265 C Spiked Pit Trap @Deruchenko Alexander
|
265 C Spiked Pit Trap @Deruchenko Alexander
|
||||||
266 R Baldur's Gate @Titus Lunter
|
266 R Baldur's Gate @Titus Lunter
|
||||||
267 L Plains @Bruce Brenneise
|
289 L Plains @Bruce Brenneise
|
||||||
268 L Plains @Leanna Crossan
|
290 L Plains @Leanna Crossan
|
||||||
269 L Plains @Titus Lunter
|
291 L Plains @Titus Lunter
|
||||||
270 L Plains @Emmanuel Shiu
|
292 L Plains @Emmanuel Shiu
|
||||||
271 L Island @Bruce Brenneise
|
293 L Island @Bruce Brenneise
|
||||||
272 L Island @Piotr Dura
|
294 L Island @Piotr Dura
|
||||||
273 L Island @James Paick
|
295 L Island @James Paick
|
||||||
274 L Island @Sam White
|
296 L Island @Sam White
|
||||||
275 L Swamp @Piotr Dura
|
297 L Swamp @Piotr Dura
|
||||||
276 L Swamp @Logan Feliciano
|
298 L Swamp @Logan Feliciano
|
||||||
277 L Swamp @Grady Frederick
|
299 L Swamp @Grady Frederick
|
||||||
278 L Swamp @Sam White
|
300 L Swamp @Sam White
|
||||||
279 L Mountain @Matt Gaser
|
301 L Mountain @Matt Gaser
|
||||||
280 L Mountain @Lucas Graciano
|
302 L Mountain @Lucas Graciano
|
||||||
281 L Mountain @Muhammad Firdaus
|
303 L Mountain @Muhammad Firdaus
|
||||||
282 L Mountain @Sam White
|
304 L Mountain @Sam White
|
||||||
283 L Forest @Bruce Brenneise
|
305 L Forest @Bruce Brenneise
|
||||||
284 L Forest @Muhammad Firdaus
|
306 L Forest @Muhammad Firdaus
|
||||||
285 L Forest @Lucas Graciano
|
307 L Forest @Lucas Graciano
|
||||||
286 L Forest @Julian Kok Joon Wen
|
308 L Forest @Julian Kok Joon Wen
|
||||||
|
|
||||||
[rebalanced]
|
[rebalanced]
|
||||||
A85 C A-Blessed Hippogriff @Leanna Crossan
|
A85 C A-Blessed Hippogriff @Leanna Crossan
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
Code=EMN
|
Code=EMN
|
||||||
Date=2016-07-22
|
Date=2016-07-22
|
||||||
Name=Eldritch Moon
|
Name=Eldritch Moon
|
||||||
Code2=EMN
|
|
||||||
Type=Expansion
|
Type=Expansion
|
||||||
BoosterCovers=3
|
BoosterCovers=3
|
||||||
Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc:!Rare:!Mythic, 1 BasicLand SOI
|
Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc:!Rare:!Mythic, 1 BasicLand SOI
|
||||||
|
|||||||
@@ -578,7 +578,7 @@ ScryfallCode=J25
|
|||||||
571 C Kindled Fury @Craig J Spearing
|
571 C Kindled Fury @Craig J Spearing
|
||||||
572 R Krenko, Tin Street Kingpin @Viko Menezes
|
572 R Krenko, Tin Street Kingpin @Viko Menezes
|
||||||
573 C Kruin Striker @Christopher Moeller
|
573 C Kruin Striker @Christopher Moeller
|
||||||
574 R Markov Blademaster @Jana Schirmer
|
574 R Markov Blademaster @Jana Schirmer & Johannes Voss
|
||||||
575 R Markov Enforcer @Wisnu Tan
|
575 R Markov Enforcer @Wisnu Tan
|
||||||
576 U Markov Retribution @Uriah Voth
|
576 U Markov Retribution @Uriah Voth
|
||||||
577 U Markov Warlord @Cynthia Sheppard
|
577 U Markov Warlord @Cynthia Sheppard
|
||||||
|
|||||||
9
forge-gui/res/editions/Foundations Promos.txt
Normal file
9
forge-gui/res/editions/Foundations Promos.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
[metadata]
|
||||||
|
Code=PFDN
|
||||||
|
Date=2024-11-15
|
||||||
|
Name=Foundations Promos
|
||||||
|
Type=Promo
|
||||||
|
ScryfallCode=PFDN
|
||||||
|
|
||||||
|
[cards]
|
||||||
|
1 R Sol Ring @Mike Bierek
|
||||||
@@ -53,7 +53,7 @@ Replace=.04 Mythic:fromSheet("INR cards")
|
|||||||
11 M Archangel Avacyn @James Ryman
|
11 M Archangel Avacyn @James Ryman
|
||||||
12 C Avacynian Priest @Greg Staples
|
12 C Avacynian Priest @Greg Staples
|
||||||
13 C Bound by Moonsilver @Joseph Meehan
|
13 C Bound by Moonsilver @Joseph Meehan
|
||||||
14 R Bruna, the Fading Light @Clint Cearley
|
14a R Bruna, the Fading Light @Clint Cearley
|
||||||
15 C Cathar Commando @Evyn Fong
|
15 C Cathar Commando @Evyn Fong
|
||||||
16 U Cathar's Call @Matt Stewart
|
16 U Cathar's Call @Matt Stewart
|
||||||
17 R Cathars' Crusade @Karl Kopinski
|
17 R Cathars' Crusade @Karl Kopinski
|
||||||
@@ -196,7 +196,7 @@ Replace=.04 Mythic:fromSheet("INR cards")
|
|||||||
154 U Fiery Temper @Johannes Voss
|
154 U Fiery Temper @Johannes Voss
|
||||||
155 U Furyblade Vampire @Lius Lasahido
|
155 U Furyblade Vampire @Lius Lasahido
|
||||||
156 U Geier Reach Bandit @Slawomir Maniak
|
156 U Geier Reach Bandit @Slawomir Maniak
|
||||||
157 R Hanweir Garrison @Vincent Proce
|
157a R Hanweir Garrison @Vincent Proce
|
||||||
158 C Hanweir Watchkeep @Wayne Reynolds
|
158 C Hanweir Watchkeep @Wayne Reynolds
|
||||||
159 U Honeymoon Hearse @Raoul Vitale
|
159 U Honeymoon Hearse @Raoul Vitale
|
||||||
160 C Hungry Ridgewolf @Olena Richards
|
160 C Hungry Ridgewolf @Olena Richards
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[metadata]
|
||||||
|
Code=INV_AA
|
||||||
|
Date=2000-10-02
|
||||||
|
Name=Invasion Simplified Chinese Alternate Art
|
||||||
|
Type=Promo
|
||||||
|
ScryfallCode=INV
|
||||||
|
|
||||||
|
[cards]
|
||||||
|
124s C Soul Burn @Andrew Goldhawk
|
||||||
|
124★ C Soul Burn @Andrew Goldhawk
|
||||||
|
134s C Urborg Skeleton @Tom Wänerstrand
|
||||||
|
134★ C Urborg Skeleton @Tom Wänerstrand
|
||||||
@@ -552,3 +552,6 @@ Base=Any:fromsheet("MKM prerelease promo")
|
|||||||
18 c_a_clue_draw @Mike Burns
|
18 c_a_clue_draw @Mike Burns
|
||||||
19 c_0_0_a_thopter_flying @David Sondered
|
19 c_0_0_a_thopter_flying @David Sondered
|
||||||
20 c_1_1_a_thopter_flying @Samuel Perin
|
20 c_1_1_a_thopter_flying @Samuel Perin
|
||||||
|
|
||||||
|
[other]
|
||||||
|
21 cloaked @Ben Hill
|
||||||
@@ -26,7 +26,7 @@ ScryfallCode=SIR
|
|||||||
14 U Blessed Alliance @Johann Bodin
|
14 U Blessed Alliance @Johann Bodin
|
||||||
15 C Borrowed Grace @Volkan Baǵa
|
15 C Borrowed Grace @Volkan Baǵa
|
||||||
16 C Bound by Moonsilver @Joseph Meehan
|
16 C Bound by Moonsilver @Joseph Meehan
|
||||||
17 R Bruna, the Fading Light @Clint Cearley
|
17a R Bruna, the Fading Light @Clint Cearley
|
||||||
18 R Bygone Bishop @Jason A. Engle
|
18 R Bygone Bishop @Jason A. Engle
|
||||||
19 R Collective Effort @Eric Deschamps
|
19 R Collective Effort @Eric Deschamps
|
||||||
20 U Courageous Outrider @Ryan Alexander Lee
|
20 U Courageous Outrider @Ryan Alexander Lee
|
||||||
@@ -124,7 +124,7 @@ ScryfallCode=SIR
|
|||||||
112 C Ghoulcaller's Accomplice @Dave Kendall
|
112 C Ghoulcaller's Accomplice @Dave Kendall
|
||||||
113 C Gisa's Bidding @Jason Felix
|
113 C Gisa's Bidding @Jason Felix
|
||||||
114 U Graf Harvest @Lake Hurwitz
|
114 U Graf Harvest @Lake Hurwitz
|
||||||
115 C Graf Rats @Jason Felix
|
115a C Graf Rats @Jason Felix
|
||||||
116 C Grotesque Mutation @Dan Murayama Scott
|
116 C Grotesque Mutation @Dan Murayama Scott
|
||||||
117 U Haunted Dead @Lake Hurwitz
|
117 U Haunted Dead @Lake Hurwitz
|
||||||
118 U Indulgent Aristocrat @Anna Steinbauer
|
118 U Indulgent Aristocrat @Anna Steinbauer
|
||||||
@@ -232,7 +232,7 @@ ScryfallCode=SIR
|
|||||||
220 R Traverse the Ulvenwald @Vincent Proce
|
220 R Traverse the Ulvenwald @Vincent Proce
|
||||||
221 C Ulvenwald Captive @Chris Rahn
|
221 C Ulvenwald Captive @Chris Rahn
|
||||||
222 R Ulvenwald Hydra @Raymond Swanland
|
222 R Ulvenwald Hydra @Raymond Swanland
|
||||||
223 U Ulvenwald Mysteries @Marzena Nereida Piwowar
|
223 U Ulvenwald Mysteries @Nereida
|
||||||
224 U Vessel of Nascency @Kieran Yanner
|
224 U Vessel of Nascency @Kieran Yanner
|
||||||
225 U Veteran Cathar @Deruchenko Alexander
|
225 U Veteran Cathar @Deruchenko Alexander
|
||||||
226 C Weirding Wood @Jung Park
|
226 C Weirding Wood @Jung Park
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
Code=BRO
|
Code=BRO
|
||||||
Date=2022-11-18
|
Date=2022-11-18
|
||||||
Name=The Brothers' War
|
Name=The Brothers' War
|
||||||
Code2=BRO
|
|
||||||
Type=Expansion
|
Type=Expansion
|
||||||
BoosterCovers=3
|
BoosterCovers=3
|
||||||
Booster=9 Common:fromsheet("BRO cards"), 3 Uncommon:fromSheet("BRO cards"), 1 RareMythic:fromSheet("BRO cards"), 1 fromSheet("BRO lands"), 1 fromSheet("BRR cards")
|
Booster=9 Common:fromsheet("BRO cards"), 3 Uncommon:fromSheet("BRO cards"), 1 RareMythic:fromSheet("BRO cards"), 1 fromSheet("BRO lands"), 1 fromSheet("BRR cards")
|
||||||
@@ -173,7 +172,7 @@ ScryfallCode=BRO
|
|||||||
160 U Heavyweight Demolisher @Svetlin Velinov
|
160 U Heavyweight Demolisher @Svetlin Velinov
|
||||||
161 C Mishra's Juggernaut @Steve Prescott
|
161 C Mishra's Juggernaut @Steve Prescott
|
||||||
162 U Mishra's Research Desk @Matt Stewart
|
162 U Mishra's Research Desk @Matt Stewart
|
||||||
163 R Phyrexian Dragon Engine @Chris Rahn
|
163a R Phyrexian Dragon Engine @Chris Rahn
|
||||||
164 C Scrapwork Mutt @Sidharth Chaturvedi
|
164 C Scrapwork Mutt @Sidharth Chaturvedi
|
||||||
165 M Skitterbeam Battalion @Leon Tukker
|
165 M Skitterbeam Battalion @Leon Tukker
|
||||||
166 U Alloy Animist @Kim Sokol
|
166 U Alloy Animist @Kim Sokol
|
||||||
@@ -266,7 +265,7 @@ ScryfallCode=BRO
|
|||||||
253 U Thran Power Suit @Raf Kayupov
|
253 U Thran Power Suit @Raf Kayupov
|
||||||
254 R Thran Spider @Joshua Cairos
|
254 R Thran Spider @Joshua Cairos
|
||||||
255 C Tower Worker @Gaboleps
|
255 C Tower Worker @Gaboleps
|
||||||
256 R Argoth, Sanctum of Nature @Cristi Balanescu
|
256a R Argoth, Sanctum of Nature @Cristi Balanescu
|
||||||
257 R Battlefield Forge @Thomas Stoop
|
257 R Battlefield Forge @Thomas Stoop
|
||||||
258 R Blast Zone @Jorge Jacinto
|
258 R Blast Zone @Jorge Jacinto
|
||||||
259 R Brushland @Thomas Stoop
|
259 R Brushland @Thomas Stoop
|
||||||
|
|||||||
@@ -187,16 +187,10 @@ ScryfallCode=WOC
|
|||||||
0 role_virtuous @Unknown
|
0 role_virtuous @Unknown
|
||||||
0 role_virtuous @Unknown
|
0 role_virtuous @Unknown
|
||||||
0 role_virtuous @Unknown
|
0 role_virtuous @Unknown
|
||||||
5 w_2_2_cat @April Prime
|
|
||||||
6 w_1_1_cat_lifelink @Filip Burburan
|
|
||||||
7 w_1_1_human_soldier @Kimonas Theodossiou
|
7 w_1_1_human_soldier @Kimonas Theodossiou
|
||||||
8 w_2_4_ox @Aaron Miller
|
|
||||||
9 w_2_2_pegasus_flying @Lars Grant-West
|
9 w_2_2_pegasus_flying @Lars Grant-West
|
||||||
10 u_1_1_faerie_flying @Irina Nordsol
|
10 u_1_1_faerie_flying @Irina Nordsol
|
||||||
11 b_1_1_faerie_rogue_flying @Dave Allsop
|
11 b_1_1_faerie_rogue_flying @Dave Allsop
|
||||||
12 r_4_2_pirate_noblock @Igor Krstic
|
12 r_4_2_pirate_noblock @Igor Krstic
|
||||||
13 g_3_3_elephant @Lars Grant-West
|
|
||||||
14 g_1_1_human_monk_g @Anastasia Ovchinnikova
|
|
||||||
15 g_1_1_saproling @Joseph Meehan
|
15 g_1_1_saproling @Joseph Meehan
|
||||||
16 ub_1_1_faerie_rogue_flying @E. M. Gist
|
16 ub_1_1_faerie_rogue_flying @E. M. Gist
|
||||||
17 wb_1_1_spirit_flying @Josh Hass
|
|
||||||
|
|||||||
Reference in New Issue
Block a user