mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
NOTE: A commit with errors was apparently pushed previous to mine. As a result, my work has been broken also, and will unfortunately take some time to fix. The functionality described below will eventually work.
===== Big commit: Restructured Quest quests to use dck files. This required changes in many places. Among other things: - Model and view separated for quest main panel items - Quests and battles all generated from dck files - dck files all updated to contain metadata, main, sideboard - Quest dck files updated to contain [ai_extra_cards] and [human_extra_cards]
This commit is contained in:
9
.gitattributes
vendored
9
.gitattributes
vendored
@@ -9774,6 +9774,7 @@ src/main/java/forge/gui/ListChooser.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/MultiLineLabel.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/MultiLineLabelUI.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/MultiPhaseProgressMonitorWithETA.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/SelectablePanel.java -text
|
||||
src/main/java/forge/gui/deckeditor/CardPanelBase.java -text
|
||||
src/main/java/forge/gui/deckeditor/CardPanelHeavy.java -text
|
||||
src/main/java/forge/gui/deckeditor/CardPanelLite.java -text
|
||||
@@ -9822,6 +9823,10 @@ src/main/java/forge/properties/NewConstants.java svneol=native#text/plain
|
||||
src/main/java/forge/properties/Preferences.java svneol=native#text/plain
|
||||
src/main/java/forge/properties/SavePreferencesListener.java svneol=native#text/plain
|
||||
src/main/java/forge/properties/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/DeckSingleBattle.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/DeckSingleQuest.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/ManagerBattle.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/ManagerQuest.java -text
|
||||
src/main/java/forge/quest/data/QuestBattleManager.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/QuestBoosterPack.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/QuestData.java svneol=native#text/plain
|
||||
@@ -9853,8 +9858,11 @@ src/main/java/forge/quest/data/pet/QuestPetManager.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/pet/QuestPetPlant.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/pet/QuestPetWolf.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/data/pet/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/gui/PanelSingleBattle.java -text
|
||||
src/main/java/forge/quest/gui/PanelSingleQuest.java -text
|
||||
src/main/java/forge/quest/gui/QuestAbstractPanel.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/gui/QuestFrame.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/gui/QuestMainPanel.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/gui/QuestOptions.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/gui/bazaar/QuestBazaarItem.java svneol=native#text/plain
|
||||
src/main/java/forge/quest/gui/bazaar/QuestBazaarPanel.java svneol=native#text/plain
|
||||
@@ -9923,7 +9931,6 @@ src/test/java/forge/GuiWinLoseTest.java svneol=native#text/plain
|
||||
src/test/java/forge/PanelTest.java svneol=native#text/plain
|
||||
src/test/java/forge/PhaseTest.java svneol=native#text/plain
|
||||
src/test/java/forge/ReadBoosterPackTest.java svneol=native#text/plain
|
||||
src/test/java/forge/ReadQuestAssignmentTest.java svneol=native#text/plain
|
||||
src/test/java/forge/RunTest.java svneol=native#text/plain
|
||||
src/test/java/forge/TinyTest.java svneol=native#text/plain
|
||||
src/test/java/forge/card/cardFactory/CardFactoryTest.java svneol=native#text/plain
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
quest1
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=1
|
||||
Name=quest1
|
||||
DisplayName=Dungeon Crawling (White)
|
||||
Difficulty=Medium
|
||||
Description=This realm is guarded by a divine entity laying his protecting hand on each living being.
|
||||
Repeatable=true
|
||||
NumberWinsRequired=20
|
||||
CardReward=3 white rares
|
||||
CreditsReward=100
|
||||
Icon=Dungeon Crawling White.jpg
|
||||
AILife=25
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
24 Plains
|
||||
1 Abbey Gargoyles
|
||||
@@ -40,3 +51,6 @@ constructed
|
||||
1 Retribution of the Meek
|
||||
1 Sunlance
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
[ai_extra_cards]
|
||||
1 Divine Presence
|
||||
@@ -1,6 +1,17 @@
|
||||
quest10
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=10
|
||||
Name=quest10
|
||||
DisplayName=Zombie Attack!
|
||||
Difficulty=Hard
|
||||
Description=The village of Haven is getting attacked by the Zombie horde! Protect the village.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=40
|
||||
CardReward=4 black rares
|
||||
CreditsReward=200
|
||||
Icon=Zombie Attack.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
1 Cadaverous Knight
|
||||
1 Bog Raiders
|
||||
@@ -27,3 +38,11 @@ constructed
|
||||
1 Warpath Ghoul
|
||||
1 Viscera Dragger
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
TOKEN|W|1|1|citizen|creature
|
||||
TOKEN|W|1|1|citizen|creature
|
||||
TOKEN|W|1|1|citizen|creature
|
||||
Wall of Spears
|
||||
[ai_extra_cards]
|
||||
Scathe Zombies
|
||||
Mass of Ghouls
|
||||
@@ -1,6 +1,17 @@
|
||||
quest11
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=11
|
||||
Name=quest11
|
||||
DisplayName=The King's Contest
|
||||
Difficulty=Hard
|
||||
Description=The king is holding a contest. You are invited to participate and compete against other legends of this era.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=40
|
||||
CardReward=3 random rares
|
||||
CreditsReward=150
|
||||
Icon=The Kings Contest.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
1 Isamaru, Hound of Konda
|
||||
4 Plateau
|
||||
@@ -47,3 +58,7 @@ constructed
|
||||
3 Mountain
|
||||
1 Tuknir Deathlock
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Seal of Cleansing
|
||||
[ai_extra_cards]
|
||||
Loyal Retainers
|
||||
@@ -1,6 +1,17 @@
|
||||
quest12
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=12
|
||||
Name=quest12
|
||||
DisplayName=Barroom Brawl
|
||||
Difficulty=Hard
|
||||
Description=A drunken giant of a man takes a swing at you, your brew spills and a fight breaks out.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=64
|
||||
CardReward=4 random rares
|
||||
CreditsReward=250
|
||||
Icon=Barroom Brawl.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
2 Birds of Paradise
|
||||
4 Knight of the Reliquary
|
||||
@@ -24,3 +35,9 @@ constructed
|
||||
4 Savannah
|
||||
4 Wasteland
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
TOKEN|W|1|1|soldier ally|creature|soldier|ally
|
||||
TOKEN|W|1|1|soldier ally|creature|soldier|ally
|
||||
TOKEN|W|1|1|soldier ally|creature|soldier|ally
|
||||
[ai_extra_cards]
|
||||
Lowland Giant
|
||||
@@ -1,6 +1,17 @@
|
||||
quest13
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=13
|
||||
Name=quest13
|
||||
DisplayName=The Court Jester
|
||||
Difficulty=Hard
|
||||
Description=The Court Jester pulls a prank on you. Will you laugh it off or pay him back?
|
||||
Repeatable=false
|
||||
NumberWinsRequired=52
|
||||
CardReward=4 multi-colored rares
|
||||
CreditsReward=300
|
||||
Icon=The Court Jester.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Underground Sea
|
||||
4 Spreading Seas
|
||||
@@ -25,3 +36,7 @@ constructed
|
||||
1 Mox Jet
|
||||
2 Mountain
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Sensei's Divining Top
|
||||
[ai_extra_cards]
|
||||
Teferi's Puzzle Box
|
||||
@@ -1,6 +1,17 @@
|
||||
quest14
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=14
|
||||
Name=quest14
|
||||
DisplayName=Ancient Battlefield
|
||||
Difficulty=Hard
|
||||
Description=You visit an ancient battlefield at midnight. It is overgrown and dark. You trip on a root, utter a curse and wish that you could see.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=64
|
||||
CardReward=4 random rares
|
||||
CreditsReward=250
|
||||
Icon=Ancient Battlefield.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Birds of Paradise
|
||||
1 Plague Wind
|
||||
@@ -21,3 +32,9 @@ constructed
|
||||
1 Mox Jet
|
||||
4 Essence Warden
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Glasses of Urza
|
||||
Blight Sickle
|
||||
[ai_extra_cards]
|
||||
Bad Moon
|
||||
Wall of Brambles
|
||||
@@ -1,6 +1,17 @@
|
||||
quest15
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=15
|
||||
Name=quest15
|
||||
DisplayName=Don't Play With Matches
|
||||
Difficulty=Hard
|
||||
Description=The goblins are battling the elves. Those pesky elves, will they ever learn. Do not play with fire!
|
||||
Repeatable=false
|
||||
NumberWinsRequired=52
|
||||
CardReward=4 red rares
|
||||
CreditsReward=200
|
||||
Icon=Dont Play With Matches.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Plateau
|
||||
4 Druid of the Anima
|
||||
@@ -22,3 +33,10 @@ constructed
|
||||
4 Elvish Harbinger
|
||||
4 Llanowar Elves
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
1 Mudbutton Torchrunner
|
||||
1 Scuzzback Scrapper
|
||||
[ai_extra_cards]
|
||||
1 Heedless One
|
||||
1 Norwood Archers
|
||||
1 Wildslayer Elves
|
||||
@@ -1,6 +1,17 @@
|
||||
quest16
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=16
|
||||
Name=quest16
|
||||
DisplayName=Mines of Kazum Durl
|
||||
Difficulty=Hard
|
||||
Description=While exploring a mine with a group of dwarves the mine caves in. You start to dig out and then realize that your group is not alone.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=52
|
||||
CardReward=4 green rares
|
||||
CreditsReward=250
|
||||
Icon=Mines of Kazum Durl.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
1 Proper Burial
|
||||
2 Disenchant
|
||||
@@ -26,3 +37,14 @@ constructed
|
||||
1 Doubling Season
|
||||
3 Thelonite Hermit
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Dwarven Demolition Team
|
||||
Dwarven Pony
|
||||
Dwarven Trader
|
||||
[ai_extra_cards]
|
||||
Wall of Earth
|
||||
Wall of Air
|
||||
Wall of Ice
|
||||
Wall of Light
|
||||
Carrion Wall
|
||||
Steel Wall
|
||||
@@ -1,6 +1,17 @@
|
||||
quest17
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=17
|
||||
Name=quest17
|
||||
DisplayName=House Party
|
||||
Difficulty=Hard
|
||||
Description=Your friends decide to hold a house party at your home tonight. Later that night uninvited guests show up and disrupt the party.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=64
|
||||
CardReward=4 colorless rares
|
||||
CreditsReward=250
|
||||
Icon=House Party.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Terminate
|
||||
4 Taiga
|
||||
@@ -26,3 +37,10 @@ constructed
|
||||
4 Sprouting Thrinax
|
||||
1 Mountain
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Hopping Automaton
|
||||
Honden of Life's Web
|
||||
Forbidden Orchard
|
||||
[ai_extra_cards]
|
||||
Honden of Infinite Rage
|
||||
Mikokoro, Center of the Sea
|
||||
@@ -1,6 +1,17 @@
|
||||
quest18
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=18
|
||||
Name=quest18
|
||||
DisplayName=Crows in the Field
|
||||
Difficulty=Hard
|
||||
Description=Crows are eating the seed planted in the local farm fields. The farmers are scared. Those crows are big, you will need some help.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=64
|
||||
CardReward=5 random rares
|
||||
CreditsReward=300
|
||||
Icon=Crows in the Field.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Birds of Paradise
|
||||
4 Knight of the Reliquary
|
||||
@@ -23,3 +34,12 @@ constructed
|
||||
4 Savannah
|
||||
2 Eldrazi Conscription
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Straw Soldiers
|
||||
Femeref Archers
|
||||
Moonglove Extract
|
||||
[ai_extra_cards]
|
||||
Defiant Falcon
|
||||
Soulcatcher
|
||||
Storm Crow
|
||||
Hypnotic Specter
|
||||
@@ -1,6 +1,17 @@
|
||||
quest19
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=19
|
||||
Name=quest19
|
||||
DisplayName=The Desert Caravan
|
||||
Difficulty=Hard
|
||||
Description=A caravan is transporting silk across the desert. While setting up camp for the night you are attacked by thieves. Defend yourself.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=80
|
||||
CardReward=5 random rares
|
||||
CreditsReward=300
|
||||
Icon=The Desert Caravan.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Birds of Paradise
|
||||
3 Armistice
|
||||
@@ -20,3 +31,9 @@ constructed
|
||||
4 Eladamri's Call
|
||||
4 Savannah
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Spidersilk Net
|
||||
Dromad Purebred
|
||||
[ai_extra_cards]
|
||||
4 Ambush Party
|
||||
Gnat Alley Creeper
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
quest2
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=2
|
||||
Name=quest2
|
||||
DisplayName=Dungeon Crawling (Blue)
|
||||
Difficulty=Medium
|
||||
Description=This realm holds knowledge so vast it can overburden the unwary.
|
||||
Repeatable=true
|
||||
NumberWinsRequired=20
|
||||
CardReward=3 blue rares
|
||||
CreditsReward=100
|
||||
Icon=Dungeon Crawling Blue.jpg
|
||||
AILife=25
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
20 Island
|
||||
4 Wasteland
|
||||
@@ -27,3 +38,7 @@ constructed
|
||||
1 Fugitive Wizard
|
||||
1 Grayscaled Gharial
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
1 Quest for Ancient Secrets
|
||||
[ai_extra_cards]
|
||||
1 Forced Fruition
|
||||
@@ -1,6 +1,17 @@
|
||||
quest20
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=20
|
||||
Name=quest20
|
||||
DisplayName=Blood Oath
|
||||
Difficulty=Hard
|
||||
Description=A druid saves your life and the two of you take a blood oath. It is now time to fulfill your oath.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=80
|
||||
CardReward=5 colorless rares
|
||||
CreditsReward=300
|
||||
Icon=Blood Oath.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Underground Sea
|
||||
4 Tropical Island
|
||||
@@ -32,3 +43,11 @@ constructed
|
||||
1 Thoughtseize
|
||||
1 Emrakul, the Aeons Torn
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Counterbalance
|
||||
Hatching Plans
|
||||
Ley Druid
|
||||
[ai_extra_cards]
|
||||
Ior Ruin Expedition
|
||||
Oversold Cemetery
|
||||
Trapjaw Kelpie
|
||||
@@ -1,6 +1,17 @@
|
||||
quest21
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=21
|
||||
Name=quest21
|
||||
DisplayName=Private Domain
|
||||
Difficulty=Expert
|
||||
Description=During your travels, you accidentally stumble upon the domain of an evil, powerful wizard. A fight to the death ensues.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=96
|
||||
CardReward=6 random rares
|
||||
CreditsReward=500
|
||||
Icon=Private Domain.jpg
|
||||
AILife=50
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
2 Underground Sea
|
||||
2 Plateau
|
||||
@@ -29,3 +40,11 @@ constructed
|
||||
1 Mountain
|
||||
2 Wandering Stream
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Strip Mine
|
||||
[ai_extra_cards]
|
||||
Plains
|
||||
Island
|
||||
Mountain
|
||||
Swamp
|
||||
Forest
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
quest22
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=22
|
||||
Name=quest22
|
||||
DisplayName=The Pied Piper
|
||||
Difficulty=Hard
|
||||
Description=A mysterious man threatens to flood the land with a relentless stream of hungry rats. Cross his plan before it's too late.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=32
|
||||
CardReward=3 random rares
|
||||
CreditsReward=150
|
||||
Icon=The Pied Piper.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
6 Swamp
|
||||
4 Underground Sea
|
||||
@@ -12,3 +23,11 @@ constructed
|
||||
4 Thrumming Stone
|
||||
29 Relentless Rats
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
1 Volunteer Militia
|
||||
1 Land Tax
|
||||
1 Elvish Farmer
|
||||
1 An-Havva Township
|
||||
[ai_extra_cards]
|
||||
1 Darksteel Citadel
|
||||
1 Relentless Rats
|
||||
@@ -1,6 +1,17 @@
|
||||
quest3
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=3
|
||||
Name=quest3
|
||||
DisplayName=Dungeon Crawling (Black)
|
||||
Difficulty=Medium
|
||||
Description=Guarded by black creatures.
|
||||
Repeatable=true
|
||||
NumberWinsRequired=20
|
||||
CardReward=3 black rares
|
||||
CreditsReward=100
|
||||
Icon=Dungeon Crawling Black.jpg
|
||||
AILife=25
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
20 Swamp
|
||||
4 Charcoal Diamond
|
||||
@@ -27,3 +38,6 @@ constructed
|
||||
1 Beacon of Unrest
|
||||
1 Zombify
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
[ai_extra_cards]
|
||||
Infernal Genesis
|
||||
@@ -1,6 +1,17 @@
|
||||
quest4
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=4
|
||||
Name=quest4
|
||||
DisplayName=Dungeon Crawling (Red)
|
||||
Difficulty=Medium
|
||||
Description=Guarded by red creatures.
|
||||
Repeatable=true
|
||||
NumberWinsRequired=20
|
||||
CardReward=3 red rares
|
||||
CreditsReward=100
|
||||
Icon=Dungeon Crawling Red.jpg
|
||||
AILife=25
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
49 Mountain
|
||||
1 Fury Sliver
|
||||
@@ -85,3 +96,6 @@ constructed
|
||||
1 Tarfire
|
||||
1 Volcanic Hammer
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
[ai_extra_cards]
|
||||
Furnace of Rath
|
||||
@@ -1,6 +1,17 @@
|
||||
quest5
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=5
|
||||
Name=quest5
|
||||
DisplayName=Dungeon Crawling (Green)
|
||||
Difficulty=Medium
|
||||
Description=Guarded by green creatures.
|
||||
Repeatable=true
|
||||
NumberWinsRequired=20
|
||||
CardReward=3 green rares
|
||||
CreditsReward=100
|
||||
Icon=Dungeon Crawling Green.jpg
|
||||
AILife=25
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
33 Forest
|
||||
1 Alpha Tyrranax
|
||||
@@ -65,3 +76,8 @@ constructed
|
||||
1 Woodfall Primus
|
||||
1 Yavimaya Wurm
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Defense of the Heart
|
||||
[ai_extra_cards]
|
||||
Eladamri's Vineyard
|
||||
Upwelling
|
||||
@@ -1,6 +1,17 @@
|
||||
quest6
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=6
|
||||
Name=quest6
|
||||
DisplayName=Dungeon Crawling (Colorless)
|
||||
Difficulty=Hard
|
||||
Description=The inhabitants of this plane tread with a light step.
|
||||
Repeatable=true
|
||||
NumberWinsRequired=28
|
||||
CardReward=3 colorless rares
|
||||
CreditsReward=150
|
||||
Icon=Dungeon Crawling Colorless.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
20 Island
|
||||
20 Swamp
|
||||
@@ -74,3 +85,6 @@ constructed
|
||||
1 Whipstitched Zombie
|
||||
1 Yawgmoth Demon
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
[ai_extra_cards]
|
||||
3 Eon Hub
|
||||
@@ -1,6 +1,17 @@
|
||||
quest7
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=7
|
||||
Name=quest7
|
||||
DisplayName=Dungeon Crawling (Gold)
|
||||
Difficulty=Hard
|
||||
Description=Guarded by gold creatures.
|
||||
Repeatable=true
|
||||
NumberWinsRequired=28
|
||||
CardReward=3 multi-colored rares
|
||||
CreditsReward=150
|
||||
Icon=Dungeon Crawling Gold.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
4 Glimmervoid
|
||||
4 Reflecting Pool
|
||||
@@ -37,3 +48,6 @@ constructed
|
||||
1 Conflux
|
||||
1 Maelstrom Nexus
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
[ai_extra_cards]
|
||||
Darksteel Ingot
|
||||
@@ -1,6 +1,17 @@
|
||||
quest8
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=8
|
||||
Name=quest8
|
||||
DisplayName=A Wolf in Sheep's Clothing
|
||||
Difficulty=Medium
|
||||
Description=The local sheep farm is under attack by a pack of wolves. Kill the wolves, save the sheep!
|
||||
Repeatable=false
|
||||
NumberWinsRequired=28
|
||||
CardReward=3 random rares
|
||||
CreditsReward=200
|
||||
Icon=A Wolf in Sheeps Clothing.jpg
|
||||
AILife=25
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
1 Temple Garden
|
||||
1 Mox Emerald
|
||||
@@ -20,3 +31,8 @@ constructed
|
||||
4 Tundra Wolves
|
||||
4 Savannah
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
TOKEN|G|0|1|sheep|creature|sheep
|
||||
TOKEN|G|0|1|sheep|creature|sheep
|
||||
TOKEN|G|0|1|sheep|creature|sheep
|
||||
[ai_extra_cards]
|
||||
@@ -1,6 +1,17 @@
|
||||
quest9
|
||||
[general]
|
||||
constructed
|
||||
[metadata]
|
||||
ID=9
|
||||
Name=quest9
|
||||
DisplayName=Bushwhacked!
|
||||
Difficulty=Hard
|
||||
Description=You find yourself surrounded by carnivorous plants and poisonous vines. Cut your way out of this foresty mess and make it home safe.
|
||||
Repeatable=false
|
||||
NumberWinsRequired=40
|
||||
CardReward=4 green rares
|
||||
CreditsReward=225
|
||||
Icon=Bushwhacked.jpg
|
||||
AILife=30
|
||||
Deck Type=constructed
|
||||
Comment=
|
||||
[main]
|
||||
2 Avenger of Zendikar
|
||||
1 Sapling of Colfenor
|
||||
@@ -21,3 +32,7 @@ constructed
|
||||
4 Vine Trellis
|
||||
1 Overbeing of Myth
|
||||
[sideboard]
|
||||
[human_extra_cards]
|
||||
Trusty Machete
|
||||
[ai_extra_cards]
|
||||
3 Wall of Wood
|
||||
@@ -17,6 +17,7 @@ import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestMatchState;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.DeckSingleQuest;
|
||||
|
||||
/**
|
||||
* Please use public getters and setters instead of direct field access.
|
||||
@@ -41,8 +42,8 @@ public final class AllZone implements NewConstants {
|
||||
/** Global <code>questData</code>. */
|
||||
private static forge.quest.data.QuestData questData = null;
|
||||
|
||||
/** Global <code>QuestAssignment</code>. */
|
||||
private static Quest_Assignment questAssignment = null;
|
||||
/** Global <code>currentQuest</code>. */
|
||||
private static forge.quest.data.DeckSingleQuest currentQuest = null;
|
||||
|
||||
/** Constant <code>NAME_CHANGER</code>. */
|
||||
private static final NameChanger NAME_CHANGER = new NameChanger();
|
||||
@@ -131,23 +132,23 @@ public final class AllZone implements NewConstants {
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getQuestAssignment.</p>
|
||||
* <p>getCurrentQuest.</p>
|
||||
*
|
||||
* @return a {@link forge.quest.data.QuestData} object.
|
||||
*
|
||||
* @return a {@link forge.Quest_Assignment} object.
|
||||
* @since 1.0.15
|
||||
*/
|
||||
public static Quest_Assignment getQuestAssignment() {
|
||||
return questAssignment;
|
||||
public static forge.quest.data.DeckSingleQuest getCurrentQuest() {
|
||||
return currentQuest;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>setQuestAssignment.</p>
|
||||
* <p>setCurrentQuest.</p>
|
||||
*
|
||||
* @param a DeckSingleQuest object.
|
||||
*
|
||||
* @param assignment a {@link forge.Quest_Assignment} object.
|
||||
* @since 1.0.15
|
||||
*/
|
||||
public static void setQuestAssignment(final Quest_Assignment assignment) {
|
||||
questAssignment = assignment;
|
||||
public static void setCurrentQuest(final DeckSingleQuest qq) {
|
||||
currentQuest = qq;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
43
src/main/java/forge/gui/SelectablePanel.java
Normal file
43
src/main/java/forge/gui/SelectablePanel.java
Normal file
@@ -0,0 +1,43 @@
|
||||
package forge.gui;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
|
||||
/**
|
||||
* <p>SelectablePanel</p>
|
||||
* VIEW - Standard selectable JPanel used for many places in the GUI.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public abstract class SelectablePanel extends JPanel {
|
||||
|
||||
private boolean selected = false;
|
||||
protected Color backgroundColor = this.getBackground();
|
||||
|
||||
/**
|
||||
* <p>Getter for the field <code>selected</code></p>
|
||||
*
|
||||
* @return boolean.
|
||||
*/
|
||||
public boolean getSelected() {
|
||||
return selected;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Setter for the field <code>selected</code></p>
|
||||
* Sets selected field and visual effect.
|
||||
*
|
||||
* @param boolean.
|
||||
*/
|
||||
public void setSelected(boolean selected) {
|
||||
if (selected) {
|
||||
this.setBackground(backgroundColor.darker());
|
||||
} else {
|
||||
this.setBackground(backgroundColor);
|
||||
}
|
||||
|
||||
this.selected = selected;
|
||||
}
|
||||
}
|
||||
116
src/main/java/forge/quest/data/DeckSingleBattle.java
Normal file
116
src/main/java/forge/quest/data/DeckSingleBattle.java
Normal file
@@ -0,0 +1,116 @@
|
||||
package forge.quest.data;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import forge.deck.Deck;
|
||||
import forge.gui.GuiUtils;
|
||||
|
||||
/**
|
||||
* <p>DeckSingleBattle</p>
|
||||
* MODEL - Assembles and stores information from a battle deck.
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class DeckSingleBattle {
|
||||
private String deckName;
|
||||
private String displayName;
|
||||
private String diff;
|
||||
private String desc;
|
||||
private String iconFilename;
|
||||
private ImageIcon icon;
|
||||
private Deck deckObj;
|
||||
|
||||
/**
|
||||
* <p>Constructor for DeckSingleBattle.</p>
|
||||
*
|
||||
* @param {@link java.lang.String} storing name of AI deck for this battle
|
||||
*/
|
||||
public DeckSingleBattle(Deck d) {
|
||||
// Get deck object and properties for this opponent.
|
||||
this.deckObj = d;
|
||||
this.deckName = d.getName();
|
||||
this.displayName = deckObj.getMetadata("DisplayName");
|
||||
this.diff = deckObj.getMetadata("Difficulty");
|
||||
this.desc = deckObj.getMetadata("Description");
|
||||
this.iconFilename = deckObj.getMetadata("Icon");
|
||||
|
||||
// Default icon
|
||||
this.icon = GuiUtils.getIconFromFile(displayName + ".jpg");
|
||||
|
||||
// If non-default icon defined, use it. Any filetype accepted.
|
||||
if(!iconFilename.equals("")) {
|
||||
this.icon = GuiUtils.getIconFromFile(iconFilename);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDifficulty()</p>
|
||||
* Retrieve rated difficulty of this battle deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDifficulty() {
|
||||
return this.diff;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDescription()</p>
|
||||
* Retrieve description of this battle deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDescription() {
|
||||
return this.desc;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDisplayName()</p>
|
||||
* Retrieve display name of this battle deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDisplayName() {
|
||||
return this.displayName;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDeckName()</p>
|
||||
* Retrieve file name of this battle deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDeckName() {
|
||||
return this.deckName;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getIconFilename()</p>
|
||||
* Retrieve file name of preferred icon
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getIconFilename() {
|
||||
return this.iconFilename;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDeck()</p>
|
||||
* Retrieve this battle deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public Deck getDeck() {
|
||||
return this.deckObj;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getIcon()</p>
|
||||
* Retrieve the icon used with this battle deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public ImageIcon getIcon() {
|
||||
return this.icon;
|
||||
}
|
||||
|
||||
}
|
||||
270
src/main/java/forge/quest/data/DeckSingleQuest.java
Normal file
270
src/main/java/forge/quest/data/DeckSingleQuest.java
Normal file
@@ -0,0 +1,270 @@
|
||||
package forge.quest.data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import javax.swing.ImageIcon;
|
||||
|
||||
import com.google.code.jyield.Generator;
|
||||
import com.google.code.jyield.YieldUtils;
|
||||
|
||||
import forge.AllZone;
|
||||
import forge.Card;
|
||||
import forge.Constant;
|
||||
import forge.deck.Deck;
|
||||
import forge.gui.GuiUtils;
|
||||
|
||||
/**
|
||||
* <p>DeckSingleQuest</p>
|
||||
* MODEL - Assembles and stores information from a quest deck.
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class DeckSingleQuest {
|
||||
private String deckName;
|
||||
private String displayName;
|
||||
private String diff;
|
||||
private String desc;
|
||||
private String iconFilename;
|
||||
private String cardReward;
|
||||
|
||||
private int creditsReward;
|
||||
private int numberWinsRequired;
|
||||
private int AILife;
|
||||
private int id;
|
||||
|
||||
private boolean repeatable;
|
||||
private ImageIcon icon;
|
||||
private Deck deckObj;
|
||||
|
||||
/**
|
||||
* <p>Constructor for DeckSingleQuest</p>
|
||||
*
|
||||
* @param {@link java.lang.String} storing name of AI deck for this quest
|
||||
*/
|
||||
public DeckSingleQuest(Deck d) {
|
||||
// Get deck object and properties for this opponent.
|
||||
this.deckObj = d;
|
||||
this.deckName = d.getName();
|
||||
this.id = Integer.parseInt(deckObj.getMetadata("ID"));
|
||||
this.displayName = deckObj.getMetadata("DisplayName");
|
||||
this.diff = deckObj.getMetadata("Difficulty");
|
||||
this.desc = deckObj.getMetadata("Description");
|
||||
this.iconFilename = deckObj.getMetadata("Icon");
|
||||
this.cardReward = deckObj.getMetadata("CardReward");
|
||||
this.creditsReward = Integer.parseInt(deckObj.getMetadata("CreditsReward"));
|
||||
this.numberWinsRequired = Integer.parseInt(deckObj.getMetadata("NumberWinsRequired"));
|
||||
this.AILife = Integer.parseInt(deckObj.getMetadata("AILife"));
|
||||
|
||||
// Default icon
|
||||
this.icon = GuiUtils.getIconFromFile(displayName + ".jpg");
|
||||
|
||||
// If non-default icon defined, use it. Any filetype accepted.
|
||||
if(!iconFilename.equals("")) {
|
||||
this.icon = GuiUtils.getIconFromFile(iconFilename);
|
||||
}
|
||||
|
||||
// Repeatability test
|
||||
if(deckObj.getMetadata("Repeatable").equals("true")) {
|
||||
this.repeatable = true;
|
||||
}
|
||||
else {
|
||||
this.repeatable = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getID()</p>
|
||||
* Retrieve ID number of this quest deck for recordkeeping.
|
||||
*
|
||||
* @return {@link java.lang.int}
|
||||
*/
|
||||
public int getID() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDifficulty()</p>
|
||||
* Retrieve rated difficulty of this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDifficulty() {
|
||||
return this.diff;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDescription()</p>
|
||||
* Retrieve description of this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDescription() {
|
||||
return this.desc;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDisplayName()</p>
|
||||
* Retrieve display name of this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDisplayName() {
|
||||
return this.displayName;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDeckName()</p>
|
||||
* Retrieve file name of this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getDeckName() {
|
||||
return this.deckName;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getCardReward()</p>
|
||||
* Retrieve cards rewarded after a win with this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
private String getCardReward() {
|
||||
return this.cardReward;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getCardRewardList()</p>
|
||||
* Retrieve cards rewarded after a win with this quest deck.
|
||||
*
|
||||
* @return String[]
|
||||
*/
|
||||
public ArrayList<String> getCardRewardList() {
|
||||
ArrayList<String> cardRewardList = new ArrayList<String>();
|
||||
|
||||
String[] details = this.getCardReward().split(" ");
|
||||
|
||||
// Set quantity, color and rarity from file meta.
|
||||
String cardscolor;
|
||||
Constant.Rarity rarity;
|
||||
int quantity = Integer.parseInt(details[0]);
|
||||
|
||||
// Color
|
||||
if(details[1].toLowerCase().equals("random")) {
|
||||
cardscolor = null;
|
||||
}
|
||||
else if(details[1].toLowerCase().equals("blue")) {
|
||||
cardscolor = Constant.Color.Blue;
|
||||
}
|
||||
else if(details[1].toLowerCase().equals("black")) {
|
||||
cardscolor = Constant.Color.Black;
|
||||
}
|
||||
else if(details[1].toLowerCase().equals("green")) {
|
||||
cardscolor = Constant.Color.Green;
|
||||
}
|
||||
else if(details[1].toLowerCase().equals("red")) {
|
||||
cardscolor = Constant.Color.Red;
|
||||
}
|
||||
else if(details[1].toLowerCase().equals("white")) {
|
||||
cardscolor = Constant.Color.White;
|
||||
}
|
||||
else if(details[1].toLowerCase().equals("multi-color") ||
|
||||
details[1].toLowerCase().equals("multi-colored")) {
|
||||
cardscolor = "Multicolor";
|
||||
}
|
||||
else if(details[1].toLowerCase().equals("colorless")) {
|
||||
cardscolor = Constant.Color.Colorless;
|
||||
}
|
||||
else {
|
||||
cardscolor = null;
|
||||
System.err.println("DeckSingleQuest > getCardRewardList() reports "+
|
||||
"a badly formed card reward for quest "+
|
||||
this.getID()+".\n The color "+details[1]+" is not permitted.\n"+
|
||||
"Random colors have been substituted.");
|
||||
}
|
||||
|
||||
// Rarity
|
||||
if(details[2].toLowerCase().equals("rares")) {
|
||||
rarity = Constant.Rarity.Rare;
|
||||
}
|
||||
else {
|
||||
rarity = Constant.Rarity.Common;
|
||||
}
|
||||
|
||||
// Generate deck list.
|
||||
QuestBoosterPack pack = new QuestBoosterPack();
|
||||
pack.generateCards(quantity, rarity, cardscolor);
|
||||
|
||||
return cardRewardList;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getNumberWinsRequired()</p>
|
||||
* Retrieve number of wins required to play against this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.int}
|
||||
*/
|
||||
public int getNumberWinsRequired() {
|
||||
return this.numberWinsRequired;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getAILife()</p>
|
||||
* Retrieve starting value of life for the AI playing this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.int}
|
||||
*/
|
||||
public int getAILife() {
|
||||
return this.AILife;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getCreditsReward()</p>
|
||||
* Retrieve number of credits rewarded after a win against this quest deck.
|
||||
*
|
||||
* @return {@link java.lang.int}
|
||||
*/
|
||||
public int getCreditsReward() {
|
||||
return this.creditsReward;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDeck()</p>
|
||||
* Retrieve this quest deck.
|
||||
*
|
||||
* @return {@link forge.deck.Deck}
|
||||
*/
|
||||
public Deck getDeck() {
|
||||
return this.deckObj;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getIconFilename()</p>
|
||||
* Retrieve file name of preferred icon
|
||||
*
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public String getIconFilename() {
|
||||
return this.iconFilename;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getIcon()</p>
|
||||
* Retrieve the icon used with this quest deck.
|
||||
*
|
||||
* @return {@link javax.swing.ImageIcon}
|
||||
*/
|
||||
public ImageIcon getIcon() {
|
||||
return this.icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getRepeatable.</p>
|
||||
* Retrieve boolean indicating if this quest is repeatable.
|
||||
*
|
||||
*/
|
||||
public boolean getRepeatable() {
|
||||
return this.repeatable;
|
||||
}
|
||||
|
||||
}
|
||||
237
src/main/java/forge/quest/data/ManagerBattle.java
Normal file
237
src/main/java/forge/quest/data/ManagerBattle.java
Normal file
@@ -0,0 +1,237 @@
|
||||
package forge.quest.data;
|
||||
|
||||
import forge.AllZone;
|
||||
import forge.FileUtil;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckManager;
|
||||
import forge.error.ErrorViewer;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* <p>QuestBattleManager</p>
|
||||
* MODEL - Provides static methods to accomplish two key tasks:
|
||||
* 1. Stores various AI difficulty decks and generates opponent list based on quest record.
|
||||
*
|
||||
* 2. Can instantiate a DeckSingleBattle for each opponent in the list.
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
// This could be combined with BattleManager and moved into QuestUtil.
|
||||
public class ManagerBattle {
|
||||
/** Constant <code>aiDecks</code> */
|
||||
private static transient Map<String, Deck> aiDecks = new HashMap<String, Deck>();
|
||||
/** Constant <code>easyAIDecks</code> */
|
||||
private static transient List<String> easyAIDecks;
|
||||
/** Constant <code>mediumAIDecks</code> */
|
||||
private static transient List<String> mediumAIDecks;
|
||||
/** Constant <code>hardAIDecks</code> */
|
||||
private static transient List<String> hardAIDecks;
|
||||
/** Constant <code>veryHardAIDecks</code> */
|
||||
private static transient List<String> veryHardAIDecks;
|
||||
|
||||
static {
|
||||
List<String> aiDeckNames = getAIDeckNames();
|
||||
easyAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.EASY), aiDeckNames);
|
||||
mediumAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.MEDIUM), aiDeckNames);
|
||||
hardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.HARD), aiDeckNames);
|
||||
veryHardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.VERYHARD), aiDeckNames);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>removeAIDeck.</p>
|
||||
* Removes a deck object stored in the
|
||||
*{@link forge.quest.gui.main.aiDecks} map.
|
||||
*
|
||||
* @param deckName a {@link java.lang.String} object.
|
||||
*/
|
||||
public static void removeAIDeck(String deckName) {
|
||||
aiDecks.remove(deckName);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>addAIDeck.</p>
|
||||
* Adds a deck object stored in the
|
||||
*{@link forge.quest.gui.main.aiDecks} map.
|
||||
*
|
||||
* @param d a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
public static void addAIDeck(Deck d) {
|
||||
aiDecks.put(d.getName(), d);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getAIDeckFromMap.</p>
|
||||
* Returns a deck object stored in the
|
||||
*{@link forge.quest.gui.main.aiDecks} map.
|
||||
*
|
||||
* @param deckName a {@link java.lang.String} object.
|
||||
* @return a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
public static Deck getAIDeckFromMap(String deckName) {
|
||||
if (!aiDecks.containsKey(deckName)) {
|
||||
ErrorViewer.showError(new Exception(),
|
||||
"QuestData : getAIDeckFromMap(String deckName) error, deck name not found - %s", deckName);
|
||||
}
|
||||
|
||||
return aiDecks.get(deckName);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getAIDeckNames.</p>
|
||||
* Returns a list of decks stored in the
|
||||
* {@link forge.quest.gui.main.aiDecks} map.
|
||||
*
|
||||
* @return a {@link java.util.List} object.
|
||||
*/
|
||||
public static List<String> getAIDeckNames() {
|
||||
return new ArrayList<String>(aiDecks.keySet());
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getDeckFromFile.</p>
|
||||
* Returns a deck object built from a file name.
|
||||
* Req'd because NewConstants.QUEST.DECKS must be used.
|
||||
*
|
||||
* @param deckName a {@link java.lang.String} object.
|
||||
* @return a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
public static Deck getAIDeckFromFile(String deckName) {
|
||||
final File file = ForgeProps.getFile(NewConstants.QUEST.DECKS);
|
||||
final DeckManager manager = new DeckManager(file);
|
||||
return manager.getDeck(deckName);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getOpponent.</p>
|
||||
*
|
||||
* Poorly named; AllZoneUtil already has a method called getOpponents.
|
||||
* ????? Mechanics of this still a mystery ?????
|
||||
*
|
||||
* @param aiDeck a {@link java.util.List} object.
|
||||
* @param number a int.
|
||||
* @return a {@link java.lang.String} object.
|
||||
*/
|
||||
public static String getOpponent(List<String> aiDeck, int number) {
|
||||
//This is to make sure that the opponents do not change when the deck editor is launched.
|
||||
List<String> deckListCopy = new ArrayList<String>(aiDeck);
|
||||
Collections.shuffle(deckListCopy, new Random(AllZone.getQuestData().getRandomSeed()));
|
||||
|
||||
return deckListCopy.get(number);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>generateBattles.</p>
|
||||
* Generates an array of new opponents based on current win conditions.
|
||||
*
|
||||
* @return an array of {@link java.lang.String} objects.
|
||||
*/
|
||||
public static String[] generateBattles() {
|
||||
int index = AllZone.getQuestData().getDifficultyIndex();
|
||||
|
||||
if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForMediumAI(index)) {
|
||||
return new String[]{
|
||||
getOpponent(easyAIDecks, 0),
|
||||
getOpponent(easyAIDecks, 1),
|
||||
getOpponent(easyAIDecks, 2)};
|
||||
}
|
||||
|
||||
if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForMediumAI(index)) {
|
||||
return new String[]{
|
||||
getOpponent(easyAIDecks, 0),
|
||||
getOpponent(mediumAIDecks, 0),
|
||||
getOpponent(mediumAIDecks, 1)};
|
||||
}
|
||||
|
||||
if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForHardAI(index)) {
|
||||
return new String[]{
|
||||
getOpponent(mediumAIDecks, 0),
|
||||
getOpponent(mediumAIDecks, 1),
|
||||
getOpponent(mediumAIDecks, 2)};
|
||||
}
|
||||
|
||||
if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForHardAI(index)) {
|
||||
return new String[]{
|
||||
getOpponent(mediumAIDecks, 0),
|
||||
getOpponent(hardAIDecks, 0),
|
||||
getOpponent(hardAIDecks, 1)};
|
||||
}
|
||||
|
||||
if (AllZone.getQuestData().getWin() >= QuestPreferences.getWinsForVeryHardAI(index)) {
|
||||
return new String[]{
|
||||
getOpponent(hardAIDecks, 0),
|
||||
getOpponent(hardAIDecks, 1),
|
||||
getOpponent(veryHardAIDecks, 0)};
|
||||
}
|
||||
|
||||
return new String[]{
|
||||
getOpponent(hardAIDecks, 0),
|
||||
getOpponent(hardAIDecks, 1),
|
||||
getOpponent(hardAIDecks, 2)};
|
||||
} // End generateBattles()
|
||||
|
||||
/**
|
||||
* <p>readFile.</p>
|
||||
* A reader util for accessing the AI deck list text files.
|
||||
*
|
||||
* @param file a {@link java.io.File} object.
|
||||
* @param aiDecks a {@link java.util.List} object.
|
||||
* @return a {@link java.util.List} object.
|
||||
*/
|
||||
private static List<String> readFile(File file, List<String> aiDecks) {
|
||||
ArrayList<String> list = FileUtil.readFile(file);
|
||||
|
||||
//remove any blank lines
|
||||
ArrayList<String> noBlankLines = new ArrayList<String>();
|
||||
String s;
|
||||
for (String aList : list) {
|
||||
s = aList.trim();
|
||||
if (!s.equals("")) {
|
||||
noBlankLines.add(s);
|
||||
}
|
||||
}
|
||||
list = noBlankLines;
|
||||
|
||||
if (list.size() < 3) {
|
||||
ErrorViewer.showError(new Exception(),
|
||||
"QuestData : readFile() error, file %s is too short, it must contain at least 3 ai deck names",
|
||||
file);
|
||||
}
|
||||
|
||||
for (String aList : list) {
|
||||
if (!aiDecks.contains(aList)) {
|
||||
aiDecks.add(aList);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getBattles.</p>
|
||||
*
|
||||
* Returns list of DeckSingleBattle objects storing data
|
||||
* of the battles currently available.
|
||||
*
|
||||
* @return a {@link java.util.List} object.
|
||||
*/
|
||||
public static List<DeckSingleBattle> getBattles() {
|
||||
List<DeckSingleBattle> battlesAvailable = new ArrayList<DeckSingleBattle>();
|
||||
|
||||
String[] oppDecks = ManagerBattle.generateBattles();
|
||||
|
||||
for (String oppDeckName : oppDecks) {
|
||||
battlesAvailable.add(new DeckSingleBattle(getAIDeckFromFile(oppDeckName)));
|
||||
}
|
||||
|
||||
return battlesAvailable;
|
||||
}
|
||||
|
||||
}
|
||||
104
src/main/java/forge/quest/data/ManagerQuest.java
Normal file
104
src/main/java/forge/quest/data/ManagerQuest.java
Normal file
@@ -0,0 +1,104 @@
|
||||
package forge.quest.data;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import forge.AllZone;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckManager;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
|
||||
|
||||
/**
|
||||
* <p>ManagerQuest</p>
|
||||
* MODEL - Provides static methods to work with quest-related tasks.
|
||||
*
|
||||
*/
|
||||
|
||||
// This could be combined with BattleManager and moved into QuestUtil?
|
||||
public class ManagerQuest {
|
||||
/**
|
||||
* <p>getQuests</p>
|
||||
*
|
||||
* Returns list of DeckSingleQuest objects storing data
|
||||
* of the quests currently available.
|
||||
*
|
||||
* @return a {@link java.util.List} object.
|
||||
*/
|
||||
|
||||
public static List<DeckSingleQuest> getQuests() {
|
||||
QuestData questData = AllZone.getQuestData();
|
||||
|
||||
List<Integer> idsCompleted = questData.getCompletedQuests();
|
||||
List<Integer> idsAvailable = new ArrayList<Integer>();
|
||||
List<DeckSingleQuest> allQuests = new ArrayList<DeckSingleQuest>();
|
||||
List<DeckSingleQuest> questsAvailable = new ArrayList<DeckSingleQuest>();
|
||||
|
||||
// Generate DeckSingleQuest objects for available quest IDs.
|
||||
// If there are quests IDs available, use them.
|
||||
if (questData.getAvailableQuests() != null && questData.getAvailableQuests().size() > 0) {
|
||||
idsAvailable = questData.getAvailableQuests();
|
||||
for (int id : idsAvailable) {
|
||||
questsAvailable.add(new DeckSingleQuest(getAIDeckFromFile("quest"+id)));
|
||||
}
|
||||
}
|
||||
// Otherwise, re-generate list.
|
||||
// To do this, each quest file must be opened and metadata examined.
|
||||
// DeckSingleQuest objects are grabbed directly from opened list.
|
||||
else {
|
||||
File[] files = ForgeProps.getFile(NewConstants.QUEST.DECKS).listFiles();
|
||||
|
||||
for(File f : files) {
|
||||
if(!f.isDirectory() && f.getName().substring(0,5).equals("quest")) {
|
||||
DeckSingleQuest temp = new DeckSingleQuest(getAIDeckFromFile(
|
||||
f.getName().substring(0, f.getName().lastIndexOf('.'))));
|
||||
|
||||
idsAvailable.add(temp.getID());
|
||||
if (temp.getNumberWinsRequired() <= questData.getWin() &&
|
||||
!idsCompleted.contains(temp.getID())) {
|
||||
allQuests.add(temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Limit available IDs.
|
||||
int maxQuests = questData.getWin() / 10;
|
||||
if (maxQuests > 5) {
|
||||
maxQuests = 5;
|
||||
}
|
||||
if (idsAvailable.size() < maxQuests) {
|
||||
maxQuests = idsAvailable.size();
|
||||
}
|
||||
|
||||
Collections.shuffle(idsAvailable);
|
||||
idsAvailable = idsAvailable.subList(0,maxQuests);
|
||||
|
||||
questData.setAvailableQuests(idsAvailable);
|
||||
questData.saveData();
|
||||
|
||||
for (int id : idsAvailable) {
|
||||
questsAvailable.add(allQuests.get(id));
|
||||
}
|
||||
}
|
||||
|
||||
return questsAvailable;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>getDeckFromFile.</p>
|
||||
* Returns a deck object built from a file name.
|
||||
* Req'd because NewConstants.QUEST.DECKS must be used.
|
||||
*
|
||||
* @param deckName a {@link java.lang.String} object.
|
||||
* @return a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
public static Deck getAIDeckFromFile(String deckName) {
|
||||
final File file = ForgeProps.getFile(NewConstants.QUEST.DECKS);
|
||||
final DeckManager manager = new DeckManager(file);
|
||||
return manager.getDeck(deckName);
|
||||
}
|
||||
}
|
||||
100
src/main/java/forge/quest/gui/PanelSingleBattle.java
Normal file
100
src/main/java/forge/quest/gui/PanelSingleBattle.java
Normal file
@@ -0,0 +1,100 @@
|
||||
package forge.quest.gui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.border.CompoundBorder;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.border.LineBorder;
|
||||
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.SelectablePanel;
|
||||
import forge.quest.data.DeckSingleBattle;
|
||||
|
||||
/**
|
||||
* <p>PanelSingleBattle</p>
|
||||
* VIEW - A selectable panel for battles available in Quest mode.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class PanelSingleBattle extends SelectablePanel {
|
||||
|
||||
private final DeckSingleBattle battle;
|
||||
|
||||
public PanelSingleBattle(DeckSingleBattle b) {
|
||||
battle = b;
|
||||
final JPanel centerPanel = new JPanel();
|
||||
|
||||
this.setLayout(new BorderLayout(5, 5));
|
||||
|
||||
// Icon stuff
|
||||
JLabel iconLabel;
|
||||
|
||||
if (battle.getIcon() == null) {
|
||||
iconLabel = new JLabel(GuiUtils.getEmptyIcon(40, 40));
|
||||
} else {
|
||||
iconLabel = new JLabel(GuiUtils.getResizedIcon(battle.getIcon(), 40, 40));
|
||||
}
|
||||
|
||||
iconLabel.setBorder(new LineBorder(Color.BLACK));
|
||||
iconLabel.setAlignmentY(TOP_ALIGNMENT);
|
||||
|
||||
JPanel iconPanel = new JPanel(new BorderLayout());
|
||||
iconPanel.setOpaque(false);
|
||||
iconPanel.add(iconLabel, BorderLayout.NORTH);
|
||||
this.add(iconPanel, BorderLayout.WEST);
|
||||
|
||||
centerPanel.setOpaque(false);
|
||||
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS));
|
||||
this.add(centerPanel, BorderLayout.CENTER);
|
||||
|
||||
JPanel centerTopPanel = new JPanel();
|
||||
centerTopPanel.setOpaque(false);
|
||||
centerTopPanel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
centerTopPanel.setLayout(new BoxLayout(centerTopPanel, BoxLayout.X_AXIS));
|
||||
|
||||
JLabel nameLabel = new JLabel(battle.getDisplayName());
|
||||
GuiUtils.setFontSize(nameLabel, 20);
|
||||
nameLabel.setAlignmentY(BOTTOM_ALIGNMENT);
|
||||
centerTopPanel.add(nameLabel);
|
||||
|
||||
GuiUtils.addExpandingHorizontalSpace(centerTopPanel);
|
||||
|
||||
JLabel difficultyLabel = new JLabel(battle.getDifficulty());
|
||||
difficultyLabel.setAlignmentY(BOTTOM_ALIGNMENT);
|
||||
centerTopPanel.add(difficultyLabel);
|
||||
centerPanel.add(centerTopPanel);
|
||||
|
||||
GuiUtils.addGap(centerPanel);
|
||||
|
||||
JLabel descriptionLabel = new JLabel(battle.getDescription());
|
||||
descriptionLabel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
centerPanel.add(descriptionLabel);
|
||||
|
||||
this.setMaximumSize(new Dimension(Integer.MAX_VALUE, 80));
|
||||
this.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(5, 5, 5, 5)));
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getIconFilename()</p>
|
||||
* Retrieves filename of icon used in this panel's display.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getIconFilename() {
|
||||
return this.battle.getIconFilename();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getQuest()</p>
|
||||
*
|
||||
* @return the DeckSingleBattle model associated with this panel.
|
||||
*/
|
||||
public DeckSingleBattle getBattle() {
|
||||
return this.battle;
|
||||
}
|
||||
}
|
||||
110
src/main/java/forge/quest/gui/PanelSingleQuest.java
Normal file
110
src/main/java/forge/quest/gui/PanelSingleQuest.java
Normal file
@@ -0,0 +1,110 @@
|
||||
package forge.quest.gui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.border.CompoundBorder;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.border.LineBorder;
|
||||
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.SelectablePanel;
|
||||
import forge.quest.data.DeckSingleQuest;
|
||||
|
||||
/**
|
||||
* <p>PanelSingleQuest</p>
|
||||
* VIEW - A selectable panel for quests available in Quest mode.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class PanelSingleQuest extends SelectablePanel {
|
||||
|
||||
private final DeckSingleQuest quest;
|
||||
|
||||
public PanelSingleQuest(DeckSingleQuest q) {
|
||||
quest = q;
|
||||
final JPanel centerPanel = new JPanel();
|
||||
|
||||
this.setLayout(new BorderLayout(5, 5));
|
||||
|
||||
JLabel iconLabel;
|
||||
|
||||
if (quest.getIcon() == null) {
|
||||
iconLabel = new JLabel(GuiUtils.getEmptyIcon(40, 40));
|
||||
} else {
|
||||
iconLabel = new JLabel(GuiUtils.getResizedIcon(quest.getIcon(), 40, 40));
|
||||
}
|
||||
|
||||
iconLabel.setBorder(new LineBorder(Color.BLACK));
|
||||
iconLabel.setAlignmentY(TOP_ALIGNMENT);
|
||||
|
||||
JPanel iconPanel = new JPanel(new BorderLayout());
|
||||
iconPanel.setOpaque(false);
|
||||
iconPanel.add(iconLabel, BorderLayout.NORTH);
|
||||
this.add(iconPanel, BorderLayout.WEST);
|
||||
|
||||
centerPanel.setOpaque(false);
|
||||
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS));
|
||||
this.add(centerPanel, BorderLayout.CENTER);
|
||||
|
||||
JPanel centerTopPanel = new JPanel();
|
||||
centerTopPanel.setOpaque(false);
|
||||
centerTopPanel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
centerTopPanel.setLayout(new BoxLayout(centerTopPanel, BoxLayout.X_AXIS));
|
||||
|
||||
JLabel nameLabel = new JLabel(quest.getDisplayName());
|
||||
GuiUtils.setFontSize(nameLabel, 20);
|
||||
nameLabel.setAlignmentY(BOTTOM_ALIGNMENT);
|
||||
centerTopPanel.add(nameLabel);
|
||||
|
||||
GuiUtils.addExpandingHorizontalSpace(centerTopPanel);
|
||||
|
||||
JLabel difficultyLabel = new JLabel(quest.getDifficulty());
|
||||
difficultyLabel.setAlignmentY(BOTTOM_ALIGNMENT);
|
||||
centerTopPanel.add(difficultyLabel);
|
||||
centerPanel.add(centerTopPanel);
|
||||
|
||||
GuiUtils.addGap(centerPanel);
|
||||
|
||||
JLabel descriptionLabel = new JLabel(quest.getDescription());
|
||||
descriptionLabel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
centerPanel.add(descriptionLabel);
|
||||
|
||||
// Temporarily removed; no meaning yet (all quests repeat anyway)
|
||||
/*JLabel repeatabilityLabel;
|
||||
if (quest.getRepeatable()) {
|
||||
repeatabilityLabel = new JLabel("This quest is repeatable");
|
||||
} else {
|
||||
repeatabilityLabel = new JLabel("This quest is not repeatable");
|
||||
}
|
||||
|
||||
GuiUtils.addGap(centerPanel);
|
||||
centerPanel.add(repeatabilityLabel);*/
|
||||
|
||||
this.setMaximumSize(new Dimension(Integer.MAX_VALUE, 80));
|
||||
this.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(5, 5, 5, 5)));
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getIconFilename()</p>
|
||||
* Retrieves filename of icon used in this panel's display.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getIconFilename() {
|
||||
return this.quest.getIconFilename();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getQuest()</p>
|
||||
*
|
||||
* @return the DeckSingleQuest model associated with this panel.
|
||||
*/
|
||||
public DeckSingleQuest getQuest() {
|
||||
return this.quest;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package forge.quest.gui;
|
||||
import forge.AllZone;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.quest.gui.bazaar.QuestBazaarPanel;
|
||||
import forge.quest.gui.main.QuestMainPanel;
|
||||
import forge.view.swing.OldGuiNewGame;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
817
src/main/java/forge/quest/gui/QuestMainPanel.java
Normal file
817
src/main/java/forge/quest/gui/QuestMainPanel.java
Normal file
@@ -0,0 +1,817 @@
|
||||
package forge.quest.gui;
|
||||
|
||||
|
||||
import forge.*;
|
||||
import forge.deck.Deck;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.SelectablePanel;
|
||||
import forge.quest.data.DeckSingleBattle;
|
||||
import forge.quest.data.ManagerBattle;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.DeckSingleQuest;
|
||||
import forge.quest.data.ManagerQuest;
|
||||
import forge.quest.data.item.QuestItemZeppelin;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.border.EtchedBorder;
|
||||
import javax.swing.border.TitledBorder;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* <p>QuestMainPanel class.</p>
|
||||
* VIEW - handler for main screen of Quest GUI.
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class QuestMainPanel extends QuestAbstractPanel {
|
||||
/** Constant <code>serialVersionUID=6142934729724012402L</code> */
|
||||
private static final long serialVersionUID = 6142934729724012402L;
|
||||
|
||||
private forge.quest.data.QuestData questData;
|
||||
|
||||
JLabel creditsLabel = new JLabel();
|
||||
JLabel lifeLabel = new JLabel();
|
||||
JLabel statsLabel = new JLabel();
|
||||
JLabel titleLabel = new JLabel();
|
||||
JLabel nextQuestLabel = new JLabel();
|
||||
|
||||
JComboBox petComboBox = new JComboBox();
|
||||
JComboBox deckComboBox = new JComboBox();
|
||||
|
||||
JButton questButton = new JButton("Quests");
|
||||
JButton playButton = new JButton("Play");
|
||||
|
||||
private SelectablePanel lastPanelSelected;
|
||||
|
||||
JPanel nextMatchPanel = new JPanel();
|
||||
CardLayout nextMatchLayout;
|
||||
|
||||
boolean isShowingQuests = false;
|
||||
private JCheckBox devModeCheckBox = new JCheckBox("Developer Mode");
|
||||
//private JCheckBox newGUICheckbox = new JCheckBox("Use new UI", true);
|
||||
private JCheckBox smoothLandCheckBox = new JCheckBox("Adjust AI Land");
|
||||
private JCheckBox petCheckBox = new JCheckBox("Summon Pet");
|
||||
|
||||
private JCheckBox plantBox = new JCheckBox("Summon Plant");
|
||||
/** Constant <code>NO_DECKS_AVAILABLE="No decks available"</code> */
|
||||
private static final String NO_DECKS_AVAILABLE = "No decks available";
|
||||
/** Constant <code>BATTLES="Battles"</code> */
|
||||
private static final String BATTLES = "Battles";
|
||||
/** Constant <code>QUESTS="Quests"</code> */
|
||||
private static final String QUESTS = "Quests";
|
||||
|
||||
//TODO: Make this ordering permanent
|
||||
/** Constant <code>lastUsedDeck="//TODO: Make this ordering permanent"</code> */
|
||||
private static String lastUsedDeck;
|
||||
private JButton zeppelinButton = new JButton("<html>Launch<br>Zeppelin</html>",
|
||||
GuiUtils.getResizedIcon(GuiUtils.getIconFromFile("ZeppelinIcon.png"), 40, 40));
|
||||
private JPanel zeppelinPanel = new JPanel();
|
||||
|
||||
/**
|
||||
* <p>Constructor for QuestMainPanel.</p>
|
||||
*
|
||||
* @param mainFrame a {@link forge.quest.gui.QuestFrame} object.
|
||||
*/
|
||||
public QuestMainPanel(QuestFrame mainFrame) {
|
||||
super(mainFrame);
|
||||
questData = AllZone.getQuestData();
|
||||
|
||||
initUI();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>initUI.</p>
|
||||
*/
|
||||
private void initUI() {
|
||||
refresh();
|
||||
this.setLayout(new BorderLayout(5, 5));
|
||||
JPanel centerPanel = new JPanel(new BorderLayout());
|
||||
this.add(centerPanel, BorderLayout.CENTER);
|
||||
|
||||
JPanel northPanel = createStatusPanel();
|
||||
this.add(northPanel, BorderLayout.NORTH);
|
||||
|
||||
JPanel eastPanel = createSidePanel();
|
||||
this.add(eastPanel, BorderLayout.EAST);
|
||||
|
||||
JPanel matchSettingsPanel = createMatchSettingsPanel();
|
||||
centerPanel.add(matchSettingsPanel, BorderLayout.SOUTH);
|
||||
|
||||
centerPanel.add(nextMatchPanel, BorderLayout.CENTER);
|
||||
this.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>createStatusPanel.</p>
|
||||
*
|
||||
* @return a {@link javax.swing.JPanel} object.
|
||||
*/
|
||||
private JPanel createStatusPanel() {
|
||||
JPanel northPanel = new JPanel();
|
||||
JLabel modeLabel;
|
||||
JLabel difficultyLabel;//Create labels at the top
|
||||
titleLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 28));
|
||||
titleLabel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.Y_AXIS));
|
||||
northPanel.add(titleLabel);
|
||||
|
||||
northPanel.add(Box.createVerticalStrut(5));
|
||||
|
||||
JPanel statusPanel = new JPanel();
|
||||
statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.X_AXIS));
|
||||
statusPanel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
|
||||
modeLabel = new JLabel(questData.getMode());
|
||||
statusPanel.add(modeLabel);
|
||||
statusPanel.add(Box.createHorizontalGlue());
|
||||
|
||||
difficultyLabel = new JLabel(questData.getDifficulty());
|
||||
statusPanel.add(difficultyLabel);
|
||||
statusPanel.add(Box.createHorizontalGlue());
|
||||
|
||||
statusPanel.add(statsLabel);
|
||||
|
||||
northPanel.add(statusPanel);
|
||||
return northPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>createSidePanel.</p>
|
||||
*
|
||||
* @return a {@link javax.swing.JPanel} object.
|
||||
*/
|
||||
private JPanel createSidePanel() {
|
||||
JPanel panel = new JPanel();
|
||||
JPanel optionsPanel; //Create options checkbox list
|
||||
optionsPanel = createOptionsPanel();
|
||||
|
||||
List<Component> eastComponents = new ArrayList<Component>();
|
||||
//Create buttons
|
||||
|
||||
JButton mainMenuButton = new JButton("Return to Main Menu");
|
||||
mainMenuButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
mainFrame.returnToMainMenu();
|
||||
}
|
||||
});
|
||||
eastComponents.add(mainMenuButton);
|
||||
|
||||
JButton cardShopButton = new JButton("Card Shop");
|
||||
cardShopButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
QuestMainPanel.this.showCardShop();
|
||||
}
|
||||
});
|
||||
eastComponents.add(cardShopButton);
|
||||
cardShopButton.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20));
|
||||
|
||||
JButton bazaarButton = null;
|
||||
if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) {
|
||||
|
||||
bazaarButton = new JButton("Bazaar");
|
||||
bazaarButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
QuestMainPanel.this.showBazaar();
|
||||
}
|
||||
});
|
||||
eastComponents.add(bazaarButton);
|
||||
bazaarButton.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20));
|
||||
}
|
||||
|
||||
|
||||
questButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
QuestMainPanel.this.toggleBattleQuest();
|
||||
}
|
||||
});
|
||||
eastComponents.add(questButton);
|
||||
questButton.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 18));
|
||||
questButton.setPreferredSize(new Dimension(0, 60));
|
||||
|
||||
|
||||
playButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
QuestMainPanel.this.launchGame();
|
||||
}
|
||||
});
|
||||
|
||||
playButton.setFont(new Font(Font.DIALOG, Font.BOLD, 28));
|
||||
playButton.setPreferredSize(new Dimension(0, 100));
|
||||
|
||||
|
||||
eastComponents.add(playButton);
|
||||
eastComponents.add(optionsPanel);
|
||||
|
||||
GuiUtils.setWidthToMax(eastComponents);
|
||||
|
||||
panel.add(mainMenuButton);
|
||||
GuiUtils.addGap(panel);
|
||||
panel.add(optionsPanel);
|
||||
panel.add(Box.createVerticalGlue());
|
||||
panel.add(Box.createVerticalGlue());
|
||||
|
||||
if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) {
|
||||
panel.add(this.lifeLabel);
|
||||
this.lifeLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 14));
|
||||
this.lifeLabel.setIcon(GuiUtils.getResizedIcon(GuiUtils.getIconFromFile("Life.png"), 30, 30));
|
||||
}
|
||||
|
||||
GuiUtils.addGap(panel);
|
||||
panel.add(this.creditsLabel);
|
||||
this.creditsLabel.setIcon(GuiUtils.getResizedIcon(GuiUtils.getIconFromFile("CoinStack.png"), 30, 30));
|
||||
this.creditsLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 14));
|
||||
GuiUtils.addGap(panel, 10);
|
||||
panel.add(cardShopButton);
|
||||
|
||||
if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) {
|
||||
GuiUtils.addGap(panel);
|
||||
panel.add(bazaarButton);
|
||||
}
|
||||
|
||||
panel.add(Box.createVerticalGlue());
|
||||
|
||||
panel.add(questButton);
|
||||
this.nextQuestLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 11));
|
||||
panel.add(nextQuestLabel);
|
||||
GuiUtils.addGap(panel);
|
||||
|
||||
panel.add(playButton);
|
||||
|
||||
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>createOptionsPanel.</p>
|
||||
*
|
||||
* @return a {@link javax.swing.JPanel} object.
|
||||
*/
|
||||
private JPanel createOptionsPanel() {
|
||||
JPanel optionsPanel;
|
||||
optionsPanel = new JPanel();
|
||||
optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS));
|
||||
|
||||
//optionsPanel.add(this.newGUICheckbox);
|
||||
optionsPanel.add(Box.createVerticalStrut(5));
|
||||
optionsPanel.add(this.smoothLandCheckBox);
|
||||
optionsPanel.add(Box.createVerticalStrut(5));
|
||||
optionsPanel.add(this.devModeCheckBox);
|
||||
optionsPanel.setBorder(new TitledBorder(new EtchedBorder(), "Options"));
|
||||
return optionsPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>createMatchSettingsPanel.</p>
|
||||
*
|
||||
* @return a {@link javax.swing.JPanel} object.
|
||||
*/
|
||||
private JPanel createMatchSettingsPanel() {
|
||||
|
||||
JPanel matchPanel = new JPanel();
|
||||
matchPanel.setLayout(new BoxLayout(matchPanel, BoxLayout.Y_AXIS));
|
||||
|
||||
JPanel deckPanel = new JPanel();
|
||||
deckPanel.setLayout(new BoxLayout(deckPanel, BoxLayout.X_AXIS));
|
||||
|
||||
JLabel deckLabel = new JLabel("Use Deck");
|
||||
deckPanel.add(deckLabel);
|
||||
GuiUtils.addGap(deckPanel);
|
||||
|
||||
this.deckComboBox.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
playButton.setEnabled(canGameBeLaunched());
|
||||
lastUsedDeck = (String) deckComboBox.getSelectedItem();
|
||||
}
|
||||
});
|
||||
|
||||
deckPanel.add(this.deckComboBox);
|
||||
GuiUtils.addGap(deckPanel);
|
||||
|
||||
JButton editDeckButton = new JButton("Deck Editor");
|
||||
editDeckButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
showDeckEditor();
|
||||
}
|
||||
});
|
||||
deckPanel.add(editDeckButton);
|
||||
deckPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, deckPanel.getPreferredSize().height));
|
||||
deckPanel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
matchPanel.add(deckPanel);
|
||||
|
||||
|
||||
GuiUtils.addGap(matchPanel);
|
||||
|
||||
if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) {
|
||||
JPanel fantasyPanel = new JPanel();
|
||||
fantasyPanel.setLayout(new BorderLayout());
|
||||
|
||||
JPanel petPanel = new JPanel();
|
||||
petPanel.setLayout(new BoxLayout(petPanel, BoxLayout.X_AXIS));
|
||||
|
||||
this.petCheckBox.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
if (petCheckBox.isSelected()) {
|
||||
questData.getPetManager().setSelectedPet((String) petComboBox.getSelectedItem());
|
||||
} else {
|
||||
questData.getPetManager().setSelectedPet(null);
|
||||
}
|
||||
|
||||
petComboBox.setEnabled(petCheckBox.isSelected());
|
||||
}
|
||||
});
|
||||
|
||||
petPanel.add(this.petCheckBox);
|
||||
GuiUtils.addGap(petPanel);
|
||||
this.petComboBox.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
if (petCheckBox.isSelected()) {
|
||||
questData.getPetManager().setSelectedPet((String) petComboBox.getSelectedItem());
|
||||
} else {
|
||||
questData.getPetManager().setSelectedPet(null);
|
||||
}
|
||||
}
|
||||
});
|
||||
this.petComboBox.setMaximumSize(
|
||||
new Dimension(Integer.MAX_VALUE,
|
||||
(int) this.petCheckBox.getPreferredSize().getHeight()));
|
||||
petPanel.add(this.petComboBox);
|
||||
|
||||
this.plantBox.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
questData.getPetManager().usePlant = plantBox.isSelected();
|
||||
}
|
||||
});
|
||||
|
||||
GuiUtils.addGap(petPanel, 10);
|
||||
petPanel.add(this.plantBox);
|
||||
petPanel.setMaximumSize(petPanel.getPreferredSize());
|
||||
petPanel.setAlignmentX(LEFT_ALIGNMENT);
|
||||
|
||||
fantasyPanel.add(petPanel, BorderLayout.WEST);
|
||||
|
||||
zeppelinButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
questData.randomizeOpponents();
|
||||
refreshNextMatchPanel();
|
||||
QuestItemZeppelin zeppelin = (QuestItemZeppelin) questData.getInventory().getItem("Zeppelin");
|
||||
zeppelin.setZeppelinUsed(true);
|
||||
zeppelinButton.setEnabled(false);
|
||||
}
|
||||
});
|
||||
|
||||
zeppelinButton.setMaximumSize(zeppelinButton.getPreferredSize());
|
||||
zeppelinPanel.setLayout(new BorderLayout());
|
||||
|
||||
fantasyPanel.add(zeppelinPanel, BorderLayout.EAST);
|
||||
fantasyPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||
matchPanel.add(fantasyPanel);
|
||||
}
|
||||
return matchPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>createBattlePanel</p>
|
||||
* Returns a JPanel containing PanelSingleBattle instances for each battle.
|
||||
*
|
||||
* @return a {@link javax.swing.JPanel} object.
|
||||
*/
|
||||
private JPanel createBattlePanel() {
|
||||
JPanel pan = new JPanel();
|
||||
pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS));
|
||||
pan.setBorder(new TitledBorder(new EtchedBorder(), "Available Battles"));
|
||||
PanelSingleBattle pb;
|
||||
|
||||
List<DeckSingleBattle> Battles = ManagerBattle.getBattles();
|
||||
|
||||
for (DeckSingleBattle Battle : Battles) {
|
||||
pb = new PanelSingleBattle(Battle);
|
||||
|
||||
pan.add(pb);
|
||||
pb.addMouseListener(new SelectionAdapter(pb));
|
||||
|
||||
GuiUtils.addGap(pan, 3);
|
||||
}
|
||||
|
||||
pan.setAlignmentX(LEFT_ALIGNMENT);
|
||||
|
||||
return pan;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>createQuestPanel.</p>
|
||||
* Returns a JPanel containing PanelSingleQuest instances for each battle.
|
||||
*
|
||||
* @return a {@link javax.swing.JPanel} object.
|
||||
*/
|
||||
private JPanel createQuestPanel() {
|
||||
JPanel pan = new JPanel();
|
||||
pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS));
|
||||
pan.setBorder(new TitledBorder(new EtchedBorder(), "Available Quests"));
|
||||
PanelSingleQuest pq;
|
||||
|
||||
List<DeckSingleQuest> Quests = ManagerQuest.getQuests();
|
||||
|
||||
for (DeckSingleQuest Quest : Quests) {
|
||||
pq = new PanelSingleQuest(Quest);
|
||||
|
||||
pan.add(pq);
|
||||
pq.addMouseListener(new SelectionAdapter(pq));
|
||||
|
||||
GuiUtils.addGap(pan, 3);
|
||||
}
|
||||
|
||||
pan.setAlignmentX(LEFT_ALIGNMENT);
|
||||
|
||||
return pan;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>refresh.</p>
|
||||
*/
|
||||
void refresh() {
|
||||
AllZone.getQuestData().saveData();
|
||||
|
||||
devModeCheckBox.setSelected(Constant.Runtime.DevMode[0]);
|
||||
smoothLandCheckBox.setSelected(Constant.Runtime.Smooth[0]);
|
||||
//newGUICheckbox.setSelected(OldGuiNewGame.preferences.newGui);
|
||||
|
||||
creditsLabel.setText(" " + questData.getCredits());
|
||||
statsLabel.setText(questData.getWin() + " wins / " + questData.getLost() + " losses");
|
||||
titleLabel.setText(questData.getRank());
|
||||
|
||||
//copy lastUsedDeck as removal triggers selection change.
|
||||
String lastUsedDeck = QuestMainPanel.lastUsedDeck;
|
||||
deckComboBox.removeAllItems();
|
||||
|
||||
if (questData.getDeckNames().size() > 0) {
|
||||
deckComboBox.setEnabled(true);
|
||||
|
||||
List<String> deckNames = new ArrayList<String>(questData.getDeckNames());
|
||||
|
||||
Collections.sort(deckNames, new Comparator<String>() {
|
||||
public int compare(String s, String s1) {
|
||||
return s.compareToIgnoreCase(s1);
|
||||
}
|
||||
});
|
||||
|
||||
if (deckNames.contains(lastUsedDeck)) {
|
||||
deckNames.remove(lastUsedDeck);
|
||||
deckNames.add(0, lastUsedDeck);
|
||||
}
|
||||
|
||||
for (String deckName : deckNames) {
|
||||
deckComboBox.addItem(deckName);
|
||||
}
|
||||
} else {
|
||||
deckComboBox.addItem(NO_DECKS_AVAILABLE);
|
||||
deckComboBox.setEnabled(false);
|
||||
}
|
||||
deckComboBox.setMinimumSize(new Dimension(150, 0));
|
||||
|
||||
questButton.setEnabled(nextQuestInWins() == 0);
|
||||
|
||||
playButton.setEnabled(canGameBeLaunched());
|
||||
|
||||
if (questData.getMode().equals(QuestData.FANTASY)) {
|
||||
lifeLabel.setText(" " + questData.getLife());
|
||||
|
||||
petComboBox.removeAllItems();
|
||||
|
||||
Set<String> petList = questData.getPetManager().getAvailablePetNames();
|
||||
|
||||
if (petList.size() > 0) {
|
||||
petComboBox.setEnabled(true);
|
||||
petCheckBox.setEnabled(true);
|
||||
for (String aPetList : petList) {
|
||||
petComboBox.addItem(aPetList);
|
||||
}
|
||||
} else {
|
||||
petComboBox.addItem("No pets available");
|
||||
petComboBox.setEnabled(false);
|
||||
petCheckBox.setEnabled(false);
|
||||
}
|
||||
|
||||
if (!questData.getPetManager().shouldPetBeUsed()) {
|
||||
petCheckBox.setSelected(false);
|
||||
petComboBox.setEnabled(false);
|
||||
} else {
|
||||
petCheckBox.setSelected(true);
|
||||
petComboBox.setSelectedItem(questData.getPetManager().getSelectedPet().getName());
|
||||
}
|
||||
|
||||
|
||||
this.plantBox.setEnabled(questData.getPetManager().getPlant().getLevel() > 0);
|
||||
this.plantBox.setSelected(questData.getPetManager().shouldPlantBeUsed());
|
||||
|
||||
QuestItemZeppelin zeppelin = (QuestItemZeppelin) questData.getInventory().getItem("Zeppelin");
|
||||
|
||||
if (zeppelin.getLevel() > 0) {
|
||||
zeppelinPanel.removeAll();
|
||||
zeppelinPanel.add(zeppelinButton, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
if (!zeppelin.hasBeenUsed()) {
|
||||
zeppelinButton.setEnabled(true);
|
||||
} else {
|
||||
zeppelinButton.setEnabled(false);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (nextQuestInWins() > 0) {
|
||||
nextQuestLabel.setText("Next Quest in " + nextQuestInWins() + " Wins.");
|
||||
} else {
|
||||
nextQuestLabel.setText("Next Quest available now.");
|
||||
}
|
||||
|
||||
nextMatchLayout = new CardLayout();
|
||||
|
||||
refreshNextMatchPanel();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>refreshNextMatchPanel.</p>
|
||||
*/
|
||||
private void refreshNextMatchPanel() {
|
||||
nextMatchPanel.removeAll();
|
||||
nextMatchLayout = new CardLayout();
|
||||
nextMatchPanel.setLayout(nextMatchLayout);
|
||||
nextMatchPanel.add(createBattlePanel(), BATTLES);
|
||||
nextMatchPanel.add(createQuestPanel(), QUESTS);
|
||||
if (isShowingQuests) {
|
||||
this.nextMatchLayout.show(nextMatchPanel, QUESTS);
|
||||
} else {
|
||||
this.nextMatchLayout.show(nextMatchPanel, BATTLES);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>nextQuestInWins.</p>
|
||||
*
|
||||
* @return a int.
|
||||
*/
|
||||
private int nextQuestInWins() {
|
||||
|
||||
// Number of wins was 25, lowereing the number to 20 to help short term questers.
|
||||
if (questData.getWin() < 20) {
|
||||
return 20 - questData.getWin();
|
||||
}
|
||||
|
||||
// The int mul has been lowered by one, should face special opps more frequently.
|
||||
int questsPlayed = questData.getQuestsPlayed();
|
||||
int mul = 5;
|
||||
|
||||
if (questData.getInventory().hasItem("Zeppelin")) {
|
||||
mul = 3;
|
||||
} else if (questData.getInventory().hasItem("Map")) {
|
||||
mul = 4;
|
||||
}
|
||||
|
||||
int delta = (questsPlayed * mul) - questData.getWin();
|
||||
|
||||
return (delta > 0) ? delta : 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>showDeckEditor.</p>
|
||||
*/
|
||||
void showDeckEditor() {
|
||||
Command exit = new Command() {
|
||||
private static final long serialVersionUID = -5110231879431074581L;
|
||||
|
||||
public void execute() {
|
||||
//saves all deck data
|
||||
AllZone.getQuestData().saveData();
|
||||
|
||||
new QuestFrame();
|
||||
}
|
||||
};
|
||||
|
||||
Gui_Quest_DeckEditor g = new Gui_Quest_DeckEditor();
|
||||
|
||||
g.show(exit);
|
||||
g.setVisible(true);
|
||||
mainFrame.dispose();
|
||||
}//deck editor button
|
||||
|
||||
/**
|
||||
* <p>showBazaar.</p>
|
||||
*/
|
||||
void showBazaar() {
|
||||
mainFrame.showBazaarPane();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>showCardShop.</p>
|
||||
*/
|
||||
void showCardShop() {
|
||||
Command exit = new Command() {
|
||||
private static final long serialVersionUID = 8567193482568076362L;
|
||||
|
||||
public void execute() {
|
||||
//saves all deck data
|
||||
AllZone.getQuestData().saveData();
|
||||
|
||||
new QuestFrame();
|
||||
}
|
||||
};
|
||||
|
||||
Gui_CardShop g = new Gui_CardShop(questData);
|
||||
|
||||
g.show(exit);
|
||||
g.setVisible(true);
|
||||
|
||||
this.mainFrame.dispose();
|
||||
|
||||
}//card shop button
|
||||
|
||||
/**
|
||||
* <p>launchGame.</p>
|
||||
*/
|
||||
private void launchGame() {
|
||||
//TODO: This is a temporary hack to see if the image cache affects the heap usage significantly.
|
||||
ImageCache.clear();
|
||||
|
||||
QuestItemZeppelin zeppelin = (QuestItemZeppelin) questData.getInventory().getItem("Zeppelin");
|
||||
zeppelin.setZeppelinUsed(false);
|
||||
questData.randomizeOpponents();
|
||||
|
||||
String humanDeckName = (String) deckComboBox.getSelectedItem();
|
||||
Deck humanDeck = questData.getDeck(humanDeckName);
|
||||
Constant.Runtime.HumanDeck[0] = humanDeck;
|
||||
moveDeckToTop(humanDeckName);
|
||||
|
||||
Constant.Quest.oppIconName[0] = getMatchIcon();
|
||||
|
||||
// Dev Mode occurs before Display
|
||||
Constant.Runtime.DevMode[0] = devModeCheckBox.isSelected();
|
||||
|
||||
//DO NOT CHANGE THIS ORDER, GuiDisplay needs to be created before cards are added
|
||||
//if (newGUICheckbox.isSelected()) {
|
||||
AllZone.setDisplay(new GuiDisplay4());
|
||||
//} else {
|
||||
// AllZone.setDisplay(new GuiDisplay3());
|
||||
//}
|
||||
|
||||
//OldGuiNewGame.preferences.newGui = newGUICheckbox.isSelected();
|
||||
|
||||
Constant.Runtime.Smooth[0] = smoothLandCheckBox.isSelected();
|
||||
|
||||
AllZone.getMatchState().reset();
|
||||
if (isShowingQuests) {
|
||||
setupQuest(humanDeck);
|
||||
} else {
|
||||
setupBattle(humanDeck);
|
||||
}
|
||||
|
||||
AllZone.getQuestData().saveData();
|
||||
|
||||
AllZone.getDisplay().setVisible(true);
|
||||
mainFrame.dispose();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>setupBattle.</p>
|
||||
*
|
||||
* @param humanDeck a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
void setupBattle(Deck humanDeck) {
|
||||
Deck computer = ((PanelSingleBattle) lastPanelSelected).getBattle().getDeck();
|
||||
Constant.Runtime.ComputerDeck[0] = computer;
|
||||
|
||||
AllZone.getGameAction().newGame(humanDeck, computer, forge.quest.data.QuestUtil.getHumanExtraCards(questData),
|
||||
new CardList(), questData.getLife(), 20, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>setupQuest.</p>
|
||||
*
|
||||
* @param humanDeck a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
private void setupQuest(Deck humanDeck) {
|
||||
DeckSingleQuest selectedQuest = ((PanelSingleQuest) lastPanelSelected).getQuest();
|
||||
AllZone.setCurrentQuest(selectedQuest);
|
||||
|
||||
Deck computerDeck = ManagerBattle.getAIDeckFromFile("quest" + selectedQuest.getID());
|
||||
Constant.Runtime.ComputerDeck[0] = computerDeck;
|
||||
|
||||
int extraLife = 0;
|
||||
|
||||
if (questData.getInventory().getItemLevel("Gear") == 2) {
|
||||
extraLife = 3;
|
||||
}
|
||||
|
||||
AllZone.getGameAction().newGame(humanDeck, computerDeck,
|
||||
forge.quest.data.QuestUtil.getHumanExtraCards(questData, selectedQuest), new CardList(),
|
||||
questData.getLife() + extraLife, selectedQuest.getAILife(), selectedQuest);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>getMatchIcon.</p>
|
||||
*
|
||||
* @return a {@link java.lang.String} object.
|
||||
*/
|
||||
String getMatchIcon() {
|
||||
String oppIconName;
|
||||
|
||||
if (isShowingQuests) {
|
||||
PanelSingleQuest selectedQuest = (PanelSingleQuest) lastPanelSelected;
|
||||
oppIconName = selectedQuest.getIconFilename();
|
||||
} else {
|
||||
PanelSingleBattle selectedBattle = (PanelSingleBattle) lastPanelSelected;
|
||||
oppIconName = selectedBattle.getIconFilename();
|
||||
}
|
||||
return oppIconName;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>toggleBattleQuest.</p>
|
||||
* Toggles view between battle and quest screen.
|
||||
*/
|
||||
void toggleBattleQuest() {
|
||||
if (isShowingQuests) {
|
||||
isShowingQuests = false;
|
||||
questButton.setText("Quests");
|
||||
} else {
|
||||
isShowingQuests = true;
|
||||
questButton.setText("Battles");
|
||||
}
|
||||
|
||||
if (lastPanelSelected != null) {
|
||||
lastPanelSelected.setSelected(false);
|
||||
}
|
||||
|
||||
lastPanelSelected = null;
|
||||
|
||||
refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>SelectionAdapter</p>
|
||||
* Handles (de)selection of various SelectablePanel instances using lastPanelSelected field.
|
||||
* Also toggles launch button after (de)selection.
|
||||
*
|
||||
*/
|
||||
class SelectionAdapter extends MouseAdapter {
|
||||
SelectablePanel targetPanel;
|
||||
|
||||
SelectionAdapter(SelectablePanel sp) {
|
||||
super();
|
||||
this.targetPanel = sp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent mouseEvent) {
|
||||
// Deselect previous
|
||||
if (lastPanelSelected != null) {
|
||||
lastPanelSelected.setSelected(false);
|
||||
}
|
||||
|
||||
targetPanel.setSelected(true);
|
||||
|
||||
lastPanelSelected = targetPanel;
|
||||
playButton.setEnabled(canGameBeLaunched());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>moveDeckToTop.</p>
|
||||
*
|
||||
* @param humanDeckName a {@link java.lang.String} object.
|
||||
*/
|
||||
private void moveDeckToTop(String humanDeckName) {
|
||||
QuestMainPanel.lastUsedDeck = humanDeckName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>canGameBeLaunched.</p>
|
||||
*
|
||||
* @return a boolean.
|
||||
*/
|
||||
boolean canGameBeLaunched() {
|
||||
return !(NO_DECKS_AVAILABLE.equals(deckComboBox.getSelectedItem()) || lastPanelSelected == null);
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void refreshState() {
|
||||
this.refresh();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package forge;
|
||||
|
||||
import forge.error.ErrorViewer;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: dhudson
|
||||
*/
|
||||
@Test(groups = {"UnitTest"}, timeOut = 1000)
|
||||
public class ReadQuestAssignmentTest implements NewConstants {
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
@Test(groups = {"UnitTest", "fast"}, timeOut = 1000)
|
||||
public void ReadQuestAssignmentTest1() {
|
||||
try {
|
||||
ReadQuest_Assignment read = new ReadQuest_Assignment(ForgeProps.getFile(QUEST.QUESTS), null);
|
||||
|
||||
javax.swing.SwingUtilities.invokeAndWait(read);
|
||||
// read.run();
|
||||
|
||||
Quest_Assignment qa[] = new Quest_Assignment[read.allQuests.size()];
|
||||
read.allQuests.toArray(qa);
|
||||
for (int i = 0; i < qa.length; i++) {
|
||||
System.out.println(qa[i].getId());
|
||||
System.out.println(qa[i].getName());
|
||||
System.out.println(qa[i].getDesc());
|
||||
System.out.println(qa[i].getDifficulty());
|
||||
System.out.println(qa[i].isRepeatable());
|
||||
System.out.println(qa[i].getRequiredNumberWins());
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ErrorViewer.showError(ex);
|
||||
System.out.println("Error reading file " + ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user