339 Commits

Author SHA1 Message Date
xawotihs
00e076fca4 Fixed compilation with SDL/mingw 2025-05-11 17:08:37 +02:00
xawotihs
0023c4a086 Fixed compilation with latest mingw64 2025-04-25 18:48:02 +02:00
xawotihs
7c9fd90903 Merge branch 'master' into cmake 2025-04-22 20:37:50 +02:00
xawotihs
d95e9e1155 Fix compilation with latest cmake 2025-04-11 21:58:54 +02:00
Eduardo MG
b21964dc46 Strixhaven variants, fix critical bug
Palladia-Mors, the Ruiner
Vanish into Memory
Dakmor Plague and Inferno. all(player,creature) not supported and crashes the game
color=colorless is redundant
Strixhaven: School of Mages (STX) (VARIANTS)
2025-04-10 18:53:41 -06:00
Eduardo MG
6904d6ffd3 Bug fixes on zones and correcting misspells
Summoner's Bond
Regent's Authority
Mind Burst
Thassa's Oracle
2025-04-08 22:09:47 -06:00
Eduardo MG
786a252cf5 Mana symbols to uppercase, bug fixes
Lands that enter tapped unless a player has 13 or less life
Courier Bat
Demon of Death's Gate
Caldaia Guardian
2025-04-04 22:24:18 -06:00
Eduardo MG
863c3f07bc Bad card line 2025-03-31 13:33:38 -06:00
Eduardo MG
e0867dd737 CM2 update, notATarget on clones
Clones shouldn't target.
Cosmotronic Wave
Leyline of Hope
Regal Bloodlord
Protean Raider
Impetuous Devils
Camera Launcher

New cards in previous commit:
Abyssal Harvester
Boneyard Desecrator
Celestial Armor
Crystal Barricade
Dazzling Denial
Felling Blow
Fleeting Flight
Geralf, the Fleshwright
Hare Apparent
Infernal Vessel
Inspiring Paladin
Kaito, Cunning Infiltrator
Kellan, Planar Trailblazer
Kiora, the Rising Tide
Loot, Exuberant Explorer
Owen Grady, Raptor Trainer
Perforating Artist
Permission Denied
Ravenous Amulet
Reality Spasm
Savage Order
Skyknight Squire
Slick Sequence
Spinner of Souls
Spitting Dilophosaurus
Squad Rallier
Sun-Blessed Healer
Valkyrie's Call
2025-03-31 13:13:53 -06:00
Eduardo MG
671b3bae61 Improved riot, INR, MH3, macros. Bug fixes. New cards
Windbrisk Heights
Orchard Strider
Shefet Monitor
Merfolk Sovereign
Alibou, Ancient Witness
Flesh Allergy
Regal Sliver
name=Pilot token, condition to check if there's a vehicle in your battlefield
Painful Quandary needed a condition to check if the affected player has at least one card in hand
Serpentine Curve shouldn't count itself. Serpentine Curve itself is not yet in your graveyard when you determine the value of X.
Rowen was drawing with nonbasics
Thopter Spy Network
Teferi, Temporal Archmage -10 ability, create an emblem
Exert Influence
Dawnglade Regent effect persisted after dying
Molten Echoes
Undergrowth
Haze of Pollen
Oketra's Avenger
Heliod's Intervention
Aura Barbs
Gravestorm
Inspired Sphinx
Retrofitted Transmogrant
Echoing Assault
Citywide Bust
2025-03-28 17:12:41 -06:00
Eduardo MG
02a4726cbf Merge pull request #1110 from patrickbabb/master
Updates to target arm64-v8a Android devices
2025-03-21 22:08:19 -06:00
Patrick Babb
91d588c670 Update spinlock_gcc_arm.hpp
Added logic to use LSE as a primary instead of Swap.
2025-03-18 22:01:55 -05:00
Patrick Babb
4df4422d93 Update Application.mk
Updated ABI target to arm64-v8a.
Added CFLAG for arm8.1-a.
Added CPPFLAG for LSE
2025-03-18 21:58:59 -05:00
Patrick Babb
0b3b33f727 Update SDL_spinlock.c 2025-03-18 21:55:59 -05:00
Eduardo MG
5cdf952623 Stormsurge Kraken fix
It allowed to draw to cards for each creature blocking it
2025-03-12 18:15:18 -06:00
Eduardo MG
9a55e03790 Cards from Aetherdrift and fix to Crested Sunmare
Fixed Crested Sunmare token creation condition.

Add cards:
Alacrian Armory
Broadside Barrage
Broodheart Engine
Chitin Gravestalker
Coalstoke Gearhulk
Collision Course
Haunt the Network
Hellish Sideswipe
Intimidation Tactics
Kolodin, Triumph Caster
Mindspring Merfolk
Ooze Patrol
Spectral Interference
Stock Up
Voyager Glidecar
Wreck Remover
2025-03-10 19:16:04 -06:00
Eduardo MG
4b52e8cf6c Incrementing the build numbers. bug fixes 2025-03-07 18:51:33 -06:00
Eduardo MG
f7eaf5072e New cards mostly from DFT and J25
Aatchik, Emerald Radian
Accursed Duneyard
Adaptive Omnitool
Aetherjacket
Agonasaur Rex
Air Response Unit
Basri, Tomorrow's Champion
Beastrider Vanguard
Bestow Greatness
Bleachbone Verge
Boosted Sloop
Bounce Off
Brigone, Soldier of Meletis
Broadcast Rambler
Burner Rocket
Caelorna, Coral Tyrant
Camera Launcher
Caradora, Heart of Alacria
Chandra, Spark Hunter
Cleon, Merry Champion
Cloudspire Skycycle
Count on Luck
Crash and Burn
Cynette, Jelly Drover
Daring Mechanic
Dawnwing Marshal
Draconautics Engineer
Dropkick Bomber
Eidolon of Astral Winds
Engine Rat
Faithful Pikemaster
Firespitter Whelp
Fuel the Flames
Fumulus, the Infestation
Gallant Strike
Gastal Blockbuster
General Kreat, the Boltbringer
Generous Pup
Gilded Scuttler
Go Forth
Goblin Surprise
Greenbelt Guardian
Grim Bauble
Guidelight Synergist
Haunted Hellride
Hazard of the Dunes
Hearts on Fire
Hinterland Sanctifier
Howler's Heavy
Hungry Megasloth
Jibbirik Omnivore
Kalakscion, Hunger Tyrant
Keen Buccaneer
Lightshield Parry
Locust Spray
Loot, the Pathfinder
Lotusguard Disciple
Magmakin Artillerist
Marauding Mako
March of the World Ooze
Marketback Walker
Maximum Overdrive
Memory Guardian
Migrating Ketradon
Migrating Ketradon
Molt Tender
Mu Yanling, Wind Rider
Nazar, the Velvet Fang
Night Market
Nimble Thopterist
Oviya, Automech Artisan
Pacesetter Paragon
Pactdoll Terror
Pedal to the Metal
Phantasmal Shieldback
Plow Through
Pothole Mole
Priest of the Crossing
Prowcatcher Specialist
Psemilla, Meletian Poet
Regal Imperiosaur
Rhet-Tomb Mystic
Riptide Gearhulk
Risky Shortcut
Riverpyre Verge
Rocketeer Boostbuggy
Sabotage Strategist
Sandstorm Crasher
Saurian Symbiote
Scholar of Combustion
Scourge of the Undercity
Scrap Compactor
Scrounging Skyray
Shardless Outlander
Shefet Archfiend
Shroofus Sproutsire
Silken Strength
Skycrash
Skystreak Engineer
Spectacular Pileup
Spin Out
Spotcycle Scouter
Stall Out
Stampeding Scurryfoot
Starlight Snare
Starnheim Memento
Sunbillow Verge
Sundial, Dawn Tyrant
Sutina, Speaker of the Tajuru
Syphon Fuel
Temmet, Naktamun's Will
Terrian, World Tyrant
Thunderhead Gunner
Thurid, Mare of Destiny
Ticket Tortoise
Trade the Helm
Transit Mage
Trip Up
Tune Up
Tyrox, Saurid Tyrant
Unstoppable Plan
Veteran Beastrider
Voyage Home
Voyager Quickwelder
Wastewood Verge
Waxen Shapethief
Wickerfolk Indomitable
Willowrush Verge
Woodland Liege
Wreckage Wickerfolk
Wretched Doll
Wriggling Grub
2025-03-07 13:07:00 -06:00
Eduardo MG
8df70d43e1 Foundations Jumpstart (J25), Innistrad Remastered (INR), Aetherdrift (DFT), Aetherdrift Commander (DRC) _cards.dat
Foundations Jumpstart (J25)
Innistrad Remastered (INR)
Aetherdrift (DFT)
Aetherdrift Commander (DRC)
2025-03-07 13:03:52 -06:00
Eduardo MG
721f1bc269 set code Y22 has been updated to YMID
The set code Y22 has been updated to YMID, now reflecting its official name: Innistrad: Midnight Hunt. Additionally, this set now includes a multiverseid in the database, aligning it with official standards.

Bug fixes:
Astral Drift
Hulking Metamorph
Exorcise
Pain Distributor
Cleansing Wildfire
Jaya, Venerated Firemage
Great Whale
Jolting Merfolk
Sunbird's Invocation removed
Eerie Interlude
Old-Growth Dryads
Enigma Sphinx
All "God-Eternal" that return to deck
Sorin, Imperious Bloodlord
2025-03-06 19:36:12 -06:00
Eduardo MG
f698d9f96c Foundations Jumpstart (J25) _cards.dat 2025-01-27 19:38:08 -06:00
Eduardo MG
08eeeb3079 Alchemy: Innistrad 2025-01-11 12:30:28 -06:00
Eduardo MG
2851576b31 Moved Foundations planeswakers
Moved Foundations (FDN) planeswakers to it's corresponding file.
2024-12-24 13:25:53 -06:00
Eduardo MG
7d5afbad53 Foundations (FDN) cards and bug fixes
Bug fixes:
Seasoned Dungeoneer
Giggling Skitterspike
Kinetic Augur
Battle of Frost and Fire
Outlaws' Merriment
Ruthless Knave
Overlord of the Balemurk
Malamet War Scribe
Massacre Girl, Known Killer
Slip On the Ring
Eastfarthing Farmer
Shadow Prophecy
Hungry Lynx
Backup Plan - removed, is too buggy and does't do the effect correctly

Special Guests (SPG) DUSKMOURN
2024-12-24 11:10:12 -06:00
Eduardo MG
6caa79bbd4 Upload of the Foundations (FDN) _cards.dat file 2024-12-24 10:43:23 -06:00
Eduardo MG
00332a9df3 Merge pull request #1108 from BobCyril/master
Four new AI opponents
2024-12-17 17:47:24 -06:00
BobCyril
7c0c6355e1 Create deck164.txt
New 60 card AI opponent
2024-12-15 17:19:24 +00:00
BobCyril
db0498fc4d Create deck163.txt
New 60 card AI opponent
2024-12-15 17:17:31 +00:00
BobCyril
69caa05c4e Create deck162.txt
New 60-card AI opponent
2024-12-15 17:15:54 +00:00
BobCyril
636207f46d Update deck138.txt
New AI Commander deck to replace poor AI opponent
2024-12-15 17:13:42 +00:00
Eduardo MG
b34929f703 Merge pull request #1107 from BobCyril/master
New, improved and renamed AI decks
2024-12-06 13:04:11 -06:00
BobCyril
d009bf858c Update deck161.txt
Deck name updated
2024-12-05 21:03:40 +00:00
BobCyril
da77238799 Update deck160.txt
Deck name updated
2024-12-05 21:03:04 +00:00
BobCyril
77c53e1519 Update deck159.txt
Deck name updated
2024-12-05 21:02:25 +00:00
BobCyril
2491453ed0 Update deck155.txt
Deck name updated
2024-12-05 21:01:27 +00:00
BobCyril
f752bd38e7 Update deck153.txt
Deck name updated
2024-12-05 21:00:47 +00:00
BobCyril
51accdcad1 Update deck151.txt
Deck name updated
2024-12-05 21:00:03 +00:00
BobCyril
bb4466d36d Update deck141.txt
Deck name updated
2024-12-05 20:59:19 +00:00
BobCyril
6cbbb1c308 Update deck148.txt
Kor Army deck improved and swapped with Tergrid deck
2024-12-05 20:58:22 +00:00
BobCyril
015481a827 Update deck142.txt
New Lyra Commander deck to replace previous poor AI commander deck
2024-12-05 20:56:59 +00:00
BobCyril
532954f5b2 Update deck140.txt
Wipe Them Out! deck improved and swapped with Belbe deck
2024-12-05 20:55:29 +00:00
BobCyril
9cad9f6309 Update deck124.txt
Belbe Commander deck moved here
2024-12-05 20:53:38 +00:00
BobCyril
c3f8c81d96 Update deck102.txt
Tergrid Commander deck moved here
2024-12-05 20:52:18 +00:00
Eduardo MG
8021be00f9 Merge pull request #1106 from BobCyril/master
Decks 81 and 144 upgraded and swapped, deck 32 and 109 renamed
2024-11-20 19:10:43 -06:00
BobCyril
839c2c4fee Update deck109.txt
Deck109 renamed
2024-11-17 18:41:26 +00:00
BobCyril
05b3692b60 Update deck32.txt
Deck32 renamed.
2024-11-17 18:40:48 +00:00
BobCyril
e4d6d6811b Update deck81.txt
Old deck144 (Vrondiss Commander) moved here.
2024-11-17 18:38:23 +00:00
BobCyril
b9196348bb Update deck144.txt
Old deck81 (Goblin Spike) upgraded and moved here in place of Vrondiss Commander, now moved to deck81 slot.
2024-11-17 18:36:48 +00:00
Eduardo MG
cae9d41885 Merge pull request #1105 from BobCyril/master
New, Updated and Moved AI Decks
2024-11-05 10:19:07 -06:00
BobCyril
83bcefe308 Update deck156.txt
New LotR commander deck to replace previous LotR deck which was a very poor opponent
2024-11-04 19:14:04 +00:00
BobCyril
5bb508f5ec Update deck149.txt
Old deck68 (Shocking Minotaurs) upgraded and moved here to replace Tatyova Commander moved to deck46
2024-11-04 19:12:07 +00:00
BobCyril
45b7288cf8 Update deck143.txt
Old deck46 (Ashenmmor Cohort) upgraded and moved here to replace Ranar Commander deck moved to deck68
2024-11-04 19:09:56 +00:00
BobCyril
a63ebc8396 Update deck68.txt
Moving Ranar Commander deck to here
2024-11-04 19:06:14 +00:00
BobCyril
36985a6b71 Update deck46.txt
Moving Tatyova Commander deck to here.
2024-11-04 19:04:12 +00:00
Eduardo MG
6c599246f6 New cards from Duskmourn: House of Horror (DSK)
Bug fixes:
Backwoods Survivalists
Draconic Intervention
Monstrous Step
Skulking Killer

New cards:
Abandoned Campground
Abhorrent Oculus
Acrobatic Cheerleader
Altanak, the Thrice-Called
Appendage Amalgam
Arabella, Abandoned Doll
Attack-in-the-Box
Balemurk Leech
Balustrade Wurm
Baseball Bat
Bashful Beastie
Bear Trap
Bedhead Beastie
Betrayer's Bargain
Blazemire Verge
Bleeding Woods
Boilerbilges Ripper
Break Down the Door
Broodspinner
Cackling Slasher
Cautious Survivor
Clammy Prowler
Clockwork Percussionist
Commune with Evil
Cracked Skull
Cult Healer
Curator Beastie
Cynical Loner
Daggermaw Megalodon
Dashing Bloodsucker
Defiant Survivor
Deluge of Doom
Demolisher Spawn
Demonic Counsel
Disturbing Mirth
Diversion Specialist
Doomsday Excruciator
Duskmourn's Domination
Emerge from the Cocoon
Enduring Courage
Enduring Curiosity
Enduring Innocence
Enduring Tenacity
Enduring Vitality
Enter the Enigma
Entity Tracker
Erratic Apparition
Etched Cornfield
Exorcise
Fear of Being Hunted
Fear of Exposure
Fear of Failed Tests
Fear of Falling
Fear of Infinity
Fear of Isolation
Fear of Lost Teeth
Fear of Missing Out
Fear of Surveillance
Fear of the Dark
Final Vengeance
Flesh Burrower
Floodfarm Verge
Floodpits Drowner
Formless Genesis
Frantic Strength
Friendly Ghost
Friendly Teddy
Get Out
Ghostly Dancers
Giggling Skitterspike
Give In to Violence
Gleeful Arsonist
Glimmer Seeker
Glimmerburst
Glimmerlight
Gloomlake Verge
Gloomlake Verge
Grasping Longneck
Gremlin Tamer
Hand That Feeds
Hardened Escort
Haunted Screen
Hedge Shredder
Horrid Vigor
House Cartographer
Hushwood Verge
Impossible Inferno
Infernal Phantom
Innocuous Rat
Inquisitive Glimmer
Insidious Fungus
Irreverent Gremlin
Jump Scare
Kaito, Bane of Nightmares
Keys to the House
Kona, Rescue Beastie
Lakeside Shack
Leyline of Hope
Leyline of Mutation
Leyline of Transformation
Lionheart Glimmer
Live or Die
Living Phone
Malevolent Chandelier
Manifest Dread
Marina Vendrell
Marina Vendrell's Grimoire
Metamorphosis Fanatic
Midnight Mayhem
Most Valuable Slayer
Murky Sewer
Neglected Manor
Optimistic Scavenger
Overlord of the Balemurk
Overlord of the Boilerbilges
Overlord of the Floodpits
Overlord of the Hauntwoods
Overlord of the Mistmoors
Patched Plaything
Patchwork Beastie
Peculiar Lighthouse
Peer Past the Veil
Persistent Constrictor
Phenomenon Investigators
Piggy Bank
Piranha Fly
Popular Egotist
Possessed Goat
Ragged Playmate
Raucous Carnival
Razorkin Hordecaller
Razorkin Needlehead
Razortrap Gorge
Redress Fate
Resurrected Cultist
Ripchain Razorkin
Rite of the Moth
Rootwise Survivor
Sadistic Shell Game
Savior of the Small
Say Its Name
Scrabbling Skullcrab
Shardmage's Rescue
Sheltered by Ghosts
Shepherding Spirits
Shrewd Storyteller
Shroudstomper
Skullsnap Nuisance
Slavering Branchsnapper
Soaring Lightbringer
Spectral Snatcher
Spineseeker Centipede
Split Up
Splitskin Doll
Stalked Researcher
Strangled Cemetery
Suspended Sentence
The Jolly Balloon Man
The Swarmweaver
The Wandering Rescuer
Thornspire Verge
Toby, Beastie Befriender
Trapped in the Screen
Tunnel Surveyor
Turn Inside Out
Twist Reality
Twitching Doll
Tyvar, the Pummeler
Unsettling Twins
Unwanted Remake
Ursine Monstrosity
Valgavoth's Faithful
Valgavoth's Lair
Vanish from Sight
Vengeful Possession
Vicious Clown
Vile Mutilator
Violent Urge
Wary Watchdog
Wickerfolk Thresher
Wildfire Wickerfolk
Winter's Intervention
Winter, Misanthropic Guide
Withering Torment
Withering Torment
2024-10-10 18:00:20 -06:00
Eduardo MG
c84be9d674 Duskmourn: House of Horror and Duskmourn: House of Horror Commander
Duskmourn: House of Horror (DSK) and Duskmourn: House of Horror Commander (DSC) _cards.dat
2024-10-09 19:13:54 -06:00
Eduardo MG
7faeab98c2 Merge pull request #1103 from BobCyril/master
Moved AI Commander deck and added new AI Classic deck
2024-10-09 19:08:43 -06:00
BobCyril
3261b8bd10 Update deck150.txt
New AI deck to replace Ragavan Commander deck, now moved to deck34
2024-10-05 20:41:26 +01:00
BobCyril
dbe71fa81a Update deck34.txt
Moving updated Ragavan AI commander deck here to replace very poor AI deck
2024-10-05 20:38:53 +01:00
Eduardo MG
22efb82688 Merge pull request #1102 from BobCyril/master
Update deck149.txt
2024-10-02 15:17:10 -06:00
BobCyril
b09cd93f79 Update deck149.txt
Corrected problematic card interaction by replacing cards.
2024-10-01 04:55:18 +01:00
Eduardo MG
114ab84a9c Merge pull request #1101 from BobCyril/master
New AI commander deck for intermediate players
2024-09-30 18:03:10 -06:00
BobCyril
edcce09448 Update deck26.txt
New AI commander deck for intermediate players
2024-09-30 21:09:09 +01:00
BobCyril
e3e77711d5 Update deck18.txt
Moving deck26 (Kithkin) to here to replace very similar deck, and to make space for new commander deck.
2024-09-30 21:07:48 +01:00
Eduardo MG
480bc46ef4 Changes made to Alchemy Innistrad, bug fixes in primitives
Changes made to alchemy innistrad to have the correct multiverseid values and better image quality
Nahiri, the Unforgiving
Kaervek's Spite
Ox Drover
Volrath, the Shapestealer
Garna, Bloodfist of Keld
2024-09-19 17:28:09 -06:00
Eduardo MG
1421d906ce Tolsimir, Friend to Wolves token was crashing game
Bug fixes:
Floriferous Vinewall
Ghostfire Blade
Goblin Bowling Team
Take Out the Trash
Tolsimir, Friend to Wolves
2024-08-31 19:46:52 -06:00
Eduardo MG
229bc06027 Merge pull request #1100 from BobCyril/master
Two new AI Commander opponents for new players
2024-08-30 15:53:25 -06:00
BobCyril
0369409af0 Update deck55.txt
Add new Commander AI opponent for intermediate players. replacing poor AI deck
2024-08-30 18:57:13 +01:00
BobCyril
f160b6a5a0 Update deck16.txt
Add new Commander AI opponent for beginners, replacing a poor AI deck.
2024-08-30 18:54:19 +01:00
Eduardo MG
872732b5ab New cards
Myojin of Cryptic Dreams
Gourmand's Talent
Fortune Teller's Talent
Perch Protection
Tempt with Bunnies
Tempt with Glory
Tempt with Vengeance
Arthur, Marigold Knight
Mr. Foxglove
Sowing Mycospawn
Depth Defiler
Thraben Charm
Planar Nexus
Trenchpost
Riveteers Overlook
Brokers Hideout
Cabaretti Courtyard
Maestros Theater
Obscura Storefront
Sage of the Maze
Charitable Levy
Chthonian Nightmare
Infested Thrinax
Etherium Pteramander
Cursed Wombat
Witch Enchanter
Witch-Blessed Meadow
Pinnacle Monk
Mystic Peak
Disciple of Freyalise
Garden of Freyalise
Drowner of Truth
Drowned Jungle
Strength of the Harvest
Haven of the Harvest
Glasswing Grace
Age-Graced Chapel
Revitalizing Repast
Old-Growth Grove
Legion Leadership
Legion Stronghold
Razorgrass Ambush
Razorgrass Field
Sink into Stupor
Soporific Springs
Fell the Profane
Fell Mire
Waterlogged Teachings
Inundated Archive
Stump Stomp
Burnwillow Clearing
Bridgeworks Battle
Tanglespan Bridgeworks
Bushy Bodyguard
Heirloom Epic
Starfall Invocation
Otterball Antics
Miriam, Herd Whisperer
Tomb Trawler
Silver Deputy
Outcaster Greenblade
Redrock Sentinel
Obeka, Splitter of Seconds
Hellspur Brute
Ferocification
Quick Draw
Gold Rush
Trick Shot
Roxanne, Starfall Savant
Cactarantula
Furtive Courier
Detective's Satchel
Public Thoroughfare
Dramatic Accusation
Coerced to Kill
Archdruid's Charm
Gnawing Crescendo
Edgewall Inn
Expel the Interlopers
Specter of Mortality
2024-08-29 19:25:34 -06:00
Eduardo MG
2bb75ed466 Updates to _cards.dat
Bug fixes to primitives, updates to CardImageLinks.csv, fixed a typo in createResourceZip.py
2024-08-29 18:58:08 -06:00
Eduardo MG
603d91885f Fix to offspring cards
Escaped Shapeshifter
Pyxis of Pandemonium
Silver-Fur Master
Nashi, Moon Sage's Scion
Barrow Ghoul
Circling Vultures
Collector's Vault
Heavenly Blademaster
Chaos Warp
Master's Rebuke
Diamond Pick-Axe
2024-08-28 00:29:08 -06:00
Eduardo MG
a1266cbba8 Bug fixes to Bloomburrow cards
A-Haywire Mite
Carrot Cake
Mind Drill Assailant
Mindwhisker
Nightwhorl Hermit
Repel Calamity
Sonar Strike
2024-08-23 17:08:45 -06:00
Eduardo MG
6088969245 Bug fixes to BLB cards
Krovikan Whispers
Drillworks Mole
Gossip's Talent
Mabel's Mettle
Sunshower Druid
Ygra, Eater of All
2024-08-22 13:39:15 -06:00
Eduardo MG
3d9b40f903 Random Commander From File Rules
randomCommanderFromFile.txt

The randomcommander from file feature allows players to load a commander deck from a predefined list stored in an external file. Here’s how it works:

File Loading: The game attempts to open a file named commander.txt located in the User/commander/ directory. This file contains a list of possible commander IDs or names.

Default Handling: If the file doesn't exist or is empty, the game creates the file and writes a default commander ID (670972) to it. The file is then re-opened for further processing.

Commander ID Extraction: The game reads each line in the file, ignoring comments (lines starting with #). It validates whether the line is a numeric commander ID. If not, the game tries to convert it from a card name to an ID using function getMTGId().

Filtering and Validation: The game then filters out invalid IDs (e.g., IDs that do not correspond to an existing card in the game's database). If no valid IDs remain, it defaults to using the same commander ID (670972).

Random Selection: Once a list of valid commander IDs is compiled, the game randomly selects one ID from this list to be used as the commander for the player.

Deck Construction: A temporary deck is constructed using the selected commander, along with a predefined number of lands and spells that match the commander's colors.

Summary
The random commander from file feature provides a way to customize and randomize the commander used in a game based on an external file. This adds variety and replayability, as each game can have a different commander selected from the list, allowing for different strategies and experiences.
2024-08-22 10:32:53 -06:00
Eduardo MG
ddd589d3f6 Trying to fix compilation for PSP
Replace nullptr with NULL
2024-08-21 23:02:11 -06:00
Eduardo MG
8793f05cea Random Commander From File
Loads a player with a randomly selected commander from a specified file.

 * This function reads a file ('User/commander/commander.txt') that contains a list of potential commander IDs or names.
 * It selects one randomly to be used as the player's commander. If the file doesn't exist, or no valid commanders are found, a default commander ID (670972) is used.
* Can read the commander name and a multiverseID
* Lines that start with '#' are ignored
2024-08-21 22:33:31 -06:00
Eduardo MG
ec2ef1856b Bug fix this(variable{phalfinitlife}) indestructible
As long as your life total is less than or equal to half your starting life total, this has indestructible
Agrus Kos, Spirit of Justice
Alloy Animist
Bane, Lord of Darkness
Bhaal, Lord of Murder
Fighter Class
Flamerush Rider
Greasefang, Okiba Boss
Hydroid Krasis
=Ilharg, the Raze-Boar
Mangara, the Diplomat
Myrkul, Lord of Bones
Omo, Queen of Vesuva
Ragavan, Nimble Pilferer
Titania's Song
Vedalken Humiliator
Winota, Joiner of Forces
Zara, Renegade Recruiter
Zoraline, Cosmos Caller
Aethermage's Touch
Dragon Mask
Rakalite
Nahiri, the Harbinger
2024-08-21 20:24:54 -06:00
Eduardo MG
fd11dcefe2 Revert "Updating Android ndk"
This reverts commit aa48c9ca4a.
2024-08-19 19:04:06 -06:00
Eduardo MG
190405d43f Revert "Update travis-script.sh"
This reverts commit f6a991a2e6.
2024-08-19 19:04:01 -06:00
Eduardo MG
30505b0e5d Revert "Travis, trying a newer version of android ndk"
This reverts commit 93492ae091.
2024-08-19 19:03:40 -06:00
Eduardo MG
93492ae091 Travis, trying a newer version of android ndk 2024-08-19 18:56:17 -06:00
Eduardo MG
f6a991a2e6 Update travis-script.sh 2024-08-19 18:24:55 -06:00
Eduardo MG
aa48c9ca4a Updating Android ndk
Trying android-ndk-r27/ndk-build
2024-08-19 17:37:58 -06:00
Eduardo MG
8ed4729d82 postcombat to second main, bug fixes in primitives
Had to use the treasure defined as primitive since the Fable of the Mirror-Breaker token won't create a treasure otherwise.

Changes:

Rat Colony
Shadow of the Second Sun
Sphinx of the Second Sun
Viashino is no longer a creature type. The postcombat main phase is now referred to as the second main phase.
Updated Rules.cpp to exclude the Viashino type from random kindred decks.
Bug Fixes:

Fable of the Mirror-Breaker
Rat Colony
Plumb the Forbidden
Oblivion Stone
2024-08-18 17:50:59 -06:00
Eduardo MG
4ebb114a0e Bug fixes, corrections, clarifications on abilities
Tezzeret, Betrayer of Flesh -2 is permanent
2024-08-17 12:08:54 -06:00
Eduardo MG
7e3cf5c009 New cards from Bloomburrow
New cards from Bloomburrow (BLB) and Bloomburrow Commander (BLC)
2024-08-16 16:12:25 -06:00
Eduardo MG
9895148562 Moved reconfigure cards to the end of mtg file
Due to card type association, Dryad Arbor is placed at the end. Any other card that associates two super types in this manner should also be placed at the end of the primitive to avoid changeling thinking that “forest” is a creature type. This applies to reconfigure cards as well, to avoid making changelings equipment.
2024-08-16 16:04:37 -06:00
Eduardo MG
bfa30c10db Add new icons for graveyard and for exile 2024-08-16 12:27:30 -06:00
Eduardo MG
f57f5bfff5 Changed ownerHand to just hand, bug fixes
Changed ownerHand to just hand, inspecting the source code it is the same
Individual cards bug fixes:
Arbiter of the Ideal have to misspell manifest
Curate Must Draw After Surveil
Deface casting restrictions
Discombobulate
Dovin, Grand Arbiter
Downsize
Dragon Throne Of Tarkir
Dragonshift
Dregs of Sorrow
Elder Spawn
Elvish Mariner
Faerie Mastermind
Fecundity
Finale Of Revelation
Flame Channeler
Flameskull
Frostwalk Bastion frozen ability
Gate To The Afterlife
Invade the City is still on the stack while you count your instant and sorcery cards in your graveyard. It doesn't count itself.
Kabira Evangel doesn't seem to work with a may condition
Krosan Verge
Livewire Lash
Meteor Blast
Midnight Clock
Mindlink Mech
Mirror Match
Morality Shift removed
Overwhelming Encounter removed
Peace Talks removed
Quiet Disrepair removed
Ravenous Gigantotherium removed
Reign Of Chaos
Rout
Sanctuary Blade removed
Sculpted Sunburst
Seeds Of Innocence
Shackles Of Treachery
Shared Summons
Sokenzan Smelter
Valiant Endeavor removed
Vraska, Betrayal's Sting
2024-08-16 12:22:13 -06:00
Eduardo MG
e2f6fec09e LTR and LTC _cards.dat and bug fixes in primitives
I had to update the _cards.dat files for The Lord of the Rings: Tales of Middle-earth (LTR) and Tales of Middle-earth Commander (LTC) since they didn't have the correct official multiverse IDs. I'm sorry if this affects past decks, but I had to make these changes because it was difficult to debug cards within the set and obtain their respective tokens.
Hisoka, Minamo Sensei
Ragemonger text
Igneous Inspiration and other instants/serceries that target an opponents permanent
Mind Rake
Keeper of the Accord
Aria Of Flame
Arixmethes, Slumbering Isle, Annoying
Battlefield Scrounger
Bloodchief Ascension
Breathless Knight
Breeches, Brazen Plunderer
Doubling Season
Contaminant Grafter
Cursed Rack was working even after being destroyed
2024-08-14 18:37:30 -06:00
Eduardo MG
f9df303e92 Update CardImageLinks.csv
Including cards from Bloomburrow and its commander set, token updates.
2024-08-13 17:47:48 -06:00
Eduardo MG
42401d749b Double square brackets can cause bugs.
Leovold, Emissary of Trest
soldevi digger
raze-boar returned a card from the graveyard
Hatchery Spider is a cast
Estrid, the Masked had to create a flavorful workaround
Atemsis, All-Seeing not exaclty the effect
Nothic
Thunderwave crashing and not working any iteration
Kuldotha Flamefiend
2024-08-13 16:56:56 -06:00
Eduardo MG
57c59ee0dd Changed some conditions to simpler variables
newability[reach] changed to just reach
Bug fixes
Garruk, Unleashed
2024-08-13 00:13:13 -06:00
Eduardo MG
618a418ea6 Changed 'endofturn' to just 'end'
Same functionality with less code
2024-08-12 23:07:07 -06:00
Eduardo MG
eccd00fd19 Updates to _cards.dat, bug fixes
Bug fixes in primitives
2024-08-12 18:05:28 -06:00
Eduardo MG
4f24b94faa Bug fixes in primitives, planeswalkers minus character
Replaced unusual characters in the planeswalkers file.
2024-08-12 08:35:44 -06:00
Eduardo MG
2588bcd050 Revised the rules files and improved the Titania game mode with new features.
The effect "Whenever one or more +1/+1 counters are put" should be coded as @totalcounteradded(1/1) to to avoid triggering from a single instance that puts multiple counters.

Updated the BLC file to include the alternative layout cards.

Rakdos the Defiler
Jin-Gitaxias, Progress Tyrant
Jousting Lance
Leaf Drum Controlled By The Ai
Spectacle as a macro causes bugs
Sword of the Paruns
Suit Up
Lurrus of the Dream-Den
2024-08-11 12:18:25 -06:00
Eduardo MG
aca7f6d416 Changed cards with "Act of treason" effect
Double square brackets was causing bugs.

Changed cards with the effect "Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. (It can attack and {T} this turn.)"
2024-08-08 08:36:26 -06:00
Eduardo MG
67666e850d Changes to _cards.dat to account for layouts
I had to modify how the _cards.dat files are created to incorporate variant layouts of adventures, aftermath, and split cards. They are now showing in the collection, but you will need to download the images again.
Rootless Yew
Repel Intruders
Resplendent Angel
Karn, Scion of Urza
2024-08-07 23:41:50 -06:00
Eduardo MG
2cef9d8f60 Bug fixes in primitives
when this creature dies, put its counters on target creature you control
Shiny Impetus
Witch of the Moors
Parish-Blade Trainee
Enduring Bondwarden
Marauding Maulhorn
2024-08-07 07:28:59 -06:00
Eduardo MG
34557b3c4f Bug fixes in primitives
Anointer of Valor
Profane Command
confluences
Skeletal Swarming
2024-08-06 19:56:31 -06:00
Eduardo MG
5629240449 Changed how Clue, Food, and Treasure tokens are created.
Since I can now obtain token images, the tokens should correspond to the plane and have different illustrations.
2024-08-06 00:03:25 -06:00
Eduardo MG
9ca59e9afb _PROLIFERATE_ is giving issues
Current implementation is not 100% correct since it forces you to select at least one target
2024-08-02 18:09:25 -06:00
Eduardo MG
4ae355a6ea New cards from CLU, OTJ, DMU, MC3
New cards from CLU, plot cards from OTJ, enlist DMU, MC3
Afterlife Insurance
Aloe Alchemist
Argivian Cavalier
Astor, Bearer of Blades
Ayesha Tanaka, Armorer
Balduvian Berserker
Barkweave Crusher
Beastbond Outcaster
Benalish Faithbonder
Bespoke Battlewagon
Blacksnag Buzzard
Brimstone Roundup
Carnage Interpreter
Cleaving Skyrider
Coalition Skyknight
Coalition Warbrute
Combat Research
Commander Mustard
Conclave Evangelist
Conduit Goblin
Cunning Coyote
Cyclops Superconductor
Demonic Ruckus
Djinn of Fool's Fall
Dust Animus
Ecstatic Electromancer
Etched Slith
Freestrider Commando
Frenzied Gorespawn
Furious Spinesplitter
General Marhault Elsdragon
Guardian of New Benalia
Guide of Souls
Headliner Scarlett
Herald of Ilharg
Hexbane Tortoise
Highway Robbery
Infernal Captor
Irascible Wolverine
Jhoira, Ageless Innovator
Jodah's Codex
Joint Exploration
Keldon Flamesage
Linebreaker Baloth
Loan Shark
Longhorn Sharpshooter
Lonis, Genetics Expert
Monumental Henge
Najal, the Storm Runner
Orca, Siege Demon
Ordruun Mentor
Outcaster Trailblazer
Phoenix Chick
Pillage the Bog
Quirion Beastcaller
Radha's Firebrand
Railway Brawler
Rasputin, the Oneiromancer
Rictus Robber
Riddle Gate Gargoyle
Rise of the Varmints
Rona's Vortex
Rulik Mons, Warren Chief
Rundvelt Hordemaster
Scuttling Sentinel
Senator Peacock
Sheriff of Safe Passage
Slickshot Lockpicker
Slickshot Show-Off
Sludge Titan
Smelted Chargebug
Spinewoods Paladin
Stagecoach Security
Stenn, Paranoid Partisan
Step Between Worlds
Stingerback Terror
Suppressor Skyguard
Torsten, Founder of Benalia
Tribune of Rot
Tumbleweed Rising
Undercover Butler
Unite the Coalition
Unruly Krasis
Unscrupulous Contractor
Visage Bandit
Voda Sea Scavenger
Voltstorm Angel
Walking Bulwark
Weatherlight Compleated
Yavimaya Steelcrusher
2024-08-02 17:40:08 -06:00
Eduardo MG
440d2f28b1 Bloomburrow and Bloomburrow Commander sets
Bloomburrow (BLB) and Bloomburrow Commander (BLC) _cards.dat files
2024-08-02 17:12:38 -06:00
Eduardo MG
2c6c20358d Bug fixes, Adapt, Mentor, and Amass Orcs macros
I added a condition to energy activation to prevent the AI from hanging, trimmed excessive '9s' in 'infinite' conditions, fixed the Adapt, Mentor, and Amass Orcs macros, and implemented mercenary token macros.
Light of the Legion
Myriad Construct
Sheoldred
Neheb, the Eternal
Complete the Circuit
Return to Nature
Diffusion Sliver
Frost Titan
Death Match
Requiem Angel
Wildwood Scourge
Glasspool Mimic
2024-08-02 16:56:24 -06:00
Eduardo MG
a183e9282c Changing "enters the battlefield" to "enters"
Entering will be connected specifically with the battlefield.
2024-07-29 22:39:26 -06:00
Eduardo MG
f83c670630 New cards from DMU, MH3, LCI, WOE, cases from MKM.
Adaptive Gemguard
Admiral Brass, Unsinkable
Ajani Fells the Godsire
Archangel of Wrath
Argent Dais
Bitter Chill
Boggart Bog
Boggart Trawler
Brazen Blademaster
Case of the Crimson Pulse
Case of the Filched Falcon
Case of the Gorgon's Kiss
Case of the Locked Hothouse
Case of the Ransacked Lab
Case of the Shattered Pact
Case of the Shifting Visage
Case of the Stashed Skeleton
Case of the Trampled Garden
Case of the Uneaten Feast
Chancellor of Tales
Charnel Serenade
Confounding Riddle
Copycrook
Court of Ardenvale
Court of Embereth
Court of Garenbrig
Crown of the Ages
Deconstruction Hammer
Deep-Cavern Bat
Detective of the Month
Djinn of the Fountain
Dusk Rose Reliquary
Eladamri, Korvecdal
Explorer's Cache
Family Reunion
Final-Word Phantom
Fires of Victory
Flooded Woodlands
Frogmyr Enforcer
Frostfist Strider
Fungal Fortitude
Galvanic Discharge
Garna, Bloodfist of Keld
Ghostfire Slice
Glimpse the Core
Glorifier of Suffering
Goldfury Strider
Gravedig
Guardian of the Forgotten
Guardian of the Great Door
Howling Galefang
Illicit Masquerade
Impede Momentum
In Thrall to the Pit
Inti, Seneschal of the Sun
Itzquinth, Firstborn of Gishath
Jedit Ojanen, Mercenary
Join the Maestros
Keldon Strike Team
Lethal Throwdown
Malleable Impostor
Mistway Spy
Nelly Borca, Impulsive Accuser
Nettling Nuisance
Ocelot Pride
Ogre Chitterlord
Ohabi Caleria
Ojer Pakpatiq, Deepest Epoch
Ondu Knotmaster // Throw a Line
Orazca Puzzle-Door
Perimeter Enforcer
Pirate Hat
Projektor Inspector
Pyretic Rebirth
Queen's Bay Paladin
Ral and the Implicit Maze
Ray of Ruin
Reckless Pyrosurfer
Refurbished Familiar
Relive the Past
Sage of Days
Salt Road Ambushers
Scroll of Fate
Scurry of Gremlins
Shadow Prophecy
Shadow Puppeteers
Shadow of the Second Sun
Shifting Woodland
Shipwreck Sentry
Silverback Elder
Sleep with the Fishes
Song of Stupefaction
Sorin of House Markov
Sorin, Ravenous Neonate
Soulcoil Viper
Stall for Time
Stronghold Arena
Sunfire Torch
Sunshot Militia
Tamiyo, Inquisitive Student
Tamiyo, Seasoned Scholar
Tear Asunder
Temple of Cyclical Time
Tesak, Judith's Hellhound
The Ancient One
Unlucky Drop
Urborg Lhurgoyf
Vein Ripper
Vodalian Mindsinger
Vohar, Vodalian Desecrator
Voja, Jaws of the Conclave
Warhost's Frenzy
Warm Welcome
Waylaying Pirates
Welcome to Sweettooth
Wumpus Aberration
2024-07-29 18:32:33 -06:00
Eduardo MG
8e6d58f491 Bug fixes, impulse draw macros
_IMPULSEDRAW_
_IMPULSEUENT_
Guardian of Tazeem
Teferi, Master of Time
So Tiny
Eowyn, Fearless Knight
2024-07-29 18:17:48 -06:00
Eduardo MG
b4afc3f3e1 New macros and token substitutions
Bug fixes
abilities simplification
Disciples of the Inferno
Blade of the Bloodchief
Grenzo, Havoc Raiser
Belligerent Brontodon
Weight Advantage
Liliana, Death Mage
Garruk's Warsteed
Ashiok's Forerunner
Liliana, Death Mage
2024-07-27 17:23:07 -06:00
Eduardo MG
7d5e2379be Merge pull request #1098 from BobCyril/master
New AI Commander deck and bugfix to deck160
2024-07-27 17:03:17 -06:00
BobCyril
3cb8a5a360 Create deck161.txt 2024-07-26 21:52:43 +01:00
BobCyril
b01f679452 Update deck160.txt 2024-07-26 21:48:19 +01:00
Eduardo MG
067ae2790d opponenshroud changed to hexproof, new ability canplayenchantmentlibrarytop
New ability "canplayenchantmentlibrarytop" allow to play enchantments from top
sets now include tokens
you no longer draw conspiracy cards in the random
rules file revisions
commander bugs
Eutropia the Twice-Favored
Calculating Lich
Seismic Wave
Rank and File
Professional Face-Breaker
Realmwalker
2024-07-21 18:44:21 -06:00
Eduardo MG
ea6e2b00f6 Bug fixes and abilities simplification
Phlage, Titan of Fire's Fury
Scent of Cinder
Radagast The Brown for the AI
Flood of Recollection
Samwise the Stouthearted
Blood Aspirant
Anax, Hardened in the Forge
Kairi, the Swirling Sky
Mind Rake
Hungering Hydra
Spearpoint Oread
Rampaging Geoderm
Keeper of the Accord
Electropotence
Orochi Merge-Keeper
2024-07-19 19:19:03 -06:00
Eduardo MG
5080fe7811 Update _cards.dat
CMR variants
2024-07-15 21:56:55 -06:00
Eduardo MG
fa872056ae Added new cards from M3C, MKM, LCI, WOE
IKO(GODZILLA SERIES MONSTERS)
New Cards:
Agency Coroner
Agrus Kos, Spirit of Justice
Anim Pakal, Thousandth Moon
Azlask, the Swelling Scourge
Badlands Revival
Barbed Servitor
Belligerent Yearling
Bloodbraid Challenger
Breathe Your Last
Broodmate Tyrant
Caught Red-Handed
Cayth, Famed Mechanist
Chittering Dispatcher
Clandestine Meddler
Connecting the Dots
Convenient Target
Conversion Apparatus
Copy Land
Culvert Ambusher
Dauntless Dismantler
Desert's Due
Disa the Restless
Dreadmaw's Ire
Dreamtide Whale
Drossclaw
Due Diligence
Echoing Deeps
Ego Drain
Eldrazi Confluence
Eldritch Immunity
Elemental Eruption
Envoy of the Ancestors
Essence Reliquary
Expanding Ooze
Expel the Unworthy
Felonious Rage
Final Act
Flare of Cultivation
Flare of Denial
Flare of Duplication
Flare of Fortitude
Flare of Malice
From the Rubble
Grim Servant
Hexgold Slith
Hideous Taskmaster
Hope-Ender Coatl
Horrid Shadowspinner
Hourglass of the Lost
Incriminating Impetus
Inspired Inventor
Inversion Behemoth
It Doesn't Add Up
Jyoti, Moag Ancient
Kozilek's Unsealing
Kudo, King Among Bears
Lion Umbra
Make Your Move
March of the Canonized
Mine Raider
Necromancy
No Witnesses
Obstinate Gargoyle
Omo, Queen of Vesuva
Person of Interest
Petrifying Meddler
Polygoyf
Prosperity Tycoon
Pugnacious Hammerskull
Pyrogoyf
Reasonable Doubt
Redemption Choir
Repeat Offender
Rubblebelt Braggart
Rune-Brand Juggler
Salvation Colossus
Scalestorm Summoner
Selective Obliteration
Serum Visionary
Shilgengar, Sire of Famine
Siege-Gang Lieutenant
Skoa, Embermage
Skullcap Snail
Spawnbed Protector
Spider Food
Stone Idol Generator
Strix Serenade
Talion's Messenger
Tarmogoyf Nest
Temperamental Oozewagg
Ulamog's Dreadsire
Vanguard of the Rose
Voidpouncer
White Orchid Phantom
Wing It
2024-07-15 20:00:13 -06:00
Eduardo MG
4d1a10de75 Bug fixes, oracle text updates
Boneyard Scourge
Sea Hag // Aquatic Ingress
Seton, Krosan Protector
Sinbad
Tandem Lookout
Cunning Strike
Draco
Extraplanar Lens effect persisted even after being destroyed
Detention Vortex
2024-07-15 19:39:28 -06:00
Eduardo MG
deb2e0fa7a Update CardImageLinks.csv
IKO (GODZILLA SERIES MONSTERS)
Image links form recent decks, OTJ, MH3, CLU
2024-07-15 19:30:54 -06:00
Eduardo MG
ccc209d4f2 Oracle changes and subtypes updates
Shuffle your library changed to shuffle
Attack each turn changed to attack each combat
Dog changed to Jackal in specific cards
Ape changed to Monkey in specific cards
Totem Armor changed to Umbra Armor
2024-07-13 11:51:12 -06:00
Eduardo MG
4fb389e698 Bug fixes, oracle text updates
Adriana, Captain of the Guard
Anax, Hardened in the Forge
Arbiter of the Ideal had to change the name of the counter
Armament Of Nyx
Ashcoat of the Shadow Swarm
Ashes of the Abhorrent
Captain N'ghathrod
Cement Shoes
Champion of Wits
Charging Cinderhorn
Circle of Solace
Curious Obsession
Deadshot not really supported
Door of Destinies
Eye of Yawgmoth
Fateful Showdown
Fire // Ice
Heirloom Blade
Hunted Bonebrute
Illithid Harvester // Plant Tadpoles nothing works
In Bolas's Clutches and other "Enchant permanet" cards needed a rework
Infernal Harvest
Iymrith, Desert Doom
Jokulhaups didn't destroyed fire-belly ch
Jolene, Plundering Pugilist
Kagemaro, First to Suffer
Keeper of Fables
Kethek, Crucible Goliath
Lost Jitte
Lukka, Bound to Ruin
Metamorphic Alteration
Mimic Vat
Mind Whip
Necromancer's Stockpile
Peace Talks
Preyseizer Dragon
Primal Wellspring
Reaper of Night // Harvest Fear
Skanos Dragonheart
Soldevi Sentry
Support is a may
Vault Plunderer
Vraska, Betrayal's Sting
Winnow
2024-07-12 23:10:24 -06:00
Eduardo MG
fe2c55e97f Removed the adventure part of cards
Removed the adventure part since wagic does not handle them like that
2024-07-12 18:51:18 -06:00
Eduardo MG
6f1cb5c84b Update to Throne of Eldraine (ELD) _cards.dat
Piper of the Swarm alt version and lands with correct rarity
2024-07-12 17:58:04 -06:00
Eduardo MG
1654fdf8ce Bug fixes and oracle text updates
Ward with a macro is causing too many issues
Chainer, Nightmare Adept
Gluntch, the Bestower
Ikra Shidiqi, The Usurper
Impromptu Raid
Incubation Druid
Invasion Of Ravnica
Invasion Of Tarkir
Kinzu Of The Bleak Coven
Kiora Bests The Sea God
Kiora, Master Of The Depths removed, emblem crashes, don't think is posible and card barely works.
Kodama of the East Tree
Kuon, Ogre Ascendant
Magmasaur
Minthara, Merciless Soul
Momentum
Nimbus Champion
Norn's Decree
Notion Rain I know surveil must be before draw but this is better than not drawing
Nyx Herald
One With The Kami
Pact Weapon
Paladin Class
Phage The Untouchable doesn't check if casted from hand
Pondering Mage
Power Surge does damage equal to number of lands
Prosper, Tome-Bound
Puffer Extract
Quest for Ula's Temple
Quintorius, Loremaster
Rabble-Rouser
Rally The Ancestors
Redcap Raiders
Render Inert not really supported
Repel The Darkness and similar cards rework
Saheeli's Silverwing
Salvage Titan
Sensei Golden-Tail
Shared Animosity
Snow Day
Soul Transfer
Spectacular Showdown
Sporeweb Weaver's Last Ability Triggers Just Once, No Matter How Many Things Deal How Much Damage To It At Once (Most Likely Because Two Or More Creatures Blocked It).
Spreading Insurrection
Storm The Citadel
The First Iroan Games
Tinybones, Trinket Thief
Triskaidekaphobia
Visions Of Ruin
Wicked Akuba
Wine of Blood and Iron
Wingmantle Chaplain
2024-07-08 15:45:50 -06:00
Eduardo MG
4e4108f547 Bug Fixes, code cleanup, macros substitutions for tokens
Adding colorless to a token is redundant since by default is colorless.
"may pay" is redundant when the cost is mana, it's necessary when the cost is life.
Acolyte of Affliction
Ajani, Strength Of The Pride Shouldn't Be Double Triggers
Akiri, Fearless Voyager
Arena Rector
Arrogant Poet
Artificer's Hex just falls off, removed
Body Snatcher When You Have No Creatures In Hand
Bump In The Night
Cacophony Scamp
Captain Eberhart
Chandra, Hope's Beacon
Deem Worthy
Desecrate Reality
Destructive Tampering
Drake Haven
Dredge The Mire
Explosive Welcome
Fungal Rebirth
Giver of Runes
Glissa's Scorn
Gurgling Anointer
Haunted Angel
Hungry Flames
Hypnotic Cloud
Inniaz, the Gale Force
Jukai Naturalist
Lord Windgrace
Nature's Cloak
Nature's Spiral
Rashmi, Eternities Crafter
Rohgahh, Kher Keep Overlord
So Shiny
Sparktongue Dragon
Sprouting Goblin missing a )
Temple Thief
The Grey Havens
The Mending of Dominaria was shuffling itself
Tolarian Contempt, have to misspell "rejection" on the counter name
Two-Handed Axe // Sweeping Cleave
Urborg Panther
Urza's Sylex
Victory Chimes
Vraska, Swarm's Eminence
Warmonger
2024-07-06 17:36:58 -06:00
Eduardo MG
3bbb1cea2c Bug fixes to primitives
Vernal Sovereign
Surge Engine
Nissa's Defeat
Gideon, Battle-Forged
2024-06-28 12:55:56 -06:00
Eduardo MG
f4010508ad Special Guests (SPG) update 2024-06-19 18:47:58 -06:00
Eduardo MG
393b5050f9 Ravnica: Clue Edition (CLU) 2024-06-19 18:46:20 -06:00
Eduardo MG
0937578d96 Clean up of extra space at end of line
Removing unnecessary spaces makes the text or code cleaner and easier to read. Trailing spaces can lead to unexpected behavior or bugs.
2024-06-19 18:00:52 -06:00
Eduardo MG
2fea7d5810 Partial Modern Horizons 3 (MH3) cards
Breaker of Creation
Drownyard Lurker
Eldrazi Ravager
Emrakul, the World Anew
Glaring Fleshraker
It That Heralds the End
Null Elemental Blast
Nulldrifter
Twisted Riddlekeeper
Warped Tusker
Idol of False Gods
Solar Transformer
Vexing Bauble
Winter Moon
Bountiful Landscape
Contaminated Landscape
Deceptive Landscape
Foreboding Landscape
Perilous Landscape
Seething Landscape
Shattered Landscape
Sheltering Landscape
Tranquil Landscape
Twisted Landscape
Snow-Covered Wastes
Urza's Cave
Aerie Auxiliary
Mandibular Kite
Metastatic Evangel
Muster the Departed
Solstice Zealot
Brainsurge
Corrupted Shapeshifter
Emrakul's Messenger
Harbinger of the Seas
Roil Cartographer
Tune the Narrative
Tempest Harvester
Unfathomable Truths
Accursed Marauder
Arcbound Condor
Consuming Corruption
Dreadmobile
Dreamdrinker Vampire
Eviscerator's Insight
Marionette Apprentice
Mindless Conscription
Nethergoyf
Retrofitted Transmogrant
Scurrilous Sentry
Warren Soultrader
Wither and Bloom
Wurmcoil Larva
Eldrazi Linebreaker
Fanged Flames
Furnace Hellkite
Mogg Mob
Molten Gatekeeper
Phyrexian Ironworks
Sarpadian Simulacrum
Spawn-Gang Commander
Siege Smash
Thriving Skyclaw
Colossal Dreadmask
Skittering Precursor
Eldrazi Repurposer
Fanatic of Rhonas
Fowl Strike
Gift of the Viper
Horrific Assault
Malevolent Rumble
Nightshade Dryad
Path of Annihilation
Propagator Drone
Phlage, Titan of Fire's Fury
Snapping Voidcraw
Titans' Vanguard
Sneaky Snacker
Wight of the Reliquary
Writhing Chrysalis
Faithful Watchdog
Cranial Ram
Ugin's Binding
Psychic Frog
Imskir Iron-Eater
2024-06-19 17:05:22 -06:00
Eduardo MG
d1827042d4 Oracle text and creature types updates
Revision of creature type updates, and corrections to extra blank space in oracle text.
2024-06-18 10:31:38 -06:00
Eduardo MG
cc5b8ba829 Creature types and mana pool oracle text updates
Wasteland Strangler bug fix, the effect was lasting forever instead of until end of turn.
Removed "to your mana pool" oracle text since it is deprecated.
Changed:
Cephalid to Octopus
Naga to Snake
Viashino to Lizard
Rakshasas are no longer cats
2024-06-14 11:29:51 -06:00
Eduardo MG
972f17bde5 Modern Horizons 3 _card.dat files
Modern Horizons 3 (MH3) _cards.dat
Modern Horizons 3 Commander (M3C) _cards.dat
2024-06-12 18:52:16 -06:00
Eduardo MG
b60630d814 Bug fixes, learn macros update
Crystalline Nautilus
academic dispute
Soulstinger
Crown of Gondor
Fists of Flame
Imperial Aerosaur
Volatile Rig crashes the game
Kiora Bests the Sea God
Holy Frazzle-Cannon
Illustrious Wanderglyph
Stonespeaker Crystal
Slayer of the Wicked
2024-06-12 13:08:19 -06:00
Eduardo MG
b20484c7de Bug fixes and cards from The Big Score (BIG)
Bug fixes:
Drakuseth, Maw of Flames
Springleaf Drum
Ghost of Ramirez DePietro not supported
Martyr of Bones was crashing the game
Corrupt Court Official
Aggravated Assault
Slaughter Pact, Pact of Negation removed due to making opponent lose
The Mycotyrant
spectacle doesn't seem to work with macros

Cards from The Big Score (BIG):
Angel of Indemnity
Angelic Sell-Sword
Cactus Preserve
Dead Before Sunrise
Vengeful Regrowth
Oltec Matterweaver
Simulacrum Synthesizer
Harvester of Misery
Hostile Investigator
Generous Plunderer
Legion Extruder
Molten Duplication
Sandstorm Salvager
Pest Control
Lost Jitte
Lotus Ring
2024-05-13 18:58:22 -06:00
Eduardo MG
705e1444e0 Cards from Outlaws of Thunder Junction Commander (OTC) and bug fixes
Bug Fixes:
Fiery Conclusion
Intrusive Packbeast
Last March of the Ents
Kels, Fight Fixer

New cards:
Malcolm, the Eyes
Conduit Pylons
Gold Pan
Harrier Strix
Mirage Mesa
Baron Bertram Graywater
Wylie Duke, Atiin Hero
Form a Posse
Jolene, Plundering Pugilist
Kraum, Violent Cacophony
Lavaspur Boots
Goldvein Hydra
Tinybones, the Pickpocket
Vraska Joins Up
Vial Smasher, Gleeful Grenadier
Bonny Pall, Clearcutter
Akul the Unrepentant
Annie Flash, the Veteran
Rakdos Joins Up
Ruthless Lawbringer
Outlaws' Fury
Cactusfolk Sureshot
Embrace the Unknown
Kirri, Talented Sprout
Yuma, Proud Protector
Rumbleweed
Charred Graverobber
Ghired, Mirror of the Wilds
Vihaan, Goldwaker
Back in Town
Tower Winder
Colossal Rattlewurm
Olivia, Opulent Outlaw
2024-05-06 19:57:13 -06:00
Eduardo MG
93faa08ef3 Cards from Outlaws of Thunder Junction (OTJ)
Bug fixes:
Zhulodok, Void Gorger
Engulfing Eruption
Slagstone Refinery

New Cards:
Armored Armadillo
Bovine Intervention
Eriette's Lullaby
High Noon
Holy Cow
Outlaw Medic
Sterling Keykeeper
Sterling Supplier
Thunder Lasso
Wanted Griffin
Canyon Crab
Daring Thunder-Thief
Double Down
Peerless Ropemaster
Razzle-Dazzler
Spring Splasher
Ambush Gigapede
Desperate Bloodseeker
Mourner's Surprise
Neutralize the Guards
Nezumi Linkbreaker
Rakish Crew
Rooftop Assassin
Shoot the Sheriff
Treasure Dredger
Vault Plunderer
Deadeye Duelist
Discerning Peddler
Hellspur Posse Boss
Iron-Fist Pulverizer
Prickly Pair
Reckless Lackey
Rodeo Pyromancers
Scorching Shot
Ankle Biter
Bristlepack Sentry
Bristly Bill, Spine Sower
Full Steam Ahead
Raucous Entertainer
Reach for the Sky
Voracious Varmint
Honest Rutstein
Creosote Heath
Eroded Canyon
Festering Gulch
Forlorn Flats
Jagged Barrens
Lonely Arroyo
Lush Oasis
Sandstorm Verge
Soured Springs
Abraded Bluffs
Bristling Backwoods
Oasis Gardener
Sterling Hound
2024-05-03 17:13:08 -06:00
Eduardo MG
ff59089dcc Bug fixes to primitives
Mana Seism
Ozolith, the Shattered Spire
Born to Drive
Valorous Stance
Gitrog, Horror of Zhava
Spike Rogue
2024-04-26 22:35:08 -06:00
Eduardo MG
60306cf1c2 Outlaws of Thunder Junction and complementary sets
Outlaws of Thunder Junction (OTJ)
Breaking News (OTP)
The Big Score (BIG)
Outlaws of Thunder Junction Commander (OTC)
2024-04-22 10:54:32 -06:00
Eduardo MG
576be28da1 Bug fixes, removed cards that are not supported
Nimana Skydancer
Puppet Raiser
Irreverent Revelers
Cunning Evasion
Symmetry Matrix is not supported
Glint-Nest Crane
Chaplain of Alms was crashing the game while using macros
Urza's Sylex
Study Break
Rankle and Torbran
Ancient Brass Dragon
Old Flitterfang
Crossway Troublemakers
Protean Hulk
torpor orb and similar cards aren't working
2024-04-17 23:38:47 -06:00
Eduardo MG
fa2c130b08 Changed myHand to ownerHand
Bug fixes:
Many Partings
Siren reaver
navigation orb
Pestilent Souleater
Confiscation Coup removed since it crashes the game
Speakeasy Server
Heraldic Banner
2024-03-25 19:07:44 -06:00
Eduardo MG
5500b9a8a5 New cards from recent sets
Morska, Undersea Sleuth
Miner's Guidewing
Sophia, Dogged Detective
Dogged Detective
River Herald Scout
Merchant of Truth
Tangletrove Kelp
On the Trail
Tomik, Wielder of Law
Massacre Girl, Known Killer
Dream Spoilers
Burning Sun Cavalry
2024-02-17 18:20:58 -06:00
Eduardo MG
8b9f34b879 Bug fixes, replacing explores code for the macro
Bruvac the Grandiloquent, not really supported, limiting to once per turn to not break the game
Using _EXPLORES_ macro
Siren reaver
navigation orb
2024-02-17 17:39:26 -06:00
Eduardo MG
607cf5f944 Merge branch 'master' of https://github.com/WagicProject/wagic 2024-02-16 13:09:10 -06:00
Eduardo MG
353b3b1d7f New cards from recent expansions, using _EXPLORES_ macro
Mischievous Pup
Oltec Archaeologists
Marauding Brinefang
Poetic Ingenuity
Grasping Shadows
Relic's Roar
Bennie Bracks, Zoologist
Kindled Heroism
Eriette's Tempting Apple
Xavier Sal, Infested Captain
Out Cold
Long Goodbye
Griffnaut Tracker
Concealed Weapon
Cerebral Confiscation
Seeker of Sunlight
Kinjalli's Dawnrunner
Pathfinding Axejaw
River Herald Guide
2024-02-16 13:08:48 -06:00
Eduardo MG
21a0ee754a Added Special Guests (SPG)
Added Special Guests (SPG) set of reprints with special art.

Special Guests are highly desirable, Masters release–level reprints with art and flavor text matched to the flavor of the plane or set they are included in. They have their own set code (SPG) and expansion symbol
2024-02-16 12:52:51 -06:00
Eduardo MG
a0b3c00211 Fixes to commander damage, deathtouch, MAT card variants.
March of the Machine: The Aftermath (MAT) card variants.
The previous implementation of the deathtouch ability had a bug that destroyed planeswalkers even with any amount of damage. This has been fixed.
If a player has been dealt 21 points of combat damage by a particular Commander during the game, that player loses a game. The damage rule with commanders was incorrect in counting any type of damage, not only combat damage.

Bug fixes:
Athreos, Shroud-Veiled
Endless Atlas
Natural State
Savage Gorger
Kytheon's Irregulars
Lion Sash
Pyrophobia
Minas Tirith
Sakashima of a Thousand Faces
2024-02-16 12:46:41 -06:00
Eduardo MG
603af22b79 Murders at Karlov Manor (MKM) and Murders at Karlov Manor Commander (MKC)
Murders at Karlov Manor (MKM) and Murders at Karlov Manor Commander (MKC) _cards.dat with official multiverseID
2024-02-12 18:31:29 -06:00
Eduardo MG
9cfc4ea321 New cards from recent sets like WOE and Karlov Manor (MKM)
Celebration cards and primitives from Murders at Karlov Manor (MKM)
2024-02-12 18:16:00 -06:00
Eduardo MG
0d05aeb329 Fixes to Kaldheim equipment, cast prevention, AI sacrificing
Kaldheim (KHM) equipment that creates tokens uses an ETB (Enter the Battlefield) ability, not a cast ability.
Cards that use maxCast(anytext)0 simply prevent any type of casting.
The AI sometimes hangs when sacrificing creatures, preventing game continuation. To address this, a restriction has been added to allow only the human player to use this effect.
Other bug fixes:
Doomsday
Perimeter Sergeant
Imposing Grandeur
Sacred armory text
2024-02-12 18:00:35 -06:00
Eduardo MG
667adfadce Bug fixes, Changes to Random Commander
You can now get non-basic lands in random commander, adds more diversity to the mode.
Bug fixes to "Choose one or both" cards
Helm of Kaldra AI just keeps activating the ability
Katsumasa, the Animator
Yidris, Maelstrom Wielder
Prismatic Omen
Retreat to Hagra
Condescend
Unnatural Aggression
Second Breakfast
Kitesail Skirmisher
Ezuri's Predation
Rohgahh, Kher Keep Overlord
Blight-Breath Catoblepas
2024-02-09 20:04:12 -06:00
Eduardo MG
30bef9f840 Bug fixes, adding a token for next MKM set
Devour creatures and similar cards that sacrifice should not target, or else you can't sacrifice permanents with shroud
Cavalier of Night
Titan Hunter
Somberwald Alpha
Irini Sengir
Brand
2024-02-05 19:47:43 -06:00
Eduardo MG
a6fe4a5de6 White vampire token macro, bug fixes and new cards
# White Vampire with lifelink Token
#AUTO_DEFINE _WHITEVAMPIRE_ create(vampire:creature vampire:1/1:white:lifelink)
Added Uchbenbak, the Great Mistake and other cards from WOE and LCI
Bug fixes to:
Aethershield Artificer
Shirei, Shizo's Caretaker still needs some work
The Scarab God
Corpsejack Menace
Lightning Javelin
Furious Bellow
Enemy of Enlightenment
Orcish Captain
Sun-Crested Pterodon
moonlight bargain
Haunted One
Criminal Past
Scion of Halaster
Moldgraf Monstrosity
Ashiok, Nightmare Muse
Thran Spider
Icon of Ancestry
Shark Typhoon
Farid, Enterprising Salvager
Over the Top
2024-01-31 17:22:57 -06:00
Eduardo MG
f0cbff2f91 Added buttons to display menus, new token macros.
Newer Android devices dont have phisical buttons, so added buttons to display menus that have the same behaviour of pressing the back button.
Bug fixes in primitives.
Created macros for Eldrazi Scion and Eldrazi Spawn tokens.
2024-01-20 11:47:28 -06:00
Eduardo MG
11352db948 Innistrad: Midnight Hunt _cards.dat update
Adding variant cards from MID
2024-01-18 08:38:22 -06:00
Eduardo MG
0322e58221 Bug fixes and three new legendary creatures
Spelling errors fixing
Akawalli, the Seething Tower
Alaundo the Seer
Basilica Skullbomb
Bishop of Wings
Dark Bargain
Dire Tactics
Goblin Bowling Team
Golos, Tireless Pilgrim
Hive of the Eye Tyrant
Iron Mastiff
Liliana's Defeat
Mist of Stagnation
Mudhole
Multiple Choice
Myconid Spore Tender
Ominous Sphinx
Prying Blade
Solemn Recruit
The Mouth of Sauron
Thwart the Grave
Virulent Swipe
Welkin Guide
2024-01-14 18:17:11 -06:00
Eduardo MG
682ed43f38 Commander decks by Bob Cyril
Here is a brand new AI commander deck with Graaz the Unstoppable Juggernaut as the commander. 
Here is another new commander deck with Shalai and Hallar as the commander.
2024-01-12 19:25:37 -06:00
Eduardo MG
cee669389e Merge pull request #1092 from Darthagnon/improve-docs
Improve docs
2024-01-12 16:02:46 -06:00
Eduardo MG
adbed735f3 Ravnica Remastered (RVR) image links, more The Lost Caverns of Ixalan (LCI) cards
adding more The Lost Caverns of Ixalan (LCI) cards
Card image links with the new Ravnica Remastered (RVR
Bug fixes
2024-01-12 13:07:52 -06:00
Eduardo MG
aadf372204 Ravnica Remastered (RVR)
Ravnica Remastered (RVR) _cards.dat
2024-01-10 17:15:01 -06:00
Eduardo MG
f5b9d91769 More cards from The Lost Caverns of Ixalan (LCI)
Bug fixes related to cards that need an additional discard to be cast and a typo in the word "veriable" -> "variable"
2024-01-08 18:14:06 -06:00
Eduardo MG
e06cc6ddae More cards from Wilds of Eldraine (WOE)
Bug Fixes to:
Ephara, Ever-Sheltering
Sidisi's Faithful
Supply Caravan
2024-01-07 14:11:24 -06:00
Eduardo MG
19f2267413 Some cards from Wilds of Eldraine (WOE)
Adding a subset of Wilds of Eldraine (WOE) cards, also a bug fix to Elven Chorus
2023-12-27 17:30:53 -06:00
Eduardo MG
96e9eebabb More cards from The Lost Caverns of Ixalan (LCI)
Bug fixes to:
Alpine Guide
Shimmerwing Chimera
Horn of Deafening
2023-12-25 22:56:41 -06:00
Eduardo MG
814fc96ed8 Adding some The Lost Caverns of Ixalan (LCI) primitives
Also bug fixes to Argoth, Sanctum of Nature and Creeperhulk
2023-12-22 12:24:12 -06:00
Eduardo MG
60ae2d5bef Update borderline.txt
leather armor
Cemetery Desecrator
Glamdring
Militia Bugler
Creeperhulk
2023-12-20 12:27:01 -06:00
Eduardo MG
560bb22cd7 Populating LCI and REX _cards.dat 2023-12-16 16:33:04 -06:00
Eduardo MG
298491d416 The Lost Caverns of Ixalan CardImageLinks
Images links for The Lost Caverns of Ixalan (LCI), The Lost Caverns of Ixalan Commander (LCC) and Jurassic World Collection (REX) sets
2023-12-16 12:14:21 -06:00
Eduardo MG
4929ab9991 The Lost Caverns of Ixalan (LCI) _cards.dat
The Lost Caverns of Ixalan (LCI), The Lost Caverns of Ixalan Commander (LCC) and Jurassic World Collection (REX) sets
2023-12-16 12:10:24 -06:00
Eduardo MG
7d4056d9ba Update borderline.txt
Bug fixes in primitives
Archon of Cruelty
Horned Stoneseeker
Loch Dragon
Smothering Tithe
Spectral Hunt-Caller
2023-11-15 18:41:18 -06:00
Eduardo MG
390c25608e Update CardImageLinks.csv
Image links for Wilds of Eldraine (WOE), Wilds of Eldraine: Enchanting Tales (WOT), and Wilds of Eldraine Commander (WOC).
2023-10-02 12:09:26 -06:00
Eduardo MG
4eddbdfc5d Wilds of Eldraine and it's complementary sets
Includes Wilds of Eldraine (WOE), Wilds of Eldraine: Enchanting Tales (WOT), and Wilds of Eldraine Commander (WOC). Only the _cards.dat
2023-10-02 11:58:07 -06:00
Eduardo MG
e1614c073b Bug fixes in primitives
Lead by Example
Aragorn, the Uniter
Clay Revenant
Risen Executioner
Avacyn token from Battle at the Helvault
2023-09-14 18:24:01 -06:00
Darren J. de Lima
44cf433b06 Add Discord, archival notice for forums 2023-07-01 18:36:16 +01:00
Darren J. de Lima
1c40e3a889 Fix URLs, minor formatting 2023-07-01 18:31:41 +01:00
Darren J. de Lima
e19519a39c Improve README, add Wiki as submodule
Ensures developers get a full offline copy of documentation when cloning repo.
2023-07-01 18:27:05 +01:00
Eduardo MG
d4cb3e8384 Merge pull request #1078 from fogobogo/cmake
Cmake update
2022-10-04 16:07:12 -05:00
fogobogo
d566524499 cmake build fixes
this brings the cmake branch in line with commit
8e551bb287 from the main branch.

This adds a few boons, most notably it allows compiling on Linux with
SDL2 instead of SDL.

That also allows for mouse support and can now be run without X, which
is mostly interesting in case you want to play some Wagic on say, a
Raspberry Pi.
2022-01-11 20:51:49 +01:00
fogobogo
f3bb5ccef9 Merge branch 'master' into cmake 2022-01-11 19:19:09 +01:00
xawotihs
4709295598 Adds ios cmake toolchain 2017-09-08 22:47:29 +02:00
Xawotihs
af0c423359 Switch back to java oracle 8 to build android app 2017-09-08 18:23:09 +02:00
Xawotihs
45253e0008 Reupdate pip calls to use them for osx as well 2017-09-08 17:56:20 +02:00
Xawotihs
e32e5c2a47 Readding sudo pip ... lalala ... 2017-09-07 22:12:25 +02:00
Xawotihs
3a4f9f06cb reordered pip install 2017-09-07 22:01:36 +02:00
Xawotihs
a563030440 Removing pip cache 2017-09-07 21:44:55 +02:00
Xawotihs
80d43896ff Reordered pip installs around 2017-09-07 20:56:37 +02:00
Xawotihs
1c5949411f Fixed some ] and space 2017-09-07 20:22:25 +02:00
Xawotihs
699b151939 With a couple of ; 2017-09-07 20:15:32 +02:00
Xawotihs
e6af1a08b9 Use sudo pip for Android and pip with linux without Android 2017-09-07 20:09:56 +02:00
Xawotihs
7eac02f8d4 Trying pip install without sudo 2017-09-06 19:44:00 +02:00
Xawotihs
58e70e2500 replacing sudo pip by sudo -H pip 2017-09-06 19:36:12 +02:00
Xawotihs
56ca2021dc Let's try with openjdk7 2017-09-06 19:18:13 +02:00
Xawotihs
e4e431dcee Let's try jdk_switcher 2017-09-06 00:21:24 +02:00
Xawotihs
abfff205ee Readding ant, it seems the android worker needs it 2017-09-06 00:05:16 +02:00
Xawotihs
6416e4e0d9 Removed ant installation 2017-09-05 23:37:47 +02:00
Xawotihs
86f4730db7 Removings traces and ant errors 2017-09-05 23:06:22 +02:00
Xawotihs
33a5479512 Sounds like JAVA_HOME is wrong, let's try to use the default one 2017-09-05 22:59:06 +02:00
Xawotihs
891859f4ca Let's display ant errors 2017-09-05 22:48:06 +02:00
Xawotihs
d5bfb8201b Some echo traces 2017-09-05 22:36:19 +02:00
Xawotihs
f49ef92f90 sudo required on linux 2017-09-05 22:26:38 +02:00
Xawotihs
02d004b5bf Fixed os in build matrix for Android 2017-09-05 22:11:24 +02:00
Xawotihs
55f8a8a1d0 Only used brew if osx is defined 2017-09-04 20:16:31 +02:00
Xawotihs
068a69c80b Adding ant as it somehow disappeared ... 2017-09-04 19:43:41 +02:00
Xawotihs
375e66489f Changed memory to be 16 MB 2017-09-03 23:55:43 +02:00
Xawotihs
cbbd034862 Removed chmod on binary 2017-09-03 14:44:45 +02:00
Xawotihs
f7fe948da5 Update psp sdk link, don't install theos for all mac builds 2017-09-03 14:21:15 +02:00
Xawotihs
478ce0863b Replace cmake installation script 2017-09-03 14:04:32 +02:00
Xawotihs
329011460f Update .travis.yml 2017-09-03 13:55:39 +02:00
xawotihs
48ec51a923 Shold fix travis script 2017-09-03 12:49:31 +02:00
xawotihs
9936962c56 Should fix cmake issues on linux 2017-09-03 12:44:30 +02:00
xawotihs
15111d1b20 Merge branch 'master' of https://github.com/WagicProject/wagic into cmake 2017-09-02 21:15:47 +02:00
Xawotihs
2b342ca33b Fixed typo 2016-07-05 23:57:53 +02:00
xawotihs
97e6df7f59 Should fix PSP artifact build and upload 2016-07-05 23:49:33 +02:00
xawotihs
a2bb67a828 Removed duplicate blacklist and added some cache 2016-07-04 23:21:34 +02:00
Xawotihs
d14e28d7b3 Should fix android package upload 2016-07-04 04:18:26 +02:00
xawotihs
0a0ee3cc98 Merge branch 'master' into cmake 2016-07-03 16:44:21 +02:00
Xawotihs
99e6a254e1 Update android package upload 2016-07-01 00:18:44 +02:00
Xawotihs
68714ebad8 Added android SDK tools to path 2016-06-30 23:08:56 +02:00
Xawotihs
48ef4144bc Update .travis.yml 2016-06-30 22:04:08 +02:00
Xawotihs
78a4da4945 Avoid rebuilding after targging 2016-06-30 22:01:17 +02:00
xawotihs
af0861877a Merge branch 'master' into cmake 2016-06-29 21:36:47 +02:00
xawotihs
a23b96ba75 Merge branch 'master' into cmake 2016-06-26 11:25:23 +02:00
Xawotihs
47704f7591 Changed git add cmd 2016-06-26 10:28:50 +02:00
Xawotihs
755f90f38b Updated repo cleanup 2016-06-25 22:53:18 +02:00
Xawotihs
8a56406c19 Added missing REPO variable 2016-06-25 21:03:43 +02:00
xawotihs
887ea94a4d Add execution right to the new script 2016-06-25 20:11:24 +02:00
xawotihs
499b3ddf3e Added a script to upload emscripten build automatically to gh_pages 2016-06-25 16:54:35 +02:00
xawotihs
83e55b1074 Merge branch 'cmake' of https://github.com/WagicProject/wagic into cmake 2016-06-25 11:50:54 +02:00
xawotihs
1f87ed77e4 Fixed windows package and but in SDL frontend 2016-06-25 11:50:07 +02:00
Xawotihs
93b7d210dc Should fix indentation issue 2016-06-24 19:32:32 +02:00
xawotihs
10d9d84f84 Fixed emscripten memory and updated python upload script to include cmake branch 2016-06-23 23:32:57 +02:00
xawotihs
fc9a4d5431 Removed redudant builds and removed -j4 to try to compile emscripten 2016-06-23 21:20:12 +02:00
Xawotihs
4b3a2531a6 Switched to debug emscripten build 2016-06-23 08:20:24 +02:00
Xawotihs
ed4871548e Decreased optimisation level to avoid crashes 2016-06-23 07:48:11 +02:00
xawotihs
1284b8da8b Should fix emscripten build in Travis 2016-06-22 22:19:09 +02:00
Xawotihs
95455603a1 Tries to build emscripten on linux as macosx fails 2016-06-21 23:45:37 +02:00
xawotihs
813c54a166 Removed GL_CLAMP usage, update of the Android cmake package file 2016-06-19 12:46:17 +02:00
xawotihs
fa2a2d51a5 Fixed Downloader. 2016-06-19 12:08:45 +02:00
xawotihs
4b68b636ce Merge branch 'master' into cmake 2016-06-19 11:39:56 +02:00
xawotihs
0a01b0af69 Tries to fix SDL and Qt builds, introduces Emscripten in Travis. 2016-06-19 10:25:22 +02:00
xawotihs
e4e809f3fe Emscripten seems to work, should also fix PSP and Qt builds 2016-06-19 00:41:35 +02:00
xawotihs
1667b79fa8 Improved Emscripten port... still not there yet. 2016-06-18 17:24:51 +02:00
Xawotihs
31272ff0fe Removed suspicious references to thirdparty libs 2016-06-11 14:29:48 +02:00
xawotihs
9335063d68 Should fix PSP build and Windows ZIP creation 2016-06-09 21:26:11 +02:00
xawotihs
39dfaf3acb Forgot this file 2016-06-08 23:47:53 +02:00
xawotihs
3e7ecd51fd Fixed windows SDL2 build, finished removing fmod dependency 2016-06-08 23:45:42 +02:00
xawotihs
c9ee4a304e Merge branch 'master' into cmake 2016-06-07 23:35:26 +02:00
xawotihs
2f1bf7bdbe Fixed iOS build 2016-06-07 23:31:42 +02:00
xawotihs
41890f6bb4 Removed main() function in zipFS 2016-06-07 22:49:59 +02:00
xawotihs
24cd7cab58 Merges iOS modifications with Windows modifications 2016-06-07 22:48:02 +02:00
xawotihs
473d9387d4 Removed references to fmod libs for Windows builds 2016-06-07 21:00:15 +02:00
Xawotihs
f5495adce1 Enable _DEBUG in debug only 2016-06-06 22:52:39 +02:00
Xawotihs
d802ec4b59 Fixed theos path 2016-06-04 22:05:04 +02:00
xawotihs
8f69e2a204 Should fix iOS build 2016-06-04 21:44:35 +02:00
xawotihs
c3fc579907 Pulled down update for SDL2 2016-05-29 18:01:51 +02:00
Xawotihs
cc06370bcd Update CMakeLists.txt 2015-11-24 00:14:48 +01:00
Xawotihs
ed15ec2469 Fixed issue in SDL2 replacement. 2015-11-23 10:15:47 +01:00
Xawotihs
3f7d5ff041 Decreased -j option for Android 2015-11-22 22:37:55 +01:00
Xawotihs
d5bcf40cbb Replaced SDL2 flavor when compiling for Android 2015-11-22 21:30:58 +01:00
ubuntu
49c196814f Couple of fixed around Android build with cmake. 2015-11-22 02:22:44 +01:00
Xawotihs
c4282ce936 Update android.toolchain.cmake 2015-11-21 14:02:06 +01:00
Xawotihs
cd1c09127f Removed dependencies on Boost on Android 2015-11-20 12:59:26 +01:00
xawotihs
9afebe0851 Removed sdl_main_android.cpp 2015-11-19 22:38:06 +01:00
Xawotihs
9a7382ea06 Added ANDROID_NDK variable for cmake toolchain 2015-11-18 23:57:55 +01:00
Xawotihs
7a7e723009 Fixed android cmake usage 2015-11-18 23:36:39 +01:00
Xawotihs
9d772284cc Removed any sudo actions on Android 2015-11-18 23:22:45 +01:00
Xawotihs
a981761deb Trying to activate android build in matrix 2015-11-18 22:59:17 +01:00
Xawotihs
fc13ffa242 Update appveyor.yml 2015-11-17 23:31:33 +01:00
Xawotihs
878b2cd639 Update FindOrBuild.cmake 2015-11-17 23:16:51 +01:00
Xawotihs
995922d2d7 Update appveyor.yml 2015-11-17 22:54:53 +01:00
Xawotihs
0d100aa9be Update appveyor.yml 2015-11-17 22:54:18 +01:00
Xawotihs
d4fabed317 Split android sdk update in 4 2015-11-17 22:01:54 +01:00
Xawotihs
9eff781103 Update travis-script.sh 2015-11-16 23:20:20 +01:00
Xawotihs
0353da3d27 Update travis-script.sh 2015-11-16 22:56:30 +01:00
xawotihs
3cbdc6e9fe Merge branch 'cmake' of https://github.com/WagicProject/wagic into cmake 2015-11-04 22:33:26 +01:00
xawotihs
ce71afd704 Tries to activate zlib compiling on mac 2015-11-04 22:32:49 +01:00
Xawotihs
603d491bed Without quotes 2015-11-03 23:06:14 +01:00
Xawotihs
20a792f135 Refering DXSDK and not windows SDK 2015-11-03 23:02:12 +01:00
xawotihs
87f5e7f3a6 Emscripten flavor now compiles correctly 2015-11-02 23:00:57 +01:00
xawotihs
e272925f3d Removed extra/stdint.h 2015-11-02 00:00:26 +01:00
xawotihs
19091ade7b Updated appveyor to use SDL2.0.3 release and not SDL head. 2015-11-01 23:51:07 +01:00
xawotihs
e62c065e2c Should fix git submodules 2015-11-01 23:34:03 +01:00
xawotihs
2312381b82 Updated git submodules 2015-11-01 23:26:03 +01:00
xawotihs
639942d444 Merge branch 'master' into cmake 2015-11-01 22:55:08 +01:00
xawotihs
55a5b9d0ba Now uses unofficial SDL mirror 2015-11-01 22:49:14 +01:00
Xawotihs
a33517e5d0 Added prefix variable so that QT5 is found with brew 2015-10-31 23:02:31 +01:00
Xawotihs
c981586bcf Moved apt-get of Qt into linux part 2015-10-31 21:45:36 +01:00
Xawotihs
b473238f02 Replaced all " 2015-10-31 21:02:29 +01:00
Xawotihs
1d9b92080f Missed on " 2015-10-31 20:56:23 +01:00
Xawotihs
7f89d4d39f Uses "" everywhere 2015-10-31 20:51:12 +01:00
Xawotihs
4f00ec2277 Added matrix subsection in env 2015-10-31 20:37:54 +01:00
Xawotihs
26db10a083 Removed empty lines 2015-10-31 20:32:18 +01:00
xawotihs
3ec2ceb725 Activate matrix and multi-os in travis 2015-10-31 20:15:47 +01:00
xawotihs
667ac39e06 Removed reference to x64 platform 2015-10-25 18:07:30 +01:00
xawotihs
993d62a8c8 Added checkout of modules 2015-10-25 17:59:40 +01:00
xawotihs
09a70d4573 Merge branch 'cmake' of https://github.com/WagicProject/wagic into cmake 2015-10-25 17:30:59 +01:00
xawotihs
3afa730751 Updated appveyor to use cmake 2015-10-25 17:29:33 +01:00
Xawotihs
3245ddbfe7 Reducing the -j parameter to try helping g++ internal compiler issues 2015-10-25 10:51:34 +01:00
xawotihs
def55943ed Activated building SDL2 directly from submodule on Unix as well 2015-10-25 10:18:21 +01:00
xawotihs
4accc9c018 Merge branch 'master' into cmake 2015-10-25 00:22:57 +02:00
xawotihs
579d612397 Worked on windows and emscripten builds, still not perfect. 2015-10-24 23:33:31 +02:00
Xawotihs
daabce1d2f Merge pull request #647 from ZobyTwo/opencv_leftovers
Remove some leftovers from OpenCV
2015-10-17 21:46:47 +02:00
Tobias Loose
5885829585 Remove some leftovers from OpenCV 2015-10-17 18:12:31 +02:00
xawotihs
3e7b9e68d5 Fixed compilation issue with Qt. 2015-10-13 23:32:56 +02:00
Xawotihs
4a52139457 Update g++ to 4.8 2015-10-13 23:04:58 +02:00
xawotihs
79ea403273 Commented out GLUT dependency 2015-10-11 15:54:32 +02:00
xawotihs
397d7fa6c8 Added build of SDL2 in UNIX config 2015-10-11 15:31:58 +02:00
xawotihs
ac787a6f51 Added SDL2DIR env variable. 2015-10-11 15:20:27 +02:00
xawotihs
0418e77d34 Removed tabs 2015-10-11 14:29:59 +02:00
xawotihs
a2c6a3669b Reactivated SDL2 download 2015-10-11 14:27:40 +02:00
xawotihs
b8d22240a8 Fixed typo 2015-10-11 14:21:09 +02:00
xawotihs
b458d570a1 Deactivated again Android build, added a SDL build 2015-10-11 14:15:43 +02:00
xawotihs
5022df0d14 Moved tgz unpackaging away from android SDK update. 2015-10-11 12:34:52 +02:00
xawotihs
220b48b144 Updated android SDK and build tools versions 2015-10-11 12:14:58 +02:00
xawotihs
8aeed46181 Reactivates android build 2015-10-11 11:54:40 +02:00
xawotihs
38b34eae2f Split macosx config from unix one. 2015-10-11 11:38:32 +02:00
xawotihs
648b21f972 Trying something else with new repositories 2015-10-11 10:38:40 +02:00
xawotihs
09717a966b Added install of cmake 3.3 on Travis. 2015-10-11 10:08:33 +02:00
xawotihs
eef46fe743 Revert previous change and just removed inline on the function 2015-10-10 18:41:43 +02:00
xawotihs
5f91566fa7 Move vrelptr implementation in header file so that it can be used outside of JGE lib 2015-10-10 18:35:33 +02:00
xawotihs
c83a476ebe Put SwizzlePlot in the WFont header. 2015-10-10 18:23:59 +02:00
xawotihs
954bba274c Tries to fix includes 2015-10-10 18:08:45 +02:00
xawotihs
d370a5c13d Fixed png include in JGE 2015-10-10 16:15:45 +02:00
xawotihs
181189bee0 Fixed boost include path 2015-10-10 16:05:34 +02:00
xawotihs
c678f5e85a Fixed vram 2015-10-10 15:32:01 +02:00
xawotihs
0fabf83c62 Fixed decoder_prx 2015-10-10 15:25:08 +02:00
xawotihs
b7e8d19290 Fix for travis build 2015-10-10 15:15:43 +02:00
Xawotihs
d0db71602a Deactive android build as travis does not like it those days 2015-10-10 14:51:40 +02:00
Xawotihs
112efddb4e Removed typo 2015-10-09 13:32:51 +02:00
Xawotihs
4cea81e564 Moved SDL2 download away from the Android SDK download 2015-10-09 07:56:44 +02:00
Xawotihs
3a40a34566 should fix script syntax 2015-10-08 23:33:17 +02:00
Xawotihs
a4ff87a7d5 Replaced libsdl2-dev dependency by a direct download 2015-10-08 23:29:47 +02:00
xawotihs
797077c47b Various fixes and activated cmake in travis. 2015-10-08 23:08:09 +02:00
xawotihs
075d950249 Got SDL2 version compiling on Mac. 2015-10-06 23:25:40 +02:00
xawotihs
22d14b2a4f - Updated SDL dependency to SDL2
- fixed compilation issues with cmake and visual studio 2015
2015-10-04 23:10:45 +02:00
xawotihs
4272e2e2b2 Activated zlib build only on windows 2015-09-28 19:39:26 +02:00
xawotihs
34279cfacf Additional work with cmake on Windows, still does not work 2015-09-27 23:23:31 +02:00
xawotihs
85f4a4c36a Started to merge @ZobyTwo cmake branch 2015-09-26 21:52:07 +02:00
3306 changed files with 150845 additions and 64111 deletions

12
.gitmodules vendored Normal file
View File

@@ -0,0 +1,12 @@
[submodule "thirdparty/zlib"]
path = thirdparty/zlib
url = https://github.com/madler/zlib
[submodule "thirdparty/SDL2"]
path = thirdparty/SDL2
url = https://github.com/libsdl-org/SDL
[submodule "docs/wiki"]
path = docs/wiki
url = https://github.com/WagicProject/wagic.wiki
[submodule "thirdparty/curl"]
path = thirdparty/curl
url = https://github.com/curl/curl.git

View File

@@ -1,79 +1,159 @@
language: cpp
dist: xenial
branches:
only:
- master
except:
- latest-master
- latest-cmake
matrix:
include:
- os: linux
env: BUILD_TYPE=PSP
sudo: required
- os: linux
env: BUILD_TYPE=SDL
sudo: required
- os: linux
env: BUILD_TYPE=Qt
sudo: required
- os: osx
env: BUILD_TYPE=Qt
- os: osx
env: BUILD_TYPE=iOS
- os: linux
language: android
env: BUILD_TYPE=ANDROID
sudo: required
- os: osx
env: BUILD_TYPE=Emscripten
android:
components:
- platform-tools
- build-tools-23.0.1
- android-10
cache:
directories:
- opt/pspsdk
- android-ndk-r9
before_install:
- export BUILD_PSP=YES
- export BUILD_ANDROID=YES
- export BUILD_Qt=YES
- export BUILD_MAC=NO
- echo -e "machine github.com\n login $GH_TOKEN2" > ~/.netrc
- git lfs pull
# Only building on Mac when not handling pull request
# - if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
# export BUILD_MAC=YES;
# fi
- sudo apt-get update -qq
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty universe" &&
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty main" &&
sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test &&
sudo apt-get -qq update &&
sudo apt-get -qq install g++-4.8 &&
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90;
fi
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then
brew update &&
brew install dpkg &&
pwd &&
ls;
fi
- if [ "$BUILD_TYPE" == "iOS" ]; then
curl -s -f -L https://raw.github.com/r-plus/dotfiles/master/install_theos.sh | bash &&
pwd &&
ls;
fi
# Building for PSP here
- if [ "$BUILD_PSP" == "YES" ]; then
- if [ "$BUILD_TYPE" == "PSP" ]; then
export PSPDEV="$TRAVIS_BUILD_DIR/opt/pspsdk" &&
export PSPSDK="$PSPDEV/psp/sdk" &&
export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" &&
wget --no-check-certificate -O sdk.lzma http://downloads.sourceforge.net/project/minpspw/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma;
wget -O sdk.lzma https://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download;
fi
# Building for Android here
- if [ "$BUILD_TYPE" == "ANDROID" ]; then
export ANDROID="/usr/local/android-sdk-linux/tools/android" &&
export PATH=$PATH:"/usr/local/android-sdk-linux/tools" &&
wget https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip -nv &&
wget https://bitbucket.org/ewing/sdl_androidcmake/get/4e9e88c03f04.zip -nv;
fi
# Building for Qt here
- if [ "$BUILD_Qt" == "YES" ]; then
- if [ "$BUILD_TYPE" == "Qt" ] && [ "$TRAVIS_OS_NAME" == "osx" ]; then
brew install qt5 &&
export QMAKE="qmake -qt=qt5";
fi
- if [ "$BUILD_TYPE" == "Qt" ] && [ "$TRAVIS_OS_NAME" == "linux" ]; then
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu xenial universe" &&
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu xenial main" &&
sudo apt-get -qq update &&
sudo apt-get -qq install qt5-qmake qtbase5-dev qtdeclarative5-dev qttools5-dev qtmultimedia5-dev libqt5opengl5 libqt5opengl5-dev pulseaudio libpulse-dev &&
export QMAKE="qmake -qt=qt5";
fi
# Building for Android here
- if [ "$BUILD_ANDROID" == "YES" ]; then
export ANDROID="android-sdk-linux/tools/android" &&
if [ `uname -m` = x86_64 ]; then
sudo dpkg --add-architecture i386 && sudo apt-get update &&
sudo apt-get install -qq --force-yes libgd2-xpm-dev libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jq ant; fi &&
wget https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip -nv &&
wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz -nv;
# Building for SDL here
- if [ "$BUILD_TYPE" == "SDL" ]; then
export SDL2DIR="$TRAVIS_BUILD_DIR/thirdparty/SDL2";
fi
# Building for Emscripten here
- if [ "$BUILD_TYPE" == "Emscripten" ] && [ "$TRAVIS_OS_NAME" == "osx" ]; then
brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc;
fi
install:
- if [ "$BUILD_PSP" == "YES" ]; then
tar -x --xz -f sdk.lzma;
fi
- if [ "$BUILD_ANDROID" == "YES" ]; then
unzip android-ndk-r22-linux-x86_64.zip &&
tar -zxf android-sdk_r24.4.1-linux.tgz &&
$ANDROID list sdk --extended -a &&
echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-23.0.1,android-23 --no-ui --force --no-https;
sudo apt-get install openjdk-8-jdk;
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64;
export PATH=$JAVA_HOME/bin:$PATH;
fi
- |
if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
if [[ -z "$(ls -A ${DEPS_DIR}/cmake/bin)" ]]; then
CMAKE_URL="https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz"
mkdir -p cmake && travis_retry wget --no-check-certificate --quiet -O - "${CMAKE_URL}" | tar --strip-components=1 -xz -C cmake
fi
export PATH="${DEPS_DIR}/cmake/bin:${PATH}"
fi
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then
if ! brew ls --version cmake &>/dev/null; then brew install cmake; fi
fi
- if [ "$BUILD_TYPE" == "PSP" ]; then
tar -x --xz -f sdk.lzma;
fi
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" == "ANDROID" ]; then
jdk_switcher use openjdk7 %%
tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 &&
export ANDROID_NDK=`pwd`/android-ndk-r9 &&
unzip 4e9e88c03f04.zip &&
rm -rf thirdparty/SDL2/* &&
mv ewing-sdl_androidcmake-4e9e88c03f04/* thirdparty/SDL2/ &&
sudo pip install cpp-coveralls &&
sudo apt-get install --force-yes -qq libtinyxml-dev libjpeg-dev libpng-dev libgif-dev libz-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev ant;
fi
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" != "ANDROID" ]; then
jdk_switcher use openjdk7 &&
sudo pip install cpp-coveralls &&
sudo apt-get install --force-yes -qq libtinyxml-dev libjpeg-dev libpng-dev libgif-dev libz-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev ant;
fi
- sudo pip install pyjavaproperties
- sudo pip install github3.py
env:
global:
# - JAVA_HOME=/usr/lib/jvm/java-7-oracle # Force set JVM version to comply with Travis Ant version (1.8.2)
- secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8="
- secure: "X5dTQfofqAutnXxmu11Ep2MQ5QYnMN8m0AITRtwymhEF2UclcOudI1+skPtuhAGbWQnSO+lhunV3cvMfw2/Ml3k/VDz6VdFSKFrzAu7ja1VLJfcxr7chi0s8q30pVBb66tGydjIBac3B+RQyqgmZQW1frbRrhC/kPFQ6wPWOJdQ="
- secure: "T97NUPnxCpVZ/c5HH0zfo0FO3DPSRMSmze58ubW5EUTZOjAMtEt+OFdsrNZvUTCugUj2M1agtonZbAbczpaAL+lgZcHDgXgWMkfO0pMnsWX1yyCNqMuE/iTMpJr/xsLQeyWlftWjJLsseQU45abZsd1XVmda/G+ZhrDLF1y55SA="
- curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
- sudo python2 get-pip.py
- sudo python2 -m pip install --upgrade pip
- sudo python2 -m pip install setuptools-rust
- sudo python2 -m pip install pyOpenSSL
- sudo python2 -m pip install pyjavaproperties
- sudo python2 -m pip install github3.py
- sudo python2 -m pip install cpp-coveralls
- sudo python2 -m pip install certifi
before_script:
- export REQUESTS_CA_BUNDLE=/usr/local/lib/python2.7/dist-packages/certifi/cacert.pem
script: "tools/travis-script.sh"
after_success:
- coveralls -b . -e JGE/src -e JGE/include -i projects/mtg/include -i projects/mtg/src --gcov-options '\-lp'
- export VERSION=$(grep "=" projects/mtg/build.number.properties | sed 's/.*=//' | tr -d '\n\t\r ')
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l core.zip -r Wagic-core-$VERSION.zip -b $TRAVIS_BRANCH
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l projects/mtg/Android/bin/Wagic-debug.apk -r Wagic-$VERSION.apk -b $TRAVIS_BRANCH
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l projects/mtg/psprelease.zip -r WagicPSP-$VERSION.zip -b $TRAVIS_BRANCH
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l qt-gui-build/linuxqtrelease.zip -r WagicLinux-$VERSION.zip -b $TRAVIS_BRANCH
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l projects/mtg/CardImageLinks.csv -r CardImageLinks.csv -b $TRAVIS_BRANCH
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" == "Qt" ]; then
coveralls -b . -e JGE/src -e JGE/include -i projects/mtg/include -i projects/mtg/src --gcov-options '\-lp';
fi
- if [ "$BUILD_TYPE" == "ANDROID" ]; then
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l core.zip -r Wagic-core.zip -b $TRAVIS_BRANCH &&
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l build_android/package/bin/Wagic_*.apk -r Wagic-android.apk -b $TRAVIS_BRANCH;
fi
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" == "PSP" ]; then
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l build_psp/psprelease.zip -r Wagic-psp.zip -b $TRAVIS_BRANCH;
fi
- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$BUILD_TYPE" == "iOS" ]; then
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l net.wagic_0.19.2-1_iphoneos-arm.deb -r Wagic-iOS.deb -b $TRAVIS_BRANCH;
fi
- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$BUILD_TYPE" == "Qt" ]; then
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l build_qt_widget/wagic.dmg -r Wagic-macosx.dmg -b $TRAVIS_BRANCH;
fi
- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$BUILD_TYPE" == "Emscripten" ]; then
./tools/deploy-emscripten.sh;
fi

242
CMakeLists.txt Normal file
View File

@@ -0,0 +1,242 @@
cmake_minimum_required(VERSION 4.0)
if(CMAKE_MAJOR_VERSION STRGREATER 3)
cmake_policy(SET CMP0054 NEW)
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeModules)
#this block will fix install prefixes to install everything in a subdirectory
#of cmake_binary_dir if we are on windows/android to make packaging more easy
if(NOT CMAKE_TOOLCHAIN_FILE)
if(WIN32)
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install directory")
else()
set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Install directory")
endif()
else() #we are cross-compiling (psp/android)
#Android: set output folder for platform/android to pick up
set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_BINARY_DIR} CACHE PATH "library output root")
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install directory")
endif()
#set available build types (debug/release)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
if(DEFINED CMAKE_BUILD_TYPE)
set_property( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
endif()
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Application output directory")
project(wagic CXX C)
#todo: somehow determine wagics version
set(WAGIC_VERSION "0.19")
#add standard paths to search for libraries. borrowed from opencv
if(UNIX AND NOT ANDROID)
if(X86_64 OR CMAKE_SIZEOF_VOID_P EQUAL 8)
if(EXISTS /lib64)
list(APPEND CMAKE_LIBRARY_PATH /lib64)
else()
list(APPEND CMAKE_LIBRARY_PATH /lib)
endif()
if(EXISTS /usr/lib64)
list(APPEND CMAKE_LIBRARY_PATH /usr/lib64)
else()
list(APPEND CMAKE_LIBRARY_PATH /usr/lib)
endif()
elseif(X86 OR CMAKE_SIZEOF_VOID_P EQUAL 4)
if(EXISTS /lib32)
list(APPEND CMAKE_LIBRARY_PATH /lib32)
else()
list(APPEND CMAKE_LIBRARY_PATH /lib)
endif()
if(EXISTS /usr/lib32)
list(APPEND CMAKE_LIBRARY_PATH /usr/lib32)
else()
list(APPEND CMAKE_LIBRARY_PATH /usr/lib)
endif()
endif()
endif()
if(ANDROID OR PSP OR IOS)
#to allow finding of pathes/headers/libs within the source tree
#even if only search for target platform libs
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SOURCE_DIR} ${CMAKE_FIND_ROOT_PATH})
endif()
#also borrowed from opencv
if(MINGW)
if(EXISTS /mingw)
list(APPEND CMAKE_INCLUDE_PATH /mingw)
endif()
if(EXISTS /mingw32)
list(APPEND CMAKE_INCLUDE_PATH /mingw32)
endif()
if(EXISTS /mingw64)
list(APPEND CMAKE_INCLUDE_PATH /mingw64)
endif()
endif()
include(utils)
#select the target backend
if(PSP)
WAGIC_OPTION(backend_psp "build for psp" ON)
endif()
if(WIN32 OR ANDROID OR UNIX)
WAGIC_OPTION(backend_sdl "build for sdl" (WIN32 OR ANDROID OR EMSCRIPTEN))
endif()
if(NOT backend_sdl AND UNIX AND NOT ANDROID AND NOT IOS)
WAGIC_OPTION(backend_qt_console "build qt-console version with testsuit" ON)
WAGIC_OPTION(backend_qt_widget "build qt-widget version" OFF)
endif()
#third party build options
WAGIC_OPTION(BUILD_ZLIB "build zlib from source" ((NOT MINGW) AND (WIN32 OR APPLE)))
WAGIC_OPTION(BUILD_JPEG "build jpeg from source" (WIN32 OR APPLE OR PSP OR ANDROID OR EMSCRIPTEN))
WAGIC_OPTION(BUILD_PNG "build png from source" (WIN32 OR APPLE OR PSP OR ANDROID OR EMSCRIPTEN))
WAGIC_OPTION(BUILD_UNZIP "build unzip from source" ON)
WAGIC_OPTION(BUILD_TINYXML "build tinyxml from source" (WIN32 OR APPLE OR PSP OR ANDROID OR EMSCRIPTEN OR IOS))
WAGIC_OPTION(BUILD_ZIPFS "build zipfs from source" ON)
WAGIC_OPTION(BUILD_SDL2 "build SDL2 from source" (backend_sdl AND (UNIX OR WIN32 OR ANDROID) AND (NOT EMSCRIPTEN AND NOT IOS)))
#WAGIC_OPTION(BUILD_CURL "build curl from source" (backend_sdl AND WIN32))
#project options
if(ANDROID)
WAGIC_OPTION(BUILD_ANDROID_PACKAGE "put the compiled code in an android package" ON)
endif()
if(ANDROID)
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}")
set(3P_LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}")
set(WAGIC_LIB_INSTALL_PATH sdk/native/libs/${ANDROID_NDK_ABI_NAME})
set(WAGIC_3P_LIB_INSTALL_PATH sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME})
set(WAGIC_CONFIG_INSTALL_PATH sdk/native/jni)
set(WAGIC_INCLUDE_INSTALL_PATH sdk/native/jni/include)
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/package/bin")
else()
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib")
set(3P_LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}")
set(WAGIC_LIB_INSTALL_PATH lib${LIB_SUFFIX})
set(WAGIC_3P_LIB_INSTALL_PATH share/wagic/3rdparty/${WAGIC_LIB_INSTALL_PATH})
set(WAGIC_INCLUDE_INSTALL_PATH "include")
set(WAGIC_CONFIG_INSTALL_PATH share/wagic)
endif()
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${WAGIC_LIB_INSTALL_PATH}")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
#if no build type is specified, we assume debug
if(CMAKE_GENERATOR MATCHES "Makefiles|Ninja" AND "${CMAKE_BUILD_TYPE}" STREQUAL "")
set(CMAKE_BUILD_TYPE Debug)
endif()
include(FindOrBuild)
#set platform dependend configurations
if(PSP)
FindOrBuildPSPSDK()
include(platforms/psp/configure.cmake)
elseif(EMSCRIPTEN)
include(platforms/emscripten/configure.cmake)
elseif(WIN32)
include(platforms/win/configure.cmake)
elseif(APPLE)
include(platforms/macosx/configure.cmake)
elseif(UNIX AND NOT ANDROID)
include(platforms/unix/configure.cmake)
elseif(ANDROID)
include(platforms/android/configure.cmake)
endif()
#set backend dependend configurations
if(backend_qt_console OR backend_qt_widget)
add_definitions(-DQT_CONFIG)
if(backend_qt_console)
add_definitions(-DTESTSUITE -D_DEBUG)
add_definitions(-DCONSOLE_CONFIG -DCAPTURE_STDERR)
endif()
elseif(backend_sdl)
add_definitions(-DSDL_CONFIG)
endif()
# find or build 3rd party libraries
FindOrBuildZLIB()
FindOrBuildOpenGL()
FindOrBuildTinyXML()
FindOrBuildZipFS()
FindOrBuildUNZIP()
FindOrBuildPNG()
FindOrBuildJPEG()
FindOrBuildBoost()
#FindOrBuildCurl()
if(PSP)
FindOrBuildGIF()
endif()
if(ANDROID)
FindOrBuildOpenSL()
endif()
if(backend_sdl)
FindOrBuildSDL2()
endif()
if(backend_psp)
FindOrBuildFreetype()
FindOrBuildHgeTools()
FindOrBuildMikMod()
endif()
if(backend_qt_console OR backend_qt_widget)
FindOrBuildQt()
endif()
if(ANDROID)
include(DetectAndroidSDK)
endif()
if(BUILD_ANDROID_PACKAGE)
find_package(Ant REQUIRED)
endif()
#add jge and mtg projects
add_subdirectory(JGE)
add_subdirectory(projects/mtg)
if(BUILD_ANDROID_PACKAGE)
add_subdirectory(platforms/android/package)
endif()
if(EMSCRIPTEN)
set(CMAKE_EXECUTABLE_SUFFIX ".html")
endif()
if(IOS)
list_add_prefix(JGE_SOURCES " JGE/")
list_add_prefix(MTG_generic_src " projects/mtg/")
list_add_prefix(JGE_INCLUDE_DIRS " -IJGE/")
list_add_prefix(MTG_INCLUDE_DIRS " -Iprojects/mtg/")
list_add_prefix(TINYXML_SRC " thirdparty/tinyxml/")
list_add_prefix(UNZIP_SRC " thirdparty/unzip/")
list_add_prefix(ZIPFS_SRC " thirdparty/zipFS/")
file(WRITE makefile.ios
"ARCHS= armv7 armv7s \n"
"include ${THEOS_PATH}/makefiles/common.mk\n"
"TARGET= iphone:clang:latest:8.0 \n"
"APPLICATION_NAME = " ${PROJECT_NAME} "\n"
${PROJECT_NAME} "_FILES =" ${ZIPFS_SRC} ${UNZIP_SRC} ${TINYXML_SRC} ${JGE_SOURCES} ${MTG_generic_src} " thirdparty/Boost/lib/pthread/once.cpp thirdparty/Boost/lib/pthread/thread.cpp\n"
${PROJECT_NAME} "_LDFLAGS = -lz\n"
${PROJECT_NAME} "_FRAMEWORKS = UIKit CoreGraphics OpenGLES Foundation CFNetwork MobileCoreServices AVFoundation OpenAL AudioToolbox QuartzCore SystemConfiguration\n"
"include ${THEOS_PATH}/makefiles/application.mk\n"
"ADDITIONAL_CFLAGS = " ${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} " -I" ${ZIPFS_INCLUDE_DIR} " -I" ${UNZIP_INCLUDE_DIR} " -I" ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} " -I" ${ZLIB_INCLUDE_DIRS} ${BOOST_INCLUDE_DIRS} " "
"-DIOS -D__arm__ -DTIXML_USE_STL -DVERSION=\"$(GIT_VERSION)\" "
"-Wno-parentheses-equality -Wno-delete-non-virtual-dtor "
"-Wno-tautological-undefined-compare -Wno-undefined-bool-conversion "
"-Wno-visibility -Wno-deprecated-declarations -Wno-non-literal-null-conversion "
"-Wno-format -Wno-distributed-object-modifiers -Wno-missing-braces -Wno-uninitialized "
"-Wno-unused-const-variable -Wno-unused-function -Wno-unknown-warning-option -Wno-unused-local-typedef "
"-x objective-c++ \n"
"_THEOS_TARGET_ONLY_OBJCFLAGS :=\"\"\n"
)
endif()

View File

@@ -0,0 +1,373 @@
if(EXISTS "${ANDROID_EXECUTABLE}")
set(ANDROID_SDK_DETECT_QUIET TRUE)
endif()
file(TO_CMAKE_PATH "$ENV{ProgramFiles}" ProgramFiles_ENV_PATH)
file(TO_CMAKE_PATH "$ENV{HOME}" HOME_ENV_PATH)
if(CMAKE_HOST_WIN32)
set(ANDROID_SDK_OS windows)
elseif(CMAKE_HOST_APPLE)
set(ANDROID_SDK_OS macosx)
else()
set(ANDROID_SDK_OS linux)
endif()
#find android SDK: search in ANDROID_SDK first
find_host_program(ANDROID_EXECUTABLE
NAMES android.bat android
PATH_SUFFIXES tools
PATHS
ENV ANDROID_SDK
DOC "Android SDK location"
NO_DEFAULT_PATH
)
# Now search default paths
find_host_program(ANDROID_EXECUTABLE
NAMES android.bat android
PATH_SUFFIXES android-sdk-${ANDROID_SDK_OS}/tools
android-sdk-${ANDROID_SDK_OS}_x86/tools
android-sdk-${ANDROID_SDK_OS}_86/tools
android-sdk/tools
PATHS /opt
"${HOME_ENV_PATH}/NVPACK"
"$ENV{SystemDrive}/NVPACK"
"${ProgramFiles_ENV_PATH}/Android"
DOC "Android SDK location"
)
if(ANDROID_EXECUTABLE)
if(NOT ANDROID_SDK_DETECT_QUIET)
message(STATUS "Found android tool: ${ANDROID_EXECUTABLE}")
endif()
get_filename_component(ANDROID_SDK_TOOLS_PATH "${ANDROID_EXECUTABLE}" PATH)
#read source.properties
if(EXISTS "${ANDROID_SDK_TOOLS_PATH}/source.properties")
file(STRINGS "${ANDROID_SDK_TOOLS_PATH}/source.properties" ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES REGEX "^[ ]*[^#].*$")
foreach(line ${ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES})
string(REPLACE "\\:" ":" line ${line})
string(REPLACE "=" ";" line ${line})
list(GET line 0 line_name)
list(GET line 1 line_value)
string(REPLACE "." "_" line_name ${line_name})
SET(ANDROID_TOOLS_${line_name} "${line_value}" CACHE INTERNAL "from ${ANDROID_SDK_TOOLS_PATH}/source.properties")
MARK_AS_ADVANCED(ANDROID_TOOLS_${line_name})
endforeach()
endif()
#fix missing revision (SDK tools before r9 don't set revision number correctly)
if(NOT ANDROID_TOOLS_Pkg_Revision)
SET(ANDROID_TOOLS_Pkg_Revision "Unknown" CACHE INTERNAL "")
MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Revision)
endif()
#fix missing description
if(NOT ANDROID_TOOLS_Pkg_Desc)
SET(ANDROID_TOOLS_Pkg_Desc "Android SDK Tools, revision ${ANDROID_TOOLS_Pkg_Revision}." CACHE INTERNAL "")
MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Desc)
endif()
#warn about outdated SDK
if(NOT ANDROID_TOOLS_Pkg_Revision GREATER 13)
SET(ANDROID_TOOLS_Pkg_Desc "${ANDROID_TOOLS_Pkg_Desc} It is recommended to update your SDK tools to revision 14 or newer." CACHE INTERNAL "")
endif()
if(ANDROID_TOOLS_Pkg_Revision GREATER 13)
SET(ANDROID_PROJECT_PROPERTIES_FILE project.properties)
SET(ANDROID_ANT_PROPERTIES_FILE ant.properties)
else()
SET(ANDROID_PROJECT_PROPERTIES_FILE default.properties)
SET(ANDROID_ANT_PROPERTIES_FILE build.properties)
endif()
set(ANDROID_MANIFEST_FILE AndroidManifest.xml)
set(ANDROID_LIB_PROJECT_FILES build.xml local.properties proguard-project.txt ${ANDROID_PROJECT_PROPERTIES_FILE})
set(ANDROID_PROJECT_FILES ${ANDROID_LIB_PROJECT_FILES})
#get installed targets
if(ANDROID_TOOLS_Pkg_Revision GREATER 11)
execute_process(COMMAND ${ANDROID_EXECUTABLE} list target -c
RESULT_VARIABLE ANDROID_PROCESS
OUTPUT_VARIABLE ANDROID_SDK_TARGETS
ERROR_VARIABLE ANDROID_PROCESS_ERRORS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(REGEX MATCHALL "[^\n]+" ANDROID_SDK_TARGETS "${ANDROID_SDK_TARGETS}")
else()
#old SDKs (r11 and older) don't provide compact list
execute_process(COMMAND ${ANDROID_EXECUTABLE} list target
RESULT_VARIABLE ANDROID_PROCESS
OUTPUT_VARIABLE ANDROID_SDK_TARGETS_FULL
ERROR_VARIABLE ANDROID_PROCESS_ERRORS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(REGEX MATCHALL "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" ANDROID_SDK_TARGETS_FULL "${ANDROID_SDK_TARGETS_FULL}")
SET(ANDROID_SDK_TARGETS "")
if(ANDROID_PROCESS EQUAL 0)
foreach(line ${ANDROID_SDK_TARGETS_FULL})
string(REGEX REPLACE "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" "\\2" line "${line}")
list(APPEND ANDROID_SDK_TARGETS "${line}")
endforeach()
endif()
endif()
if(NOT ANDROID_PROCESS EQUAL 0)
message(ERROR "Failed to get list of installed Android targets.")
set(ANDROID_EXECUTABLE "ANDROID_EXECUTABLE-NOTFOUND")
endif()
# clear ANDROID_SDK_TARGET if no target is provided by user
if(NOT ANDROID_SDK_TARGET)
set(ANDROID_SDK_TARGET "" CACHE STRING "Android SDK target for the Wagic Java API and samples")
endif()
if(ANDROID_SDK_TARGETS)
set_property( CACHE ANDROID_SDK_TARGET PROPERTY STRINGS ${ANDROID_SDK_TARGETS} )
endif()
endif(ANDROID_EXECUTABLE)
# finds minimal installed SDK target compatible with provided names or API levels
# usage:
# get_compatible_android_api_level(VARIABLE [level1] [level2] ...)
macro(android_get_compatible_target VAR)
set(${VAR} "${VAR}-NOTFOUND")
if(ANDROID_SDK_TARGETS)
list(GET ANDROID_SDK_TARGETS 0 __lvl)
string(REGEX MATCH "[0-9]+$" __lvl "${__lvl}")
#find minimal level mathing to all provided levels
foreach(lvl ${ARGN})
string(REGEX MATCH "[0-9]+$" __level "${lvl}")
if(__level GREATER __lvl)
set(__lvl ${__level})
endif()
endforeach()
#search for compatible levels
foreach(lvl ${ANDROID_SDK_TARGETS})
string(REGEX MATCH "[0-9]+$" __level "${lvl}")
if(__level EQUAL __lvl)
#look for exact match
foreach(usrlvl ${ARGN})
if("${usrlvl}" STREQUAL "${lvl}")
set(${VAR} "${lvl}")
break()
endif()
endforeach()
if("${${VAR}}" STREQUAL "${lvl}")
break() #exact match was found
elseif(NOT ${VAR})
set(${VAR} "${lvl}")
endif()
elseif(__level GREATER __lvl)
if(NOT ${VAR})
set(${VAR} "${lvl}")
endif()
break()
endif()
endforeach()
unset(__lvl)
unset(__level)
endif()
endmacro()
unset(__android_project_chain CACHE)
# add_android_project(target_name ${path} NATIVE_DEPS opencv_core LIBRARY_DEPS ${Wagic_BINARY_DIR} SDK_TARGET 11)
macro(add_android_project target path)
# parse arguments
set(android_proj_arglist NATIVE_DEPS LIBRARY_DEPS SDK_TARGET IGNORE_JAVA IGNORE_MANIFEST)
set(__varname "android_proj_")
foreach(v ${android_proj_arglist})
set(${__varname}${v} "")
endforeach()
foreach(arg ${ARGN})
set(__var "${__varname}")
foreach(v ${android_proj_arglist})
if("${v}" STREQUAL "${arg}")
set(__varname "android_proj_${v}")
break()
endif()
endforeach()
if(__var STREQUAL __varname)
list(APPEND ${__var} "${arg}")
endif()
endforeach()
# get compatible SDK target
android_get_compatible_target(android_proj_sdk_target ${ANDROID_NATIVE_API_LEVEL} ${android_proj_SDK_TARGET})
if(NOT android_proj_sdk_target)
message(WARNING "Can not find any SDK target compatible with: ${ANDROID_NATIVE_API_LEVEL} ${android_proj_SDK_TARGET}
The project ${target} will not be build")
endif()
# check native dependencies
if(android_proj_IGNORE_JAVA)
ocv_check_dependencies(${android_proj_NATIVE_DEPS})
else()
ocv_check_dependencies(${android_proj_NATIVE_DEPS} opencv_java)
endif()
if(EXISTS "${path}/jni/Android.mk" )
# find if native_app_glue is used
file(STRINGS "${path}/jni/Android.mk" NATIVE_APP_GLUE REGEX ".*(call import-module,android/native_app_glue)" )
if(NATIVE_APP_GLUE)
if(ANDROID_NATIVE_API_LEVEL LESS 9 OR NOT EXISTS "${ANDROID_NDK}/sources/android/native_app_glue")
set(OCV_DEPENDENCIES_FOUND FALSE)
endif()
endif()
endif()
if(OCV_DEPENDENCIES_FOUND AND android_proj_sdk_target AND ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND ANDROID_TOOLS_Pkg_Revision GREATER 13 AND EXISTS "${path}/${ANDROID_MANIFEST_FILE}")
project(${target})
set(android_proj_bin_dir "${CMAKE_CURRENT_BINARY_DIR}/.build")
# get project sources
file(GLOB_RECURSE android_proj_files RELATIVE "${path}" "${path}/res/*" "${path}/src/*")
if(NOT android_proj_IGNORE_MANIFEST)
list(APPEND android_proj_files ${ANDROID_MANIFEST_FILE})
endif()
# copy sources out from the build tree
set(android_proj_file_deps "")
foreach(f ${android_proj_files})
add_custom_command(
OUTPUT "${android_proj_bin_dir}/${f}"
COMMAND ${CMAKE_COMMAND} -E copy "${path}/${f}" "${android_proj_bin_dir}/${f}"
MAIN_DEPENDENCY "${path}/${f}"
COMMENT "Copying ${f}")
list(APPEND android_proj_file_deps "${path}/${f}" "${android_proj_bin_dir}/${f}")
endforeach()
set(android_proj_lib_deps_commands "")
set(android_proj_target_files ${ANDROID_PROJECT_FILES})
ocv_list_add_prefix(android_proj_target_files "${android_proj_bin_dir}/")
# process Android library dependencies
foreach(dep ${android_proj_LIBRARY_DEPS})
file(RELATIVE_PATH __dep "${android_proj_bin_dir}" "${dep}")
list(APPEND android_proj_lib_deps_commands
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${android_proj_bin_dir}" --library "${__dep}")
endforeach()
# fix Android project
add_custom_command(
OUTPUT ${android_proj_target_files}
COMMAND ${CMAKE_COMMAND} -E remove ${android_proj_target_files}
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${android_proj_bin_dir}" --target "${android_proj_sdk_target}" --name "${target}"
${android_proj_lib_deps_commands}
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
DEPENDS "${path}/${ANDROID_MANIFEST_FILE}"
COMMENT "Updating Android project at ${path}. SDK target: ${android_proj_sdk_target}"
)
list(APPEND android_proj_file_deps ${android_proj_target_files})
# build native part
file(GLOB_RECURSE android_proj_jni_files "${path}/jni/*.c" "${path}/jni/*.h" "${path}/jni/*.cpp" "${path}/jni/*.hpp")
ocv_list_filterout(android_proj_jni_files "\\\\.svn")
if(android_proj_jni_files AND EXISTS ${path}/jni/Android.mk AND NOT DEFINED JNI_LIB_NAME)
# find local module name in Android.mk file to build native lib
file(STRINGS "${path}/jni/Android.mk" JNI_LIB_NAME REGEX "LOCAL_MODULE[ ]*:=[ ]*.*" )
string(REGEX REPLACE "LOCAL_MODULE[ ]*:=[ ]*([a-zA-Z_][a-zA-Z_0-9]*)[ ]*" "\\1" JNI_LIB_NAME "${JNI_LIB_NAME}")
if(JNI_LIB_NAME)
ocv_include_modules_recurse(${android_proj_NATIVE_DEPS})
ocv_include_directories("${path}/jni")
if(NATIVE_APP_GLUE)
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
list(APPEND android_proj_jni_files ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
ocv_warnings_disable(CMAKE_C_FLAGS -Wstrict-prototypes -Wunused-parameter -Wmissing-prototypes)
set(android_proj_NATIVE_DEPS ${android_proj_NATIVE_DEPS} android)
endif()
add_library(${JNI_LIB_NAME} MODULE ${android_proj_jni_files})
target_link_libraries(${JNI_LIB_NAME} ${OPENCV_LINKER_LIBS} ${android_proj_NATIVE_DEPS})
set_target_properties(${JNI_LIB_NAME} PROPERTIES
OUTPUT_NAME "${JNI_LIB_NAME}"
LIBRARY_OUTPUT_DIRECTORY "${android_proj_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}"
)
get_target_property(android_proj_jni_location "${JNI_LIB_NAME}" LOCATION)
if (NOT (CMAKE_BUILD_TYPE MATCHES "debug"))
add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}")
endif()
endif()
endif()
# build java part
if(android_proj_IGNORE_JAVA)
add_custom_command(
OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
WORKING_DIRECTORY "${android_proj_bin_dir}"
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
else()
add_custom_command(
OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
WORKING_DIRECTORY "${android_proj_bin_dir}"
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
DEPENDS "${Wagic_BINARY_DIR}/bin/classes.jar.dephelper" opencv_java # as we are part of Wagic we can just force this dependency
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
endif()
unset(JNI_LIB_NAME)
add_custom_target(${target} ALL SOURCES "${android_proj_bin_dir}/bin/${target}-debug.apk" )
if(NOT android_proj_IGNORE_JAVA)
add_dependencies(${target} opencv_java)
endif()
if(android_proj_native_deps)
add_dependencies(${target} ${android_proj_native_deps})
endif()
if(__android_project_chain)
add_dependencies(${target} ${__android_project_chain})
endif()
set(__android_project_chain ${target} CACHE INTERNAL "auxiliary variable used for Android progects chaining")
# put the final .apk to the Wagic's bin folder
add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${android_proj_bin_dir}/bin/${target}-debug.apk" "${Wagic_BINARY_DIR}/bin/${target}.apk")
if(INSTALL_ANDROID_EXAMPLES AND "${target}" MATCHES "^example-")
#apk
install(FILES "${Wagic_BINARY_DIR}/bin/${target}.apk" DESTINATION "samples" COMPONENT main)
get_filename_component(sample_dir "${path}" NAME)
#java part
list(REMOVE_ITEM android_proj_files ${ANDROID_MANIFEST_FILE})
foreach(f ${android_proj_files} ${ANDROID_MANIFEST_FILE})
get_filename_component(install_subdir "${f}" PATH)
install(FILES "${android_proj_bin_dir}/${f}" DESTINATION "samples/${sample_dir}/${install_subdir}" COMPONENT main)
endforeach()
#jni part + eclipse files
file(GLOB_RECURSE jni_files RELATIVE "${path}" "${path}/jni/*" "${path}/.cproject")
ocv_list_filterout(jni_files "\\\\.svn")
foreach(f ${jni_files} ".classpath" ".project" ".settings/org.eclipse.jdt.core.prefs")
get_filename_component(install_subdir "${f}" PATH)
install(FILES "${path}/${f}" DESTINATION "samples/${sample_dir}/${install_subdir}" COMPONENT main)
endforeach()
#update proj
if(android_proj_lib_deps_commands)
set(inst_lib_opt " --library ../../sdk/java")
endif()
install(CODE "EXECUTE_PROCESS(COMMAND ${ANDROID_EXECUTABLE} --silent update project --path . --target \"${android_proj_sdk_target}\" --name \"${target}\" ${inst_lib_opt}
WORKING_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/samples/${sample_dir}\"
)" COMPONENT main)
#empty 'gen'
install(CODE "MAKE_DIRECTORY(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/samples/${sample_dir}/gen\")" COMPONENT main)
endif()
endif()
endmacro()

View File

@@ -0,0 +1,13 @@
find_host_program(ANT_EXECUTABLE "ant")
if(ANT_EXECUTABLE)
set(ANT_FOUND ON)
else()
set(ANT_FOUND OFF)
endif()
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ANT REQUIRED_VARS ANT_EXECUTABLE)
mark_as_advanced(ANT_EXECUTABLE ANT_FOUND)

View File

@@ -0,0 +1,29 @@
# - Find OpenSL (actually OpenSLES)
# Find the OpenSLES includes and libraries
#
# OPENSL_INCLUDE_DIR - where to find dsound.h
# OPENSL_LIBRARIES - List of libraries when using dsound.
# OPENSL_FOUND - True if dsound found.
if(OPENSL_INCLUDE_DIR)
# Already in cache, be silent
set(OPENSL_FIND_QUIETLY TRUE)
endif(OPENSL_INCLUDE_DIR)
find_path(OPENSL_INCLUDE_DIR SLES/OpenSLES.h)
find_library(OPENSL_LIBRARY NAMES OpenSLES)
# Handle the QUIETLY and REQUIRED arguments and set OPENSL_FOUND to TRUE if
# all listed variables are TRUE.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(OPENSL DEFAULT_MSG
OPENSL_INCLUDE_DIR OPENSL_LIBRARY)
if(OPENSL_FOUND)
set(OPENSL_LIBRARIES ${OPENSL_LIBRARY})
else(OPENSL_FOUND)
set(OPENSL_LIBRARIES)
endif(OPENSL_FOUND)
mark_as_advanced(OPENSL_INCLUDE_DIR OPENSL_LIBRARY)

View File

@@ -0,0 +1,267 @@
macro(FindOrBuildZipFS)
if(BUILD_ZIPFS)
add_subdirectory(
${CMAKE_SOURCE_DIR}/thirdparty/zipFS
${CMAKE_BINARY_DIR}/thirdparty/zipFS)
set(ZIPFS_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/zipFS)
set(ZIPFS_LIBRARY zipFS)
else()
message(WARNING "ZIPFS must get build")
endif()
endmacro()
macro(FindOrBuildTinyXML)
if(BUILD_TINYXML)
add_definitions(-DTIXML_USE_STL)
add_subdirectory(
${CMAKE_SOURCE_DIR}/thirdparty/tinyxml
${CMAKE_BINARY_DIR}/thirdparty/tinyxml)
set(TINYXML_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/tinyxml)
set(TINYXML_LIBRARIES tinyxml)
else()
find_package(TinyXML REQUIRED)
endif()
endmacro()
macro(FindOrBuildSDL2)
if(BUILD_SDL2)
if(WIN32)
#SDL2 DirectX build is somehow broken...
set(SDL_AUDIO FALSE)
set(SDL_JOYSTICK FALSE)
set(SDL_HAPTIC FALSE)
# Forcing static build on Windows as SDL2main is often needed and easier to link statically.
# Set SDL_SHARED to OFF *before* adding the subdirectory to influence its build.
set(SDL_SHARED OFF CACHE BOOL "Build SDL2 as a static library" FORCE)
endif()
# Add the subdirectory. This creates targets like SDL2::SDL2, SDL2::SDL2-static, SDL2::SDL2main
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/SDL2 ${CMAKE_BINARY_DIR}/thirdparty/SDL2)
set(SDL2_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/SDL2/include ${CMAKE_BINARY_DIR}/thirdparty/SDL2)
# Linking against SDL2::SDL2 below handles includes automatically.
if(EMSCRIPTEN)
# Emscripten typically uses static linking
set(SDL2_LIBRARY SDL2::SDL2-static) # Use the CMake target
else()
# Link against SDL2 (shared or static based on SDL_SHARED) and SDL2main
# SDL2::SDL2 resolves to the correct shared/static target.
# SDL2::SDL2main is needed on many platforms, especially Windows.
set(SDL2_LIBRARY SDL2::SDL2 SDL2::SDL2main) # Use the CMake targets
endif()
elseif(NOT EMSCRIPTEN)
# If not building from source, use the find_package module
find_package(SDL2)
endif()
endmacro()
macro(FindOrBuildUNZIP)
if(BUILD_UNZIP)
add_subdirectory(
${CMAKE_SOURCE_DIR}/thirdparty/unzip
${CMAKE_BINARY_DIR}/thirdparty/unzip)
set(UNZIP_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/unzip)
set(UNZIP_LIBRARY unzip)
else()
message(WARNING "UNZIP must get build")
endif()
endmacro()
macro(FindOrBuildBoost)
if(PSP OR UNIX OR WIN32 OR IOS)
#the psp build does not need more than a few headers
#todo: remove from the repository
set(BOOST_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/Boost)
# elseif(WIN32)
#set BOOST_ROOT to the root of boost
# set(Boost_USE_STATIC_LIBS ON)
# set(Boost_USE_MULTITHREADED ON)
# set(BOOST_ROOT $ENV{BOOST_ROOT})
# set(BOOST_LIBRARYDIR ${BOOST_ROOT}/libs)
# set(BOOST_INCLUDEDIR ${BOOST_ROOT})
# find_package(Boost COMPONENTS system thread date_time REQUIRED)
# if(NOT Boost_FOUND)
# message("Set the BOOST_ROOT environment variable to point to your boost installation.")
# message("We need system thread and date_time compiled static libs")
# message("These libs are compiler specific.")
# endif()
# elseif(UNIX AND NOT ANDROID)
# find_package(Boost COMPONENTS system thread date_time REQUIRED)
elseif(ANDROID)
#this is a hack. we compile a few boost libds directly into
#the application. we should require static libs for android
#to be available. maybe we could add the build option to
#download and build a compatible boost version
find_path(BOOST_INCLUDE_DIRS NAMES bind.hpp HINTS $ENV{ANDROID_BOOST_ROOT} PATH_SUFFIXES boost)
if(BOOST_INCLUDE_DIRS)
get_filename_component(BOOST_INCLUDE_DIRS ${BOOST_INCLUDE_DIRS} PATH)
set(ANDROID_BOOST_PTHREAD_SRC_DIR ${BOOST_INCLUDE_DIRS}/libs/thread/src/pthread)
set(ANDROID_BOOST_SYSTEM_SRC_DIR ${BOOST_INCLUDE_DIRS}/libs/system/src/)
else()
message(SEND_ERROR "We require a few boost sources to get compiled into wagic. Please point the ANDROID_BOOST_ROOT environment variable to a boost-source copy root.")
endif()
endif()
endmacro()
macro(FindOrBuildZLIB)
if(BUILD_ZLIB)
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/zlib ${CMAKE_BINARY_DIR}/thirdparty/zlib)
set(ZLIB_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/zlib)
set(ZLIB_LIBRARIES ZLIB::ZLIBSTATIC)
else()
if(WIN32 AND NOT MINGW)
set(ZLIB_ROOT ${CMAKE_SOURCE_DIR}/thirdparty/binary/win)
find_package(ZLIB)
else()
if(MINGW)
set(ZLIB_USE_STATIC_LIBS TRUE)
find_package(ZLIB REQUIRED)
else()
if(backend_qt_console OR backend_qt_widget OR EMSCRIPTEN)
set(ZLIB_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/zlib)
else()
find_package(ZLIB)
endif()
endif()
endif()
endif()
endmacro()
macro(FindOrBuildGIF)
if(BUILD_GIF)
message(WARNING "GIF sources are currently not included within the wagic tree")
else()
if(PSP)
find_package(GIF)
endif()
endif()
endmacro()
macro(FindOrBuildJPEG)
if(BUILD_JPEG)
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/libjpeg ${CMAKE_BINARY_DIR}/thirdparty/libjpeg)
set(JPEG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/libjpeg)
set(JPEG_LIBRARY jpeg)
else()
if(WIN32)
#findJPEG does currently not provide prefix vars to guide it
find_path(JPEG_INCLUDE_DIR jpeglib.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
find_library(JPEG_LIBRARY NAMES libjpeg-static-mt HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/lib)
if(JPEG_INCLUDE_DIR AND JPEG_LIBRARY)
set(JPEG_FOUND ON)
mark_as_advanced(JPEG_INCLUDE_DIR JPEG_LIBRARY)
else()
message(FATAL_ERROR "Could not find JPEG on windows")
endif()
else()
find_package(JPEG)
endif()
endif()
endmacro()
macro(FindOrBuildPNG)
if(BUILD_PNG)
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/libpng ${CMAKE_BINARY_DIR}/thirdparty/libpng)
set(PNG_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/libpng)
# find_path(PNG_INCLUDE_DIRS NAMES png.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/libpng)
set(PNG_LIBRARIES png)
else()
if(WIN32)
#findPNG does currently not provide prefix vars. so we find
find_path(PNG_INCLUDE_DIRS png.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
find_library(PNG_LIBRARIES libpng HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/lib)
if (PNG_LIBRARIES AND PNG_INCLUDE_DIRS)
set(PNG_FOUND ON)
mark_as_advanced(PNG_INCLUDE_DIRS PNG_LIBRARIES)
else()
message(FATAL_ERROR "Could not find PNG on windows")
endif()
else()
find_package(PNG)
endif()
endif()
endmacro()
macro(FindOrBuildCurl)
if(BUILD_CURL)
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/curl ${CMAKE_BINARY_DIR}/thirdparty/curl)
set(CURL curl_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/curl)
set(CURL_LIBRARIES curl)
else()
if(WIN32)
#findPNG does currently not provide prefix vars. so we find
find_path(CURL CURL_INCLUDE_DIRS curl.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
find_library(CURL_LIBRARIES libcurl HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/lib)
if (CURL_LIBRARIES AND CURL_INCLUDE_DIRS)
set(CURL_FOUND ON)
mark_as_advanced(CURL_INCLUDE_DIRS CURL_LIBRARIES)
else()
message(FATAL_ERROR "Could not find CURL on windows")
endif()
else()
find_package(CURL)
endif()
endif()
endmacro()
macro(FindOrBuildFreetype)
if(PSP)
set(ENV{FREETYPE_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include)
set(ENV{FREETYPE_LIBRARIES} freetype)
endif()
endmacro()
macro(FindOrBuildHgeTools)
if(PSP)
find_library(HGETOOLS_LIBRARY NAMES hgetools HINTS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib")
set(HGETOOLS_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include")
endif()
endmacro()
macro(FindOrBuildMikMod)
if(PSP)
find_library(MIKMOD_LIBRARY NAMES mikmod HINTS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib")
set(MIKMOD_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include")
endif()
endmacro()
macro(FindOrBuildQt)
if(backend_qt_console)
add_definitions(-DCONSOLE_CONFIG -DTESTSUITE)
find_package(Qt5Core REQUIRED)
find_package(Qt5 COMPONENTS Core Network Multimedia REQUIRED)
elseif(backend_qt_widget)
add_definitions(-DQT_WIDGET)
find_package(OpenGL REQUIRED)
find_package(X11 REQUIRED)
find_package(Qt5 COMPONENTS Core Gui OpenGL Network Multimedia REQUIRED)
endif()
# include(${QT_USE_FILE})
endmacro()
macro(FindOrBuildOpenGL)
if(backend_sdl OR backend_qt_console OR backend_qt_widget)
if(ANDROID)
#find openglesv on android
set(OPENGL_LIBRARIES "-ldl -lGLESv1_CM -lGLESv2 -llog -landroid")
elseif(EMSCRIPTEN)
set(OPENGL_LIBRARIES "")
else()
find_package(OpenGL)
# find_package(GLUT)
endif()
endif()
endmacro()
macro(FindOrBuildOpenSL)
find_package(OpenSL)
endmacro()
macro(FindOrBuildPSPSDK)
find_package(PSPSDK COMPONENTS psppower pspmpeg pspaudiocodec pspaudiolib pspaudio pspmp3 pspgum pspgu psprtc pspfpu REQUIRED)
endmacro()

View File

@@ -0,0 +1,62 @@
# - Try to find PSPSDK
# Once done this will define
# PSPSDK_FOUND - System has PSPSDK
# PSPSDK_INCLUDE_DIR - The PSPSDK include directories
# PSPSDK_LIB - The libraries requested with the components field
# PSPSDK_REQUIRED_LIB - The libriries the PSPSDK needs always
# PSPSDK_CFLAGS - The CFLAGS to use
# PSPSDK_PATH - The output of psp-config --pspsdk-path
# PSPSDK_PREFIX - The output of psp-config --psp-prefix
# PSPSDK_CXX_COMPILER - The PSPSDK CXX Compilers path
# PSPSDK_CXX_LINKER - The PSPSDK CXX Linker command
# PSPSDK_FIXUP_IMPORTS_COMMAND - psp-fixup-imports command
# PSPSDK_PRXGEN_COMMAND - psp-prxgen command
# PSPSDK_PACK_PBP_COMMAND - pack-pbp command
# PSPSDK_MKSFO_COMMAND - mksfo command
#find the psp-config progams absolute path
#psp-config needs to be reachable via the system shell (PATH)
find_program(PSP_CONFIG_PROGRAM psp-config)
#TODO: check if something is REQUIRED and throw errors instead of messages
if(PSP_CONFIG_PROGRAM)
find_program(PSPSDK_CXX_COMPILER psp-g++)
find_program(PSPSDK_CXX_LINKER psp-gcc)
find_program(PSPSDK_FIXUP_IMPORTS_COMMAND psp-fixup-imports)
find_program(PSPSDK_PRXGEN_COMMAND psp-prxgen)
find_program(PSPSDK_PACK_PBP_COMMAND pack-pbp)
find_program(PSPSDK_MKSFO_COMMAND mksfo)
#ask psp-config for the
execute_process(COMMAND psp-config --pspsdk-path OUTPUT_VARIABLE PSPSDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPSDK_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
set(PSPSDK_INCLUDE_DIR "${PSPSDK_PATH}/include")
foreach(_COMPONENT ${PSPSDK_FIND_COMPONENTS})
find_library(PSPSDK_${_COMPONENT} NAMES ${_COMPONENT})
if(NOT PSPSDK_${_COMPONENT})
message(SEND_ERROR "PSPSDK: ${_COMPONENT} not found")
else()
set(PSPSDK_LIB ${PSPSDK_LIB} ${PSPSDK_${_COMPONENT}})
endif()
endforeach()
#find libs which pspsdk does require to link even if the programs does not need one of them directly
foreach(_COMPONENT pspdebug pspdisplay pspge pspctrl pspsdk c pspnet pspnet_inet pspnet_apctl pspnet_resolver psputility pspuser)
find_library(PSPSDK_${_COMPONENT} NAMES ${_COMPONENT})
if(NOT PSPSDK_${_COMPONENT})
message(SEND_ERROR "PSPSDK: ${_COMPONENT} not found")
else()
set(PSPSDK_REQUIRED_LIB ${PSPSDK_REQUIRED_LIB} ${PSPSDK_${_COMPONENT}})
endif()
endforeach()
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBXML2_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(PSPSDK DEFAULT_MSG
PSPSDK_CXX_LINKER PSPSDK_CXX_COMPILER PSPSDK_PATH PSPSDK_PREFIX PSPSDK_LIB PSPSDK_REQUIRED_LIB PSPSDK_INCLUDE_DIR)
mark_as_advanced(PSPSDK_CXX_LINKER PSPSDK_CXX_COMPILER PSPSDK_PATH PSPSDK_PREFIX PSPSDK_LIB PSPSDK_REQUIRED_LIB PSPSDK_INCLUDE_DIR)

181
CMakeModules/FindSDL2.cmake Normal file
View File

@@ -0,0 +1,181 @@
# Locate SDL2 library
# This module defines
# SDL2_LIBRARY, the name of the library to link against
# SDL2_FOUND, if false, do not try to link to SDL2
# SDL2_INCLUDE_DIR, where to find SDL.h
#
# This module responds to the the flag:
# SDL2_BUILDING_LIBRARY
# If this is defined, then no SDL2_main will be linked in because
# only applications need main().
# Otherwise, it is assumed you are building an application and this
# module will attempt to locate and set the the proper link flags
# as part of the returned SDL2_LIBRARY variable.
#
# Don't forget to include SDL2main.h and SDL2main.m your project for the
# OS X framework based version. (Other versions link to -lSDL2main which
# this module will try to find on your behalf.) Also for OS X, this
# module will automatically add the -framework Cocoa on your behalf.
#
#
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library
# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
# as appropriate. These values are used to generate the final SDL2_LIBRARY
# variable, but when these values are unset, SDL2_LIBRARY does not get created.
#
#
# $SDL2DIR is an environment variable that would
# correspond to the ./configure --prefix=$SDL2DIR
# used in building SDL2.
# l.e.galup 9-20-02
#
# Modified by Eric Wing.
# Added code to assist with automated building by using environmental variables
# and providing a more controlled/consistent search behavior.
# Added new modifications to recognize OS X frameworks and
# additional Unix paths (FreeBSD, etc).
# Also corrected the header search path to follow "proper" SDL2 guidelines.
# Added a search for SDL2main which is needed by some platforms.
# Added a search for threads which is needed by some platforms.
# Added needed compile switches for MinGW.
#
# On OSX, this will prefer the Framework version (if found) over others.
# People will have to manually change the cache values of
# SDL2_LIBRARY to override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths.
#
# Note that the header path has changed from SDL2/SDL.h to just SDL.h
# This needed to change because "proper" SDL2 convention
# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
# reasons because not all systems place things in SDL2/ (see FreeBSD).
#
# Ported by Johnny Patterson. This is a literal port for SDL2 of the FindSDL.cmake
# module with the minor edit of changing "SDL" to "SDL2" where necessary. This
# was not created for redistribution, and exists temporarily pending official
# SDL2 CMake modules.
#=============================================================================
# Copyright 2003-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
FIND_PATH(SDL2_INCLUDE_DIR SDL.h
HINTS
$ENV{SDL2DIR}
PATH_SUFFIXES include/SDL2 include
PATHS
~/Library/Frameworks
/Library/Frameworks
/usr/local/include/SDL2
/usr/include/SDL2
/sw # Fink
/opt/local # DarwinPorts
/opt/csw # Blastwave
/opt
)
FIND_LIBRARY(SDL2_LIBRARY_TEMP
NAMES SDL2
HINTS
$ENV{SDL2DIR}
PATH_SUFFIXES lib64 lib
PATHS
/sw
/opt/local
/opt/csw
/opt
)
#MESSAGE("SDL2_LIBRARY_TEMP is ${SDL2_LIBRARY_TEMP}")
IF(NOT SDL2_BUILDING_LIBRARY)
IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
# Non-OS X framework versions expect you to also dynamically link to
# SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
# seem to provide SDL2main for compatibility even though they don't
# necessarily need it.
FIND_LIBRARY(SDL2MAIN_LIBRARY
NAMES SDL2main
HINTS
$ENV{SDL2DIR}
PATH_SUFFIXES lib64 lib
PATHS
/sw
/opt/local
/opt/csw
/opt
)
ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
ENDIF(NOT SDL2_BUILDING_LIBRARY)
# SDL2 may require threads on your system.
# The Apple build may not need an explicit flag because one of the
# frameworks may already provide it.
# But for non-OSX systems, I will use the CMake Threads package.
IF(NOT APPLE)
FIND_PACKAGE(Threads)
ENDIF(NOT APPLE)
# MinGW needs an additional library, mwindows
# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows
# (Actually on second look, I think it only needs one of the m* libraries.)
IF(MINGW)
SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
ENDIF(MINGW)
SET(SDL2_FOUND "NO")
IF(SDL2_LIBRARY_TEMP)
# For SDL2main
IF(NOT SDL2_BUILDING_LIBRARY)
IF(SDL2MAIN_LIBRARY)
SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP})
ENDIF(SDL2MAIN_LIBRARY)
ENDIF(NOT SDL2_BUILDING_LIBRARY)
# For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
# CMake doesn't display the -framework Cocoa string in the UI even
# though it actually is there if I modify a pre-used variable.
# I think it has something to do with the CACHE STRING.
# So I use a temporary variable until the end so I can set the
# "real" variable in one-shot.
IF(APPLE)
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
ENDIF(APPLE)
# For threads, as mentioned Apple doesn't need this.
# In fact, there seems to be a problem if I used the Threads package
# and try using this line, so I'm just skipping it entirely for OS X.
IF(NOT APPLE)
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
ENDIF(NOT APPLE)
# For MinGW library
IF(MINGW)
SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
ENDIF(MINGW)
# Set the final string here so the GUI reflects the final state.
SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found")
# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "")
SET(SDL2_FOUND "YES")
ENDIF(SDL2_LIBRARY_TEMP)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2
REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)
mark_as_advanced(SDL2MAIN_LIBRARY SDL2_LIBRARY SDL2_INCLUDE_DIR)

26
CMakeModules/FindTinyXML.cmake Executable file
View File

@@ -0,0 +1,26 @@
# - Find TinyXML
# Find the native TinyXML includes and library
#
# TINYXML_FOUND - True if TinyXML found.
# TINYXML_INCLUDE_DIR - where to find tinyxml.h, etc.
# TINYXML_LIBRARIES - List of libraries when using TinyXML.
#
IF( TINYXML_INCLUDE_DIR )
# Already in cache, be silent
SET( TinyXML_FIND_QUIETLY TRUE )
ENDIF( TINYXML_INCLUDE_DIR )
FIND_PATH( TINYXML_INCLUDE_DIR "tinyxml.h"
PATH_SUFFIXES "tinyxml" )
FIND_LIBRARY( TINYXML_LIBRARIES
NAMES "tinyxml"
PATH_SUFFIXES "tinyxml" )
# handle the QUIETLY and REQUIRED arguments and set TINYXML_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE( "FindPackageHandleStandardArgs" )
FIND_PACKAGE_HANDLE_STANDARD_ARGS( "TinyXML" DEFAULT_MSG TINYXML_INCLUDE_DIR TINYXML_LIBRARIES )
MARK_AS_ADVANCED( TINYXML_INCLUDE_DIR TINYXML_LIBRARIES )

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
include(CMakeForceCompiler)
# this one is important
SET(CMAKE_SYSTEM_NAME "Generic")
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
set (CMAKE_SYSTEM_NAME Generic)
# Just point to anything that exists.
# We don't need CMake to generate proper build files.
set(CMAKE_C_COMPILER ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_CXX_COMPILER ${CMAKE_CURRENT_SOURCE_DIR})
# Skip the platform compiler checks
set (CMAKE_CXX_COMPILER_WORKS TRUE)
set (CMAKE_C_COMPILER_WORKS TRUE)
#how libraries look
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
SET(CMAKE_SYSTEM_INCLUDE_PATH
${THEOS_PATH}/include
${CMAKE_INSTALL_PREFIX}/include
${CMAKE_SYSTEM_INCLUDE_PATH})
# where is the target environment
SET(CMAKE_SYSTEM_LIBRARY_PATH
${THEOS_PATH}/lib
${CMAKE_INSTALL_PREFIX}/lib
${CMAKE_SYSTEM_LIBRARY_PATH})
SET(CMAKE_FIND_ROOT_PATH
${CMAKE_SOURCE_DIR}
${THEOS_PATH}
${THEOS_PATH}/lib
${THEOS_PATH}/include
)
# search for programs in the build host directories
# for libraries and headers in the target directories and then in the host
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY FIRST)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE FIRST)
set(IOS 1)

View File

@@ -0,0 +1,333 @@
# This file is part of the ios-cmake project. It was retrieved from
# https://github.com/cristeab/ios-cmake.git, which is a fork of
# https://code.google.com/p/ios-cmake/. Which in turn is based off of
# the Platform/Darwin.cmake and Platform/UnixPaths.cmake files which
# are included with CMake 2.8.4
#
# The ios-cmake project is licensed under the new BSD license.
#
# Copyright (c) 2014, Bogdan Cristea and LTE Engineering Software,
# Kitware, Inc., Insight Software Consortium. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# This file is based off of the Platform/Darwin.cmake and
# Platform/UnixPaths.cmake files which are included with CMake 2.8.4
# It has been altered for iOS development.
#
# Updated by Alex Stewart (alexs.mac@gmail.com).
# The following variables control the behaviour of this toolchain:
#
# IOS_PLATFORM: OS (default) or SIMULATOR or SIMULATOR64
# OS = Build for iPhoneOS.
# SIMULATOR = Build for x86 i386 iPhone Simulator.
# SIMULATOR64 = Build for x86 x86_64 iPhone Simulator.
# CMAKE_OSX_SYSROOT: Path to the iOS SDK to use. By default this is
# automatically determined from IOS_PLATFORM and xcodebuild, but
# can also be manually specified (although this should not be required).
# CMAKE_IOS_DEVELOPER_ROOT: Path to the Developer directory for the iOS platform
# being compiled for. By default this is automatically determined from
# CMAKE_OSX_SYSROOT, but can also be manually specified (although this should
# not be required).
# ENABLE_BITCODE: (true|false) Enables or disables bitcode support. Default true
#
# This toolchain defines the following variables for use externally:
#
# XCODE_VERSION: Version number (not including Build version) of Xcode detected.
# IOS_SDK_VERSION: Version of iOS SDK being used.
# CMAKE_OSX_ARCHITECTURES: Architectures being compiled for (generated from
# IOS_PLATFORM).
#
# This toolchain defines the following macros for use externally:
#
# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE XCODE_VARIANT)
# A convenience macro for setting xcode specific properties on targets.
# Available variants are: All, Release, RelWithDebInfo, Debug, MinSizeRel
# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1" "all").
#
# find_host_package (PROGRAM ARGS)
# A macro used to find executable programs on the host system, not within the
# iOS environment. Thanks to the android-cmake project for providing the
# command.
# Fix for PThread library not in path
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(CMAKE_USE_PTHREADS_INIT 1)
# Get the Xcode version being used.
execute_process(COMMAND xcodebuild -version
OUTPUT_VARIABLE XCODE_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "Xcode [0-9\\.]+" XCODE_VERSION "${XCODE_VERSION}")
string(REGEX REPLACE "Xcode ([0-9\\.]+)" "\\1" XCODE_VERSION "${XCODE_VERSION}")
message(STATUS "Building with Xcode version: ${XCODE_VERSION}")
# Default to building for iPhoneOS if not specified otherwise, and we cannot
# determine the platform from the CMAKE_OSX_ARCHITECTURES variable. The use
# of CMAKE_OSX_ARCHITECTURES is such that try_compile() projects can correctly
# determine the value of IOS_PLATFORM from the root project, as
# CMAKE_OSX_ARCHITECTURES is propagated to them by CMake.
if (NOT DEFINED IOS_PLATFORM)
if (CMAKE_OSX_ARCHITECTURES)
if (CMAKE_OSX_ARCHITECTURES MATCHES ".*arm.*")
set(IOS_PLATFORM "OS")
elseif (CMAKE_OSX_ARCHITECTURES MATCHES "i386")
set(IOS_PLATFORM "SIMULATOR")
elseif (CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
set(IOS_PLATFORM "SIMULATOR64")
endif()
endif()
if (NOT IOS_PLATFORM)
set(IOS_PLATFORM "OS")
endif()
endif()
set(IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING
"Type of iOS platform for which to build.")
# Determine the platform name and architectures for use in xcodebuild commands
# from the specified IOS_PLATFORM name.
if (IOS_PLATFORM STREQUAL "OS")
set(XCODE_IOS_PLATFORM iphoneos)
set(IOS_ARCH armv7 armv7s arm64)
elseif (IOS_PLATFORM STREQUAL "SIMULATOR")
set(XCODE_IOS_PLATFORM iphonesimulator)
set(IOS_ARCH i386)
elseif(IOS_PLATFORM STREQUAL "SIMULATOR64")
set(XCODE_IOS_PLATFORM iphonesimulator)
set(IOS_ARCH x86_64)
else()
message(FATAL_ERROR "Invalid IOS_PLATFORM: ${IOS_PLATFORM}")
endif()
message(STATUS "Configuring iOS build for platform: ${IOS_PLATFORM}, "
"architecture(s): ${IOS_ARCH}")
# If user did not specify the SDK root to use, then query xcodebuild for it.
if (NOT CMAKE_OSX_SYSROOT)
execute_process(COMMAND xcodebuild -version -sdk ${XCODE_IOS_PLATFORM} Path
OUTPUT_VARIABLE CMAKE_OSX_SYSROOT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT} for platform: ${IOS_PLATFORM}")
endif()
if (NOT EXISTS ${CMAKE_OSX_SYSROOT})
message(FATAL_ERROR "Invalid CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT} "
"does not exist.")
endif()
# Specify minimum version of deployment target.
if (NOT DEFINED IOS_DEPLOYMENT_TARGET)
# Unless specified, SDK version 8.0 is used by default as minimum target version.
set(IOS_DEPLOYMENT_TARGET "8.0"
CACHE STRING "Minimum iOS version to build for." )
message(STATUS "Using the default min-version since IOS_DEPLOYMENT_TARGET not provided!")
endif()
# Use bitcode or not
if (NOT DEFINED ENABLE_BITCODE)
# Unless specified, enable bitcode support by default
set(ENABLE_BITCODE TRUE CACHE BOOL "Wheter or not to enable bitcode")
message(STATUS "Enabling bitcode support by default. ENABLE_BITCODE not provided!")
endif()
# Get the SDK version information.
execute_process(COMMAND xcodebuild -sdk ${CMAKE_OSX_SYSROOT} -version SDKVersion
OUTPUT_VARIABLE IOS_SDK_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
# Find the Developer root for the specific iOS platform being compiled for
# from CMAKE_OSX_SYSROOT. Should be ../../ from SDK specified in
# CMAKE_OSX_SYSROOT. There does not appear to be a direct way to obtain
# this information from xcrun or xcodebuild.
if (NOT CMAKE_IOS_DEVELOPER_ROOT)
get_filename_component(IOS_PLATFORM_SDK_DIR ${CMAKE_OSX_SYSROOT} PATH)
get_filename_component(CMAKE_IOS_DEVELOPER_ROOT ${IOS_PLATFORM_SDK_DIR} PATH)
endif()
if (NOT EXISTS ${CMAKE_IOS_DEVELOPER_ROOT})
message(FATAL_ERROR "Invalid CMAKE_IOS_DEVELOPER_ROOT: "
"${CMAKE_IOS_DEVELOPER_ROOT} does not exist.")
endif()
# Find the C & C++ compilers for the specified SDK.
if (NOT CMAKE_C_COMPILER)
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang
OUTPUT_VARIABLE CMAKE_C_COMPILER
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Using C compiler: ${CMAKE_C_COMPILER}")
endif()
if (NOT CMAKE_CXX_COMPILER)
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang++
OUTPUT_VARIABLE CMAKE_CXX_COMPILER
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Using CXX compiler: ${CMAKE_CXX_COMPILER}")
endif()
# Find (Apple's) libtool.
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find libtool
OUTPUT_VARIABLE IOS_LIBTOOL
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Using libtool: ${IOS_LIBTOOL}")
# Configure libtool to be used instead of ar + ranlib to build static libraries.
# This is required on Xcode 7+, but should also work on previous versions of
# Xcode.
set(CMAKE_C_CREATE_STATIC_LIBRARY
"${IOS_LIBTOOL} -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
set(CMAKE_CXX_CREATE_STATIC_LIBRARY
"${IOS_LIBTOOL} -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
# Get the version of Darwin (OS X) of the host.
execute_process(COMMAND uname -r
OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
# Standard settings.
set(CMAKE_SYSTEM_NAME Darwin CACHE INTERNAL "")
set(CMAKE_SYSTEM_VERSION ${IOS_SDK_VERSION} CACHE INTERNAL "")
set(UNIX TRUE CACHE BOOL "")
set(APPLE TRUE CACHE BOOL "")
set(IOS TRUE CACHE BOOL "")
set(CMAKE_AR ar CACHE FILEPATH "" FORCE)
set(CMAKE_RANLIB ranlib CACHE FILEPATH "" FORCE)
# Force unset of OS X-specific deployment target (otherwise autopopulated),
# required as of cmake 2.8.10.
set(CMAKE_OSX_DEPLOYMENT_TARGET "" CACHE STRING
"Must be empty for iOS builds." FORCE)
# Set the architectures for which to build.
set(CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE STRING "Build architecture for iOS")
# Skip the platform compiler checks for cross compiling.
set(CMAKE_CXX_COMPILER_FORCED TRUE)
set(CMAKE_CXX_COMPILER_WORKS TRUE)
set(CMAKE_C_COMPILER_FORCED TRUE)
set(CMAKE_C_COMPILER_WORKS TRUE)
# All iOS/Darwin specific settings - some may be redundant.
set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
set(CMAKE_SHARED_MODULE_PREFIX "lib")
set(CMAKE_SHARED_MODULE_SUFFIX ".so")
set(CMAKE_MODULE_EXISTS 1)
set(CMAKE_DL_LIBS "")
set(CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ")
set(CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ")
set(CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}")
set(CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}")
message(STATUS "Building for minimum iOS version: ${IOS_DEPLOYMENT_TARGET}"
" (SDK version: ${IOS_SDK_VERSION})")
# Note that only Xcode 7+ supports the newer more specific:
# -m${XCODE_IOS_PLATFORM}-version-min flags, older versions of Xcode use:
# -m(ios/ios-simulator)-version-min instead.
if (IOS_PLATFORM STREQUAL "OS")
if (XCODE_VERSION VERSION_LESS 7.0)
set(XCODE_IOS_PLATFORM_VERSION_FLAGS
"-mios-version-min=${IOS_DEPLOYMENT_TARGET}")
else()
# Xcode 7.0+ uses flags we can build directly from XCODE_IOS_PLATFORM.
set(XCODE_IOS_PLATFORM_VERSION_FLAGS
"-m${XCODE_IOS_PLATFORM}-version-min=${IOS_DEPLOYMENT_TARGET}")
endif()
else()
# SIMULATOR or SIMULATOR64 both use -mios-simulator-version-min.
set(XCODE_IOS_PLATFORM_VERSION_FLAGS
"-mios-simulator-version-min=${IOS_DEPLOYMENT_TARGET}")
endif()
message(STATUS "Version flags set to: ${XCODE_IOS_PLATFORM_VERSION_FLAGS}")
if (ENABLE_BITCODE)
set(BITCODE "-fembed-bitcode")
message(STATUS "Enabling bitcode support.")
else()
set(BITCODE "")
message(STATUS "Disabling bitcode support.")
endif()
set(CMAKE_C_FLAGS
"${XCODE_IOS_PLATFORM_VERSION_FLAGS} ${BITCODE} -fobjc-abi-version=2 -fobjc-arc ${CMAKE_C_FLAGS}")
# Hidden visibilty is required for C++ on iOS.
set(CMAKE_CXX_FLAGS
"${XCODE_IOS_PLATFORM_VERSION_FLAGS} ${BITCODE} -fvisibility=hidden -fvisibility-inlines-hidden -fobjc-abi-version=2 -fobjc-arc ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3 -fomit-frame-pointer -ffast-math ${BITCODE} ${CMAKE_CXX_FLAGS_RELEASE}")
set(CMAKE_C_LINK_FLAGS "${XCODE_IOS_PLATFORM_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}")
set(CMAKE_CXX_LINK_FLAGS "${XCODE_IOS_PLATFORM_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}")
# In order to ensure that the updated compiler flags are used in try_compile()
# tests, we have to forcibly set them in the CMake cache, not merely set them
# in the local scope.
list(APPEND VARS_TO_FORCE_IN_CACHE
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
CMAKE_CXX_RELEASE
CMAKE_C_LINK_FLAGS
CMAKE_CXX_LINK_FLAGS)
foreach(VAR_TO_FORCE ${VARS_TO_FORCE_IN_CACHE})
set(${VAR_TO_FORCE} "${${VAR_TO_FORCE}}" CACHE STRING "" FORCE)
endforeach()
set(CMAKE_PLATFORM_HAS_INSTALLNAME 1)
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -headerpad_max_install_names")
set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -headerpad_max_install_names")
set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,")
set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a")
# Hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old
# build tree (where install_name_tool was hardcoded) and where
# CMAKE_INSTALL_NAME_TOOL isn't in the cache and still cmake didn't fail in
# CMakeFindBinUtils.cmake (because it isn't rerun) hardcode
# CMAKE_INSTALL_NAME_TOOL here to install_name_tool, so it behaves as it did
# before, Alex.
if (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool)
endif (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
# Set the find root to the iOS developer roots and to user defined paths.
set(CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_OSX_SYSROOT}
${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root" FORCE)
# Default to searching for frameworks first.
set(CMAKE_FIND_FRAMEWORK FIRST)
# Set up the default search directories for frameworks.
set(CMAKE_SYSTEM_FRAMEWORK_PATH
${CMAKE_OSX_SYSROOT}/System/Library/Frameworks
${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks
${CMAKE_OSX_SYSROOT}/Developer/Library/Frameworks)
# Only search the specified iOS SDK, not the remainder of the host filesystem.
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# This little macro lets you set any XCode specific property.
macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE XCODE_RELVERSION)
set(XCODE_RELVERSION_I "${XCODE_RELVERSION}")
if (XCODE_RELVERSION_I STREQUAL "All")
set_property(TARGET ${TARGET} PROPERTY
XCODE_ATTRIBUTE_${XCODE_PROPERTY} "${XCODE_VALUE}")
else()
set_property(TARGET ${TARGET} PROPERTY
XCODE_ATTRIBUTE_${XCODE_PROPERTY}[variant=${XCODE_RELVERSION_I}] "${XCODE_VALUE}")
endif()
endmacro(set_xcode_property)
# This macro lets you find executable programs on the host system.
macro(find_host_package)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
set(IOS FALSE)
find_package(${ARGN})
set(IOS TRUE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endmacro(find_host_package)

View File

@@ -0,0 +1,62 @@
include(CMakeForceCompiler)
# this one is important
SET(CMAKE_SYSTEM_NAME "Generic")
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
find_program(PSP_CONFIG_PROGRAM psp-config)
execute_process(COMMAND psp-config --pspsdk-path OUTPUT_VARIABLE PSPSDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPSDK_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
# specify compiler and linker:
find_program(PSP_GPP psp-g++)
find_program(PSP_GCC psp-gcc)
CMAKE_FORCE_C_COMPILER(${PSP_GCC} GNU)
CMAKE_FORCE_CXX_COMPILER(${PSP_GPP} GNU)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -G0")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
set(CMAKE_CXX_LINK_EXECUTABLE "${PSP_GCC} <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
#how libraries look
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
# where is the target environment
SET(CMAKE_SYSTEM_INCLUDE_PATH
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include
${PSPSDK_PATH}/include
${PSPSDK_PREFIX}/include
${CMAKE_INSTALL_PREFIX}/include
${CMAKE_SYSTEM_INCLUDE_PATH})
SET(CMAKE_SYSTEM_LIBRARY_PATH
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib
${PSPSDK_PATH}/lib
${PSPSDK_PREFIX}/lib
${CMAKE_INSTALL_PREFIX}/lib
${CMAKE_SYSTEM_LIBRARY_PATH})
SET(CMAKE_FIND_ROOT_PATH
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include
${PSPSDK_PATH}
${PSPSDK_PATH}/lib
${PSPSDK_PATH}/include
${PSPSDK_PREFIX}
${PSPSDK_PREFIX}/lib
${PSPSDK_PREFIX}/include
)
# search for programs in the build host directories
# for libraries and headers in the target directories and then in the host
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY FIRST)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE FIRST)
set(PSP 1)

57
CMakeModules/utils.cmake Normal file
View File

@@ -0,0 +1,57 @@
macro(WAGIC_OPTION variable description value)
set(__value ${value})
set(__condition "")
set(__varname "__value")
foreach(arg ${ARGN})
if(arg STREQUAL "IF" OR arg STREQUAL "if")
set(__varname "__condition")
else()
list(APPEND ${__varname} ${arg})
endif()
endforeach()
unset(__varname)
if("${__condition}" STREQUAL "")
set(__condition 2 GREATER 1)
endif()
if(${__condition})
if("${__value}" MATCHES ";")
if(${__value})
option(${variable} "${description}" ON)
else()
option(${variable} "${description}" OFF)
endif()
elseif(DEFINED ${__value})
if(${__value})
option(${variable} "${description}" ON)
else()
option(${variable} "${description}" OFF)
endif()
else()
option(${variable} "${description}" ${__value})
endif()
else()
unset(${variable} CACHE)
endif()
unset(__condition)
unset(__value)
endmacro()
# add prefix to each item in the list
macro(list_add_prefix LST PREFIX)
set(__tmp "")
foreach(item ${${LST}})
list(APPEND __tmp "${PREFIX}${item}")
endforeach()
set(${LST} ${__tmp})
unset(__tmp)
endmacro()
macro(find_host_program)
set(_find_program ${CMAKE_FIND_ROOT_PATH_MODE_PROGRAM})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
find_program(${ARGN})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ${_find_program})
unset(_find_program)
endmacro()

165
JGE/CMakeLists.txt Normal file
View File

@@ -0,0 +1,165 @@
#the sources, jge will need always
set(JGE_generic_src
src/Encoding.cpp
src/JAnimator.cpp
src/JApp.cpp
src/JDistortionMesh.cpp
src/JFileSystem.cpp
src/JGameObject.cpp
src/JGE.cpp
src/JGui.cpp
src/JLogger.cpp
src/JLBFont.cpp
src/JOBJModel.cpp
src/JParticle.cpp
src/JParticleEffect.cpp
src/JParticleEmitter.cpp
src/JParticleSystem.cpp
src/JResourceManager.cpp
src/JSpline.cpp
src/JSprite.cpp
src/Vector2D.cpp)
set(JGE_hge_src
src/hge/hgecolor.cpp
src/hge/hgedistort.cpp
src/hge/hgefont.cpp
src/hge/hgeparticle.cpp
src/hge/hgerect.cpp
src/hge/hgevector.cpp)
#the sources we need to get graphical output desktops
#used by qt-widget build option
set(JGE_graphics_src
src/Downloader.cpp
include/Downloader.h
src/JMD2Model.cpp
src/pc/JGfx.cpp)
#the sources we need to fake graphical output on desktops
#these are used for the console-only testsuit
set(JGE_console_src
src/OutputCapturer.cpp
src/JGfx-fake.cpp)
#the sources we need on linux
set(JGE_linux_src
src/JNetwork.cpp
src/pc/JSocket.cpp
src/pc/JSfx.cpp)
set(JGE_android_src
src/JNetwork.cpp
src/JSocket.cpp
src/android/JSfx.cpp)
#the sources we need if we compile for psp
#note: main.cpp contains the main-function.
#the other main functions reside in projects/mtg to reduce cross-library dependencies.
#there may be a way to get all main-functions into the same project
set(JGE_psp_src
src/JNetwork.cpp
src/JSocket.cpp
src/JGfx.cpp
src/JSfx.cpp
src/JAudio.cpp
src/JMP3.cpp
src/decoder_prx.cpp
src/main.cpp
src/vram.cpp)
set(JGE_ios_src
src/iOS/main.m
src/iOS/wagicAppDelegate.m
src/iOS/ES2Renderer.m
src/iOS/EAGLView.m
src/iOS/EAGLViewController.m
src/iOS/JSfx.cpp)
set(JGE_windows_src
src/JNetwork.cpp
src/pc/JSocket.cpp
src/windows/JSfx.cpp)
set(JGE_INCLUDE_DIRS include include/hge)
set(EXTRA_INCLUDE_DIR ../projects/mtg/extra)
#turn moc on
if(backend_qt_console OR backend_qt_widget)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC TRUE)
endif()
if(backend_qt_console)
if(UNIX AND NOT ANDROID)
set(JGE_INTERNAL_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
${UNZIP_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS})
set(JGE_SOURCES ${JGE_generic_src} ${JGE_console_src} ${JGE_linux_src} ${JGE_hge_src})
set(JGE_LINK_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Multimedia_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY}
${JPEG_LIBRARIES} ${PNG_LIBRARIES})
else()
message(FATAL_ERROR "qt builds of jge platforms other than linux are not supported")
endif()
endif()
if(backend_qt_widget)
if(UNIX AND NOT ANDROID)
set(JGE_INTERNAL_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
${UNZIP_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS} ${Qt5OpenGL_INCLUDE_DIRS} )
set(JGE_SOURCES ${JGE_generic_src} ${JGE_graphics_src} ${JGE_linux_src} ${JGE_hge_src})
set(JGE_LINK_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Multimedia_LIBRARIES} ${Qt5OpenGL_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY}
${JPEG_LIBRARIES} ${PNG_LIBRARIES})
else()
message(FATAL_ERROR "qt builds of jge platforms other than linux are not supported")
endif()
endif()
if(backend_sdl)
if((UNIX OR EMSCRIPTEN) AND NOT ANDROID)
set(JGE_INTERNAL_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ${GLUT_INCLUDE_DIR}
${SDL2_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
set(JGE_SOURCES ${JGE_generic_src} ${JGE_graphics_src} ${JGE_linux_src} ${JGE_hge_src})
set(JGE_LINK_LIBRARIES ${ZIPFS_LIBRARY} ${UNZIP_LIRARY} ${JPEG_LIBRARY}
${PNG_LIBRARIES} ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})
elseif(ANDROID)
set(JGE_INTERNAL_INCLUDE_DIRS ${BOOST_INCLUDE_DIRS} ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
${SDL2_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR}
${OPENSL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
set(JGE_SOURCES ${JGE_generic_src} ${JGE_android_src} ${JGE_graphics_src} ${JGE_hge_src})
set(JGE_LINK_LIBRARIES ${ZIPFS_LIBRARY} ${UNZIP_LIRARY} ${JPEG_LIBRARY} ${PNG_LIBRARIES}
${OPENSL_LIBRARIES})
elseif(WIN32)
set(JGE_INTERNAL_INCLUDE_DIRS ${EXTRA_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${SDL2_INCLUDE_DIR}
${UNZIP_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
set(JGE_SOURCES ${JGE_generic_src} ${JGE_graphics_src} ${JGE_windows_src} ${JGE_hge_src})
set(JGE_LINK_LIBRARIES ${ZIPFS_LIBRARY} ${UNZIP_LIRARY} ${JPEG_LIBRARY} ${PNG_LIBRARIES})
set(JGE_LINK_DIRECTORIES ${Boost_LIBRARY_DIR})
endif()
endif()
if(backend_psp)
if(PSP)
#${PSPSDK_PATH}/include should be in system pathes
set(JGE_INTERNAL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/psp/include ${TINYXML_INCLUDE_DIR}
${ZIPFS_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${GIF_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} )
set(JGE_SOURCES ${JGE_generic_src} ${JGE_psp_src} ${JGE_hge_src})
set(JGE_LINK_LIBRARIES ${TINYXML_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY})
else()
message(FATAL_ERROR "use the cross-compile toolchain to build as the psp target")
endif()
endif()
if(IOS)
set(JGE_SOURCES ${JGE_generic_src} ${JGE_ios_src} ${JGE_hge_src} src/pc/JGfx.cpp)
set(JGE_SOURCES ${JGE_SOURCES} PARENT_SCOPE)
set(JGE_INCLUDE_DIRS ${JGE_INCLUDE_DIRS} src/iOS PARENT_SCOPE)
set(JGE_LINK_LIBRARIES ${TINYXML_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY})
endif()
add_library(jge STATIC ${JGE_SOURCES})
include_directories(${JGE_INTERNAL_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS})
target_link_libraries(jge ${JGE_LINK_LIBRARIES})
link_directories(${JGE_LINK_DIRECTORIES})
set(${JGE_LIBRARIES} jge)

Binary file not shown.

View File

@@ -0,0 +1,10 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -25,6 +25,7 @@ std::string ToHex(T* pointer)
#ifdef LINUX
#define OutputDebugString(val) (std::cerr << val);
#define OutputDebugStringA(val) (std::cerr << val);
#endif
#ifdef _DEBUG

View File

@@ -41,7 +41,7 @@ class DownloadRequest
private slots:
#endif
void fileDownloaded();
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void downloadProgress(int64_t bytesReceived, int64_t bytesTotal);
#ifdef QT_CONFIG
signals:
@@ -72,7 +72,13 @@ protected:
QNetworkReply* mNetworkReply;
static QNetworkAccessManager networkAccessManager;
#endif
#ifdef __EMSCRIPTEN__
static void onLoadCb(unsigned int handle, DownloadRequest* req, const char *buffer, unsigned int size);
static void onErrorCb(unsigned int handle, DownloadRequest* req, int errorCode, const char* errorText);
static void onProgressCb(unsigned int handle, DownloadRequest* req, int bytesReceived, int bytesTotal);
#endif
void processError(int errorCode, const char* errorText);
void processBufferDownloaded(unsigned int size, const char*buffer);
public:
DownloadRequest(string localPath="",

View File

@@ -31,7 +31,7 @@ typedef u32 LocalKeySym;
#elif defined(SDL_CONFIG)
#include <SDL.h>
typedef SDLKey LocalKeySym;
typedef SDL_Keycode LocalKeySym;
#define LOCAL_KEY_NONE SDLK_UNKNOWN
#elif defined(WIN32)

View File

@@ -16,7 +16,7 @@
#include <string.h>
#include <stdarg.h>
#if (!defined IOS) && (!defined ANDROID) && (!defined QT_CONFIG)
#if (!defined IOS) && (!defined ANDROID) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
#include <gif_lib.h>
#endif //IOS ANDROID
@@ -567,7 +567,7 @@ private:
#if (!defined IOS) && (!defined QT_CONFIG)
void LoadJPG(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
int LoadPNG(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
#if (!defined ANDROID) && (!defined QT_CONFIG)
#if (!defined ANDROID) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
void LoadGIF(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
int image_readgif(void * handle, TextureInfo &textureInfo, DWORD * bgcolor, InputFunc readFunc,int mode = 0, int TextureFormat = TEXTURE_FORMAT);
#endif // (ANDROID) How can we get gif support for android ?

View File

@@ -42,9 +42,9 @@ private:
// convert the socket into non-blocking state
bool SetNonBlocking(int sock);
// socket handle
#ifdef WIN32
#if (defined WIN32) && (!defined __GNUG__)
SOCKET mfd;
#elif LINUX || PSP
#elif LINUX || PSP || __GNUG__
int mfd;
#endif
};

View File

@@ -18,20 +18,20 @@
#include "JTypes.h"
#ifdef ANDROID
#include <SLES/OpenSLES.h>
#include "SLES/OpenSLES_Android.h"
#elif defined USE_PHONON
#elif defined(USE_PHONON)
#include <phonon/AudioOutput>
#include <phonon/MediaObject>
#elif (defined QT_CONFIG)
#elif defined (QT_CONFIG)
#include "QMediaPlayer"
#include "QMediaPlaylist"
#include "QSoundEffect"
#elif defined WIN32
#elif defined(WIN32)
#include <windows.h>
#define WITH_FMOD
//#define WITH_FMOD
#elif defined (PSP)
#include <pspgu.h>
#include <pspkernel.h>
@@ -48,7 +48,7 @@
#endif
#ifdef WITH_FMOD
#include "../Dependencies/include/fmod.h"
#include "fmod.h"
#endif
//------------------------------------------------------------------------------------------------
@@ -79,20 +79,26 @@ public slots:
std::string filename;
std::string key;
std::string ext;
void* mTrack;
#elif defined WITH_FMOD
FSOUND_SAMPLE* mTrack; // MP3 needed to be of "sample" type for FMOD, FMUSIC_MODULE is for MODs
void* mTrack;
#elif defined ANDROID
SLObjectItf playerObject;
SLPlayItf playInterface;
SLSeekItf seekInterface;
SLVolumeItf musicVolumeInterface;
void* mTrack;
#elif (defined QT_CONFIG)
QMediaPlaylist* playlist;
QMediaPlayer* player;
string fullpath;
#else
void* mTrack;
#endif //WITH_FMOD
void* mTrack;
#elif (defined WIN32)
std::string filename;
void* mTrack;
#endif
//#endif //WITH_FMOD
};
@@ -107,28 +113,30 @@ public:
unsigned long fileSize();
#if (defined QT_CONFIG) && (!defined USE_PHONON)
QMediaPlayer* effect;
void* mSample;
void* mSample;
#elif defined (PSP)
WAVDATA *mSample;
WAVDATA* mSample;
#elif defined (IOS)
std::string filename;
std::string key;
std::string ext;
void* mSample;
void* mSample;
#elif defined (WITH_FMOD)
FSOUND_SAMPLE *mSample;
#elif defined (USE_PHONON)
Phonon::AudioOutput* mOutput;
Phonon::MediaObject* mMediaObject;
void* mSample;
void* mSample;
#elif defined ANDROID
SLObjectItf playerObject;
SLPlayItf playInterface;
SLVolumeItf sampleVolumeInterface;
void* mSample;
void* mSample;
#elif (defined WIN32)
std::string filename;
void* mSample;
#else
void* mSample;
void* mSample;
#endif
};

View File

@@ -26,8 +26,16 @@
#include "JAudio.h"
#else
#include <stdint.h>
//#define __STDC_LIMIT_MACROS
#ifdef IOS
#include <tr1/cstdint>
#else
#include <cstdint>
#endif
//#include <stdint.h>
//the MSC version might only define _MSC_STDINT_H_
//and that might cause redefinition of standard types
//#define _STDINT_H_
#endif
@@ -104,6 +112,7 @@ enum {
#endif // CONSOLE_CONFIG
#if (defined WIN32) && (!defined LINUX)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#if defined(LINUX) && (!defined WIN32) || defined(IOS) || defined (ANDROID)
@@ -140,9 +149,14 @@ typedef uint32_t u32;
#include <GLES/gl.h>
#include <GLES/glext.h>
#elif defined (WIN32) || defined (LINUX)
#if defined(__APPLE__)
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#endif
#endif
#else
#include <QtOpenGL>
#endif

View File

@@ -0,0 +1,29 @@
#ifndef PRECOMPILEDHEADER_H
#define PRECOMPILEDHEADER_H
#include <algorithm>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <sstream>
#include <string>
#include <vector>
#include "DebugRoutines.h"
#include <assert.h>
#include "JGE.h"
#include "JFileSystem.h"
#include "JLogger.h"
//#ifndef WP8
//#include <boost/shared_ptr.hpp>
//#endif
#if defined (WP8) || defined (IOS) || defined (ANDROID) || defined (QT_CONFIG) || defined (SDL_CONFIG)
#define TOUCH_ENABLED
#endif
#endif //PRECOMPILEDHEADER_H

View File

@@ -1,7 +1,7 @@
#ifndef THREADING_H
#define THREADING_H
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L)
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L) && !(_MSC_VER >= 1700)
#include <boost/date_time.hpp>
#ifdef WIN32
@@ -537,7 +537,7 @@ namespace boost
}
}
#elif (__cplusplus > 199711L)
#elif (__cplusplus > 199711L) || (_MSC_VER >= 1700)
#include <thread>
#include <mutex>

View File

@@ -33,6 +33,7 @@ extern "C" {
#endif
void* vrelptr( void *ptr ); // make a pointer relative to memory base address (ATTENTION: A NULL rel ptr is not illegal/invalid!)
void* vabsptr( void *ptr ); // make a pointer absolute (default return type of valloc)
void* valloc( size_t size );

View File

@@ -7,6 +7,9 @@
#ifdef QT_CONFIG
QNetworkAccessManager DownloadRequest::networkAccessManager;
#endif
#ifdef __EMSCRIPTEN__
#include "emscripten.h"
#endif
DownloadRequest::DownloadRequest(string localPath,
string remoteResourceURL,
@@ -48,15 +51,71 @@ void DownloadRequest::startGet()
JFileSystem::GetInstance()->Remove(getTempLocalPath());
JFileSystem::GetInstance()->openForWrite(mFile, getTempLocalPath());
#ifdef QT_CONFIG
connect(mNetworkReply, SIGNAL(downloadProgress(qint64, qint64)),
SLOT(downloadProgress(qint64, qint64)));
connect(mNetworkReply, SIGNAL(downloadProgress(int64_t, int64_t)),
SLOT(downloadProgress(int64_t, int64_t)));
connect(mNetworkReply, SIGNAL(finished()), SLOT(fileDownloaded()));
#endif
#ifdef __EMSCRIPTEN__
emscripten_async_wget2_data(mRemoteResourceURL.c_str(), "GET", 0, this, 1,
(em_async_wget2_data_onload_func)DownloadRequest::onLoadCb,
(em_async_wget2_data_onerror_func)DownloadRequest::onErrorCb,
(em_async_wget2_data_onprogress_func)DownloadRequest::onProgressCb);
#endif
}
#ifdef __EMSCRIPTEN__
void DownloadRequest::onLoadCb(unsigned int handle, DownloadRequest* req, const char *buffer, unsigned int size)
{
DebugTrace("DownloadRequest::onLoadCb: " << size);
req->processBufferDownloaded(size, buffer);
Downloader::GetInstance()->Update();
}
void DownloadRequest::onErrorCb(unsigned int handle, DownloadRequest* req, int errorCode, const char* errorText)
{
DebugTrace("DownloadRequest::onErrorCb");
req->processError(errorCode, errorText);
Downloader::GetInstance()->Update();
}
void DownloadRequest::onProgressCb(unsigned int handle, DownloadRequest* req, int bytesReceived, int bytesTotal)
{
DebugTrace("DownloadRequest::onProgressCb");
req->DownloadRequest::downloadProgress(bytesReceived, bytesTotal);
}
#endif
void DownloadRequest::processError(int errorCode, const char* errorText)
{
DebugTrace(errorText);
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
mFile.close();
JFileSystem::GetInstance()->Remove(getTempLocalPath());
}
void DownloadRequest::processBufferDownloaded(unsigned int size, const char*buffer)
{
if(mFile.is_open())
{
mTotalSize = size;
mFile.write(buffer, size);
mFile.close();
if(!JFileSystem::GetInstance()->Rename(getTempLocalPath(), mLocalPath)) {
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
return;
}
}
mDownloadStatus = DownloadRequest::DOWNLOADED;
}
void DownloadRequest::fileDownloaded()
{
do {
#ifdef QT_CONFIG
do {
QByteArray eTagByteArray = mNetworkReply->rawHeader("ETag");
if(!eTagByteArray.isEmpty()) {
string oldETag = mETag;
@@ -67,10 +126,7 @@ void DownloadRequest::fileDownloaded()
// let's check some error
if(mNetworkReply->error() != QNetworkReply::NoError) {
DebugTrace(mNetworkReply->errorString().toStdString());
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
mFile.close();
JFileSystem::GetInstance()->Remove(getTempLocalPath());
processError((int)mNetworkReply->error(), mNetworkReply->errorString().toStdString().c_str());
break;
}
@@ -89,35 +145,31 @@ void DownloadRequest::fileDownloaded()
return;
}
if(mFile.is_open())
{
QByteArray byteArray = mNetworkReply->readAll();
mFile.write(byteArray.constData(), byteArray.size());
mFile.close();
if(!JFileSystem::GetInstance()->Rename(getTempLocalPath(), mLocalPath)) {
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
break;
}
}
mDownloadStatus = DownloadRequest::DOWNLOADED;
QByteArray byteArray = mNetworkReply->readAll();
processBufferDownloaded(byteArray.size(), byteArray.constData());
} while(0);
Downloader::GetInstance()->Update();
mNetworkReply->deleteLater();
mNetworkReply->deleteLater();
emit statusChanged((int)mDownloadStatus);
#endif
}
void DownloadRequest::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
void DownloadRequest::downloadProgress(int64_t bytesReceived, int64_t bytesTotal)
{
QByteArray byteArray = mNetworkReply->readAll();
#ifdef QT_CONFIG
QByteArray byteArray = mNetworkReply->readAll();
mFile.write(byteArray.constData(), byteArray.size());
#endif
mCurrentSize = bytesReceived;
mTotalSize = bytesTotal;
int percent = 0;
if(bytesTotal)
percent = (bytesReceived/bytesTotal)*100;
#ifdef QT_CONFIG
emit percentChanged(percent);
#endif
}
Downloader* Downloader::mInstance = 0;

View File

@@ -15,7 +15,7 @@
#include "../include/JSprite.h"
#include "../include/JAnimator.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
//////////////////////////////////////////////////////////////////////////

View File

@@ -16,14 +16,7 @@ User folder is the only one that is really needed to guarantee both read and wri
The content that users should not be touching.
*/
#if defined (ANDROID)
#include "PrecompiledHeader.h"
#endif //ANDROID
#if defined (LINUX)
#include "../../projects/mtg/include/PrecompiledHeader.h"
#endif //LINUX
#include "dirent.h"
#ifdef WIN32
#pragma warning(disable : 4786)
@@ -37,7 +30,8 @@ The content that users should not be touching.
#include "../include/JGE.h"
#include "../include/JFileSystem.h"
#include "../include/JLogger.h"
#include <dirent.h>
#include "DebugRoutines.h"
#ifdef QT_CONFIG
#include <QDir>
@@ -130,6 +124,10 @@ JFileSystem::JFileSystem(const string & _userPath, const string & _systemPath)
userPath = [[documentsDirectory stringByAppendingString: @"/User/"] cStringUsingEncoding:1];
systemPath = [[documentsDirectory stringByAppendingString: @"/Res/"] cStringUsingEncoding:1];
#elif defined (__EMSCRIPTEN__)
systemPath = "/";
DebugTrace("User path " << userPath);
DebugTrace("System path " << systemPath);
#elif defined (ANDROID)
userPath = JGE::GetInstance()->getFileUserFolderPath();
systemPath = JGE::GetInstance()->getFileSystemLocation();
@@ -146,9 +144,9 @@ JFileSystem::JFileSystem(const string & _userPath, const string & _systemPath)
userPath = QDir::toNativeSeparators(dir.absolutePath()).toStdString();
systemPath = QDir::toNativeSeparators(sysDir.absolutePath()).toStdString();
DebugTrace("User path " << userPath);
DebugTrace("System path " << systemPath);
DebugTrace("Current path " << QDir::currentPath().toStdString());
DebugTrace("User path " + userPath);
DebugTrace("System path " + systemPath);
DebugTrace("Current path " + QDir::currentPath().toStdString());
#else
//Find the Res.txt file and matching Res folders for backwards compatibility
ifstream mfile("Res.txt");
@@ -304,6 +302,7 @@ void JFileSystem::DetachZipFile()
bool JFileSystem::openForRead(izfstream & File, const string & FilePath) {
DebugTrace("JFileSystem::openForRead " << FilePath);
File.open(FilePath.c_str(), mUserFS);
if (File)
return true;
@@ -414,7 +413,6 @@ bool JFileSystem::OpenFile(const string &filename)
mCurrentFileInZip = &(it2->second);
mFileSize = it2->second.m_Size;
return true;
}

View File

@@ -34,7 +34,7 @@
//////////////////////////////////////////////////////////////////////////
#if defined (WIN32) // WIN32 specific code
#include "../../Dependencies/include/fmod.h"
#include "fmod.h"
u8 JGE::GetAnalogX()
{
@@ -54,7 +54,7 @@ u8 JGE::GetAnalogY()
#elif defined (LINUX) // Unix specific code
#include <sys/time.h>
#ifdef WITH_FMOD
#include "../Dependencies/include/fmod.h"
#include "fmod.h"
#endif //WITH_FMOD

View File

@@ -10,6 +10,7 @@
#include <pspaudio.h>
#include <pspmp3.h>
#include <psputility.h>
#include <unistd.h>
#else
#define PSP_AUDIO_VOLUME_MAX 100

View File

@@ -42,7 +42,7 @@ bool JNetwork::isConnected(){
void JNetwork::getServerIp(string& aString)
{
#ifdef WIN32
#if (defined WIN32) && (!defined __GNUG__)
char ac[80];
if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
DebugTrace("Error " << WSAGetLastError() <<

View File

@@ -19,7 +19,7 @@
#include "../include/JFileSystem.h"
#include "../include/JResourceManager.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
//-------------------------------------------------------------------------------------

View File

@@ -14,9 +14,9 @@
#include "../include/JResourceManager.h"
#include "../include/JFileSystem.h"
#include "../include/JLBFont.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
#if defined (_DEBUG) && defined (WIN32) && (!defined LINUX)
#if defined (_DEBUG) && defined (WIN32) && (!defined LINUX) && (!defined __GNUG__)
#include "crtdbg.h"
#define NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#else

View File

@@ -13,7 +13,7 @@
#include "../include/JFileSystem.h"
#include "../include/JSpline.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
#define SMALL_NUMBER 0.0001f

View File

@@ -19,7 +19,8 @@
*
*/
#include "../include/decoder_prx.h"
#include "decoder_prx.h"
#include <psputility.h>
char *prx_static_init()
{

View File

@@ -12,7 +12,7 @@
#if (!defined IOS) && (!defined QT_CONFIG)
#ifdef WIN32
#pragma warning(disable : 4786)
#pragma comment( lib, "giflib.lib" )
//#pragma comment( lib, "giflib.lib" )
#endif
#include <png.h>
@@ -35,7 +35,7 @@ extern "C" {
#include "../../include/JFileSystem.h"
#include "../../include/JAssert.h"
#if (defined WIN32) && (!defined QT_CONFIG)
#if (defined WIN32) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
#ifndef __attribute__
#define __attribute__((a))
#endif
@@ -1665,7 +1665,7 @@ static void jpeg_mem_src(j_decompress_ptr cinfo, byte *mem, int len)
cinfo->src->resync_to_restart = jpeg_resync_to_restart;
cinfo->src->term_source = jpg_null;
cinfo->src->bytes_in_buffer = len;
cinfo->src->next_input_byte = mem;
cinfo->src->next_input_byte = (const JOCTET*)mem;
}
/*
@@ -1702,7 +1702,7 @@ void JRenderer::LoadJPG(TextureInfo &textureInfo, const char *filename, int mode
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_mem_src(&cinfo, rawdata, rawsize);
jpeg_mem_src(&cinfo, (byte*)rawdata, rawsize);
// Process JPEG header
jpeg_read_header(&cinfo, true);
@@ -1740,7 +1740,7 @@ void JRenderer::LoadJPG(TextureInfo &textureInfo, const char *filename, int mode
// Pass sizes to output
// Allocate Scanline buffer
scanline = (byte *)malloc(cinfo.output_width * 3);
scanline = (BYTE *)malloc(cinfo.output_width * 3);
if(!scanline)
{
//// ri.Con_Printf(PRINT_ALL, "Insufficient RAM for JPEG scanline buffer\n");

View File

@@ -75,7 +75,7 @@ static int __largest_block = __MEM_BLOCKS;
static int __mem_free = __MEM_BLOCKS;
inline void* vrelptr( void *ptr )
void* vrelptr( void *ptr )
{
return (void*)((unsigned int)ptr & ~__MEM_START);
}

182
JGE/src/windows/JSfx.cpp Normal file
View File

@@ -0,0 +1,182 @@
#include <Windows.h>
#include <Mmsystem.h>
#include <mciapi.h>
//these two headers are already included in the <Windows.h> header
#pragma comment(lib, "Winmm.lib")
#include "DebugRoutines.h"
#include "../../include/JSoundSystem.h"
#include "../../include/JFileSystem.h"
//////////////////////////////////////////////////////////////////////////
JMusic::JMusic()
:
mTrack(0)
{
}
void JMusic::Update(){
}
int JMusic::getPlayTime(){
return 0;
}
JMusic::~JMusic()
{
}
//////////////////////////////////////////////////////////////////////////
JSample::JSample()
{
}
JSample::~JSample()
{
}
unsigned long JSample::fileSize()
{
return 0;
}
//////////////////////////////////////////////////////////////////////////
JSoundSystem* JSoundSystem::mInstance = NULL;
JSoundSystem* JSoundSystem::GetInstance()
{
if (mInstance == NULL)
{
mInstance = new JSoundSystem();
mInstance->InitSoundSystem();
}
return mInstance;
}
void JSoundSystem::Destroy()
{
if (mInstance)
{
mInstance->DestroySoundSystem();
delete mInstance;
mInstance = NULL;
}
}
JSoundSystem::JSoundSystem()
{
mVolume = 0;
mSampleVolume = 0;
}
JSoundSystem::~JSoundSystem()
{
}
void JSoundSystem::InitSoundSystem()
{
}
void JSoundSystem::DestroySoundSystem()
{
}
JMusic *JSoundSystem::LoadMusic(const char *fileName)
{
JMusic* music = NULL;
music = new JMusic();
if (music)
{
music->filename = JFileSystem::GetInstance()->GetResourceFile(fileName);
std::string aString = "open \"" + music->filename + "\" type mpegvideo alias mp3";
mciSendString(aString.c_str(), NULL, 0, NULL);
music->mTrack = (void*)-1;
}
return music;
}
void JSoundSystem::PlayMusic(JMusic *music, bool looping)
{
if (music && music->mTrack)
{
if(looping)
mciSendString("play mp3 repeat", NULL, 0, NULL);
else
mciSendString("play mp3", NULL, 0, NULL);
}
}
void JSoundSystem::StopMusic(JMusic *music)
{
if (music && music->mTrack)
{
mciSendString("stop mp3", NULL, 0, NULL);
}
}
void JSoundSystem::PauseMusic(JMusic *music)
{
if (music && music->mTrack)
{
mciSendString("pause mp3", NULL, 0, NULL);
}
}
void JSoundSystem::ResumeMusic(JMusic *music)
{
if (music && music->mTrack)
{
mciSendString("resume mp3", NULL, 0, NULL);
}
}
void JSoundSystem::SetVolume(int volume)
{
SetMusicVolume(volume);
SetSfxVolume(volume);
}
void JSoundSystem::SetMusicVolume(int volume)
{
mVolume = volume;
}
void JSoundSystem::SetSfxVolume(int volume)
{
mSampleVolume = volume;
SetMusicVolume(mVolume);
}
JSample *JSoundSystem::LoadSample(const char *fileName)
{
JSample* sample = NULL;
sample = new JSample();
if (sample)
{
sample->filename = JFileSystem::GetInstance()->GetResourceFile(fileName);
}
return sample;
}
void JSoundSystem::PlaySample(JSample *sample)
{
if(sample)
{
sndPlaySound(sample->filename.c_str(), SND_FILENAME | SND_ASYNC);
}
}

View File

@@ -1,5 +1,4 @@
#Wagic the Homebrew
# Wagic the Homebrew
[![Build Status](https://travis-ci.org/WagicProject/wagic.png?branch=master)](https://travis-ci.com/WagicProject/wagic)
[![Build status](https://ci.appveyor.com/api/projects/status/7j4fbr6m62aqej59/branch/master)](https://ci.appveyor.com/project/xawotihs/wagic/branch/master)
@@ -7,22 +6,40 @@
## Description
Wagic, the Homebrew, is a C++ game engine that allows to play card games against an AI on
**Wagic, the Homebrew** is a C++ game engine that allows to play card games against an AI on:
- Android (phones and tablets)
- iOS (iPhone/iPad)
- Sony PSP
- Windows desktops
- MacOS
- Linux and derivated like Maemo or Meego
- Linux and derivatives like Maemo or Meego
It is highly customizable and allows the player to tweak the rules / create their own cards, their own themes, etc...
It is highly customizable and allows the player to tweak the rules, create their own cards, their own themes, etc...
#### [Download from GitHub Releases!](https://github.com/WagicProject/wagic/releases)
![Screenshot of shop from wololo.net](docs/img/shop.jpg)
Info, downloads, discussions and more at http://wololo.net/forum/index.php
### Documentation
![alt text](http://wololo.net/wagic/wp-content/uploads/2009/10/shop.jpg "Screenshot")
Info, downloads, discussions and more at http://wololo.net/forum/index.php (archived as of 16 Nov 2022).
Chat with the community on the [**Wagic - MTG Game** Discord](https://discord.com/invite/JHK5pVaK5p) (Feb 2023).
Developer information from the [Wagic Wiki](https://github.com/WagicProject/wagic/wiki) is also included in the [wagic/docs/](docs) folder.
### Sample round play-through video
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/WUFSAPZuDIk/0.jpg)](http://www.youtube.com/watch?v=WUFSAPZuDIk)
[![Wagic, The Homebrew sample playthrough](docs/img/Wagic%2C%20The%20Homebrew%20sample%20playthrough.jpg)](http://www.youtube.com/watch?v=WUFSAPZuDIk)
*Wagic, The Homebrew sample playthrough on YouTube by Rolz73, 6 Feb 2014*
## Sister projects
- [WagicSyntaxPlugin
](https://github.com/Vitty85/WagicSyntaxPlugin), a Wagic developer tool by Vitty85 for [Notepad++](https://notepad-plus-plus.org/downloads/)
- [Forge](https://www.slightlymagic.net/forum/viewforum.php?f=26), a Java-based game engine similar to Wagic ([Source](https://github.com/Card-Forge/forge/))
- [XMage](http://xmage.today/), a Java-based online multiplayer digital CCG ([Source](https://github.com/magefree/mage))

View File

@@ -17,6 +17,7 @@ skip_tags: true
#---------------------------------#
environment:
DXSDK_DIR: "C:/Program Files (x86)/Microsoft DirectX SDK/"
GH_TOKEN:
secure: dYnBDQkiY5oVjIlswzBX9BJigNtBGXgGlp1tK3XbHzrDEDrs2vaKD5m+Oz5OSz1C
@@ -26,6 +27,10 @@ install:
- powershell -Command "& {C:/Python27/python.exe C:/get-pip.py}"
- "C:/Python27/Scripts/pip.exe install pyjavaproperties"
- "C:/Python27/Scripts/pip.exe install github3.py"
- git submodule update --init --recursive
- cd thirdparty/SDL2
# - git checkout release-2.0.3
- cd ../..
#---------------------------------#
# build configuration #
@@ -34,8 +39,16 @@ install:
# build Configuration, i.e. Debug, Release, etc.
configuration: Release
# scripts to run before build
before_build:
- echo Running cmake...
- mkdir build
- cd build
- cmake -Dbackend_sdl=ON ..
- cd ..
build:
project: projects/mtg/mtg_vs2010.sln # path to Visual Studio solution or project
project: build/wagic.sln # path to Visual Studio solution or project
#---------------------------------#
# tests configuration #
@@ -61,7 +74,7 @@ artifacts:
# scripts to run before deployment
before_deploy:
- cd projects/mtg/bin
- "C:/Python27/python.exe createWindowsZip.py"
- "C:/Python27/python.exe createWindowsZip.py -b ../../../build"
- cd ../../..
# scripts to run after deployment

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
docs/img/shop.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

1
docs/wiki Submodule

Submodule docs/wiki added at 0244ca1874

View File

@@ -0,0 +1,3 @@
add_definitions(-DANDROID -DLINUX)
add_definitions(-D_STLP_USE_SIMPLE_NODE_ALLOC -D__arm__ -D_REENTRANT -D_GLIBCXX__PTHREADS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="0192" android:versionName="@string/app_version" package="net.wagic.app">
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application android:debuggable="true" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<activity android:configChanges="keyboard|keyboardHidden|orientation" android:label="@string/app_name" android:name="org.libsdl.app.SDLActivity" android:screenOrientation="sensorLandscape">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:configChanges="keyboard|keyboardHidden|orientation" android:name="com.google.ads.AdActivity" android:screenOrientation="sensorLandscape"/>
</application>
<uses-sdk android:minSdkVersion="@ANDROID_NATIVE_API_LEVEL@" android:targetSdkVersion="@ANDROID_NATIVE_API_LEVEL@"/>
</manifest>

View File

@@ -0,0 +1,121 @@
if(NOT ANDROID_PACKAGE_RELEASE)
set(ANDROID_PACKAGE_RELEASE 1)
endif()
if(NOT ANDROID_PACKAGE_PLATFORM)
if(ARMEABI_V7A)
if(NEON)
set(ANDROID_PACKAGE_PLATFORM armv7a_neon)
else()
set(ANDROID_PACKAGE_PLATFORM armv7a)
endif()
elseif(ARMEABI_V6)
set(ANDROID_PACKAGE_PLATFORM armv6)
elseif(ARMEABI)
set(ANDROID_PACKAGE_PLATFORM armv5)
elseif(X86)
set(ANDROID_PACKAGE_PLATFORM x86)
elseif(MIPS)
set(ANDROID_PACKAGE_PLATFORM mips)
else()
message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM")
endif()
endif()
if(NOT ANDROID_PACKAGE_PLATFORM_NAME)
if(ARMEABI_V7A)
if(NEON)
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a with NEON")
else()
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a")
endif()
elseif(ARMEABI_V6)
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v6")
elseif(ARMEABI)
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi")
elseif(X86)
set(ANDROID_PACKAGE_PLATFORM_NAME "x86")
elseif(MIPS)
set(ANDROID_PACKAGE_PLATFORM_NAME "mips")
else()
message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM_NAME")
endif()
endif()
if("${ANDROID_NATIVE_API_LEVEL}" MATCHES "[1-9][0-9]*$")
set(ANDROID_SDK_VERSION ${CMAKE_MATCH_0})
endif()
if(NOT ANDROID_SDK_VERSION GREATER 7)
set(ANDROID_SDK_VERSION 8)
endif()
set(PACKAGE_DIR "${CMAKE_BINARY_DIR}/package")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml"
"${PACKAGE_DIR}/AndroidManifest.xml" @ONLY)
#configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.xml"
# "${PACKAGE_DIR}/build.xml" COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/values/strings.xml"
"${PACKAGE_DIR}/res/values/strings.xml" COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable-hdpi/icon.png"
"${PACKAGE_DIR}/res/drawable-hdpi/icon.png" COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable-ldpi/icon.png"
"${PACKAGE_DIR}/res/drawable-ldpi/icon.png" COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable-mdpi/icon.png"
"${PACKAGE_DIR}/res/drawable-mdpi/icon.png" COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/layout/main.xml"
"${PACKAGE_DIR}/res/layout/main.xml" COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/assets/_keystore/wagic-release.keystore"
"${PACKAGE_DIR}/assets/_keystore/wagic-release.keystore" COPYONLY)
string( REGEX MATCH "[0-9]+" ANDROID_NATIVE_API_LEVEL_NUMBER "${ANDROID_NATIVE_API_LEVEL}" )
set(target_name "Wagic_${WAGIC_VERSION}_binary_pack_${ANDROID_PACKAGE_PLATFORM}")
get_target_property(wagic_location wagic LOCATION)
string(TOLOWER ${CMAKE_BUILD_TYPE} android_build_type)
set(android_proj_target_files ${ANDROID_PROJECT_FILES})
list_add_prefix(android_proj_target_files "${PACKAGE_DIR}/")
set(APK_NAME "${PACKAGE_DIR}/bin/${target_name}-${android_build_type}-unsigned.apk")
file(GLOB camera_wrappers "${OpenCV_SOURCE_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}/libnative_camera_r*.so")
set(CAMERA_LIB_COMMANDS "")
foreach(wrapper ${camera_wrappers})
list(APPEND CAMERA_LIB_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy "${wrapper}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/")
endforeach()
add_custom_command(
OUTPUT "${APK_NAME}"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/libs"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/bin"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/gen"
COMMAND ${CMAKE_COMMAND} -E remove ${android_proj_target_files}
COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/src"
COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
# COMMAND ${CMAKE_COMMAND} -E copy "${SDL2_LIBRARY}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
# COMMAND ${CMAKE_COMMAND} -E copy "${ZLIB_LIBRARY}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
# COMMAND ${CMAKE_COMMAND} -E copy "${OPENSL_LIBRARY}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
COMMAND ${CMAKE_COMMAND} -E copy "${wagic_location}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/src" "${PACKAGE_DIR}/src"
# COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${PACKAGE_DIR}" --target "android-${ANDROID_NATIVE_API_LEVEL}" --name "${target_name}"
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${PACKAGE_DIR}" --target "android-10" --name "${target_name}"
COMMAND ${ANT_EXECUTABLE} -noinput -k ${android_build_type}
COMMAND ${CMAKE_COMMAND} -E touch "${APK_NAME}"
WORKING_DIRECTORY "${PACKAGE_DIR}"
MAIN_DEPENDENCY "${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}"
DEPENDS
"${PACKAGE_DIR}/res/values/strings.xml"
"${PACKAGE_DIR}/res/layout/main.xml"
"${PACKAGE_DIR}/res/drawable-mdpi/icon.png"
"${PACKAGE_DIR}/res/drawable-ldpi/icon.png"
"${PACKAGE_DIR}/res/drawable-hdpi/icon.png"
"${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}"
wagic
)
install(FILES "${APK_NAME}" DESTINATION "apk/" COMPONENT main)
add_custom_target(android_package ALL SOURCES "${APK_NAME}" )
add_dependencies(android_package wagic)

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/mainLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Wagic"
/>
</LinearLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Wagic</string>
<string name="app_version">0.19.2</string>
<string name="info_text">Wagic v0.19.2\\nAll Rights Reserved.</string>
</resources>

View File

@@ -0,0 +1,174 @@
package net.wagic.utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import android.os.Environment;
import android.util.Log;
public class StorageOptions
{
private static ArrayList<String> mMounts = new ArrayList<String>();
private static ArrayList<String> mVold = new ArrayList<String>();
public static String[] labels;
public static String[] paths;
public static int count = 0;
public static String defaultMountPoint;
public static void determineStorageOptions()
{
initializeMountPoints();
readMountsFile();
readVoldFile();
compareMountsWithVold();
testAndCleanMountsList();
setProperties();
}
private static void initializeMountPoints()
{
try
{
defaultMountPoint = Environment.getExternalStorageDirectory().getCanonicalPath();
} catch (Exception ioEx)
{
// an error occurred trying to get the canonical path, use '/mnt/sdcard' instead
defaultMountPoint = "/mnt/sdcard";
}
}
private static void readMountsFile()
{
/*
* Scan the /proc/mounts file and look for lines like this: /dev/block/vold/179:1 /mnt/sdcard vfat
* rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0602,dmask=0602,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
*
* When one is found, split it into its elements and then pull out the path to the that mount point and add it to the arraylist
*/
try
{
Scanner scanner = new Scanner(new File("/proc/mounts"));
while (scanner.hasNext())
{
String line = scanner.nextLine();
if (line.startsWith("/dev/block/vold/"))
{
String[] lineElements = line.split(" ");
lineElements[1].replaceAll(":.*$", "");
mMounts.add(lineElements[1]);
}
}
} catch (FileNotFoundException fnfex)
{
// if proc/mount doesn't exist we just use
Log.i(StorageOptions.class.getCanonicalName(), fnfex.getMessage() + ": assuming " + defaultMountPoint + " is the only mount point");
mMounts.add(defaultMountPoint);
} catch (Exception e)
{
Log.e(StorageOptions.class.getCanonicalName(), e.getMessage() + ": unknown exception while reading mounts file");
mMounts.add(defaultMountPoint);
}
}
private static void readVoldFile()
{
/*
* Scan the /system/etc/vold.fstab file and look for lines like this: dev_mount sdcard /mnt/sdcard 1 /devices/platform/s3c-sdhci.0/mmc_host/mmc0
*
* When one is found, split it into its elements and then pull out the path to the that mount point and add it to the arraylist
*/
try
{
Scanner scanner = new Scanner(new File("/system/etc/vold.fstab"));
while (scanner.hasNext())
{
String line = scanner.nextLine();
if (line.startsWith("dev_mount"))
{
String[] lineElements = line.split(" ");
lineElements[2] = lineElements[2].replaceAll(":.*$", "");
mVold.add(lineElements[2]);
}
}
} catch (FileNotFoundException fnfex)
{
// if vold.fstab doesn't exist we use the value gathered from the Environment
Log.i(StorageOptions.class.getCanonicalName(), fnfex.getMessage() + ": assuming " + defaultMountPoint + " is the only mount point");
mMounts.add(defaultMountPoint);
} catch (Exception e)
{
Log.e(StorageOptions.class.getCanonicalName(), e.getMessage() + ": unknown exception while reading mounts file");
mMounts.add(defaultMountPoint);
}
}
private static void compareMountsWithVold()
{
/*
* Sometimes the two lists of mount points will be different. We only want those mount points that are in both list.
*
* Compare the two lists together and remove items that are not in both lists.
*/
for (int i = 0; i < mMounts.size(); i++)
{
String mount = mMounts.get(i);
if (!mVold.contains(mount))
mMounts.remove(i--);
}
// don't need this anymore, clear the vold list to reduce memory
// use and to prepare it for the next time it's needed.
mVold.clear();
}
private static void testAndCleanMountsList()
{
/*
* Now that we have a cleaned list of mount paths Test each one to make sure it's a valid and available path. If it is not, remove it from the list.
*/
for (int i = 0; i < mMounts.size(); i++)
{
String mount = mMounts.get(i);
File root = new File(mount);
if (!root.exists() || !root.isDirectory() || !root.canWrite())
mMounts.remove(i--);
}
}
private static void setProperties()
{
/*
* At this point all the paths in the list should be valid. Build the public properties.
*/
ArrayList<String> mLabels = new ArrayList<String>();
int i = 1;
for (String path : mMounts)
{ // TODO: /mnt/sdcard is assumed to always mean internal storage. Use this comparison until there is a better way to do this
if ("/mnt/sdcard".equalsIgnoreCase(path))
mLabels.add("Built-in Storage");
else
mLabels.add("External SD Card " + i++);
}
labels = new String[mLabels.size()];
mLabels.toArray(labels);
paths = new String[mMounts.size()];
mMounts.toArray(paths);
count = Math.min(labels.length, paths.length);
// don't need this anymore, clear the mounts list to reduce memory
// use and to prepare it for the next time it's needed.
mMounts.clear();
}
}

View File

@@ -0,0 +1,771 @@
package org.libsdl.app;
import java.util.Arrays;
import android.app.*;
import android.content.*;
import android.view.*;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsoluteLayout;
import android.os.*;
import android.util.Log;
import android.graphics.*;
import android.media.*;
import android.hardware.*;
/**
SDL Activity
*/
public class SDLActivity extends Activity {
private static final String TAG = "SDL";
// Keep track of the paused state
public static boolean mIsPaused = false, mIsSurfaceReady = false, mHasFocus = true;
// Main components
protected static SDLActivity mSingleton;
protected static SDLSurface mSurface;
protected static View mTextEdit;
protected static ViewGroup mLayout;
// This is what SDL runs in. It invokes SDL_main(), eventually
protected static Thread mSDLThread;
// Audio
protected static Thread mAudioThread;
protected static AudioTrack mAudioTrack;
// Load the .so
static {
System.loadLibrary("SDL2");
//System.loadLibrary("SDL2_image");
//System.loadLibrary("SDL2_mixer");
//System.loadLibrary("SDL2_net");
//System.loadLibrary("SDL2_ttf");
System.loadLibrary("wagic");
}
// Setup
@Override
protected void onCreate(Bundle savedInstanceState) {
//Log.v("SDL", "onCreate()");
super.onCreate(savedInstanceState);
// So we can call stuff from static callbacks
mSingleton = this;
// Set up the surface
mSurface = new SDLSurface(getApplication());
mLayout = new AbsoluteLayout(this);
mLayout.addView(mSurface);
setContentView(mLayout);
}
// Events
@Override
protected void onPause() {
Log.v("SDL", "onPause()");
super.onPause();
SDLActivity.handlePause();
}
@Override
protected void onResume() {
Log.v("SDL", "onResume()");
super.onResume();
SDLActivity.handleResume();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.v("SDL", "onWindowFocusChanged(): " + hasFocus);
SDLActivity.mHasFocus = hasFocus;
if (hasFocus) {
SDLActivity.handleResume();
}
}
@Override
public void onLowMemory() {
Log.v("SDL", "onLowMemory()");
super.onLowMemory();
SDLActivity.nativeLowMemory();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.v("SDL", "onDestroy()");
// Send a quit message to the application
SDLActivity.nativeQuit();
// Now wait for the SDL thread to quit
if (mSDLThread != null) {
try {
mSDLThread.join();
} catch(Exception e) {
Log.v("SDL", "Problem stopping thread: " + e);
}
mSDLThread = null;
//Log.v("SDL", "Finished waiting for SDL thread");
}
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
// Ignore certain special keys so they're handled by Android
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
keyCode == KeyEvent.KEYCODE_VOLUME_UP ||
keyCode == KeyEvent.KEYCODE_CAMERA ||
keyCode == 168 || /* API 11: KeyEvent.KEYCODE_ZOOM_IN */
keyCode == 169 /* API 11: KeyEvent.KEYCODE_ZOOM_OUT */
) {
return false;
}
return super.dispatchKeyEvent(event);
}
/** Called by onPause or surfaceDestroyed. Even if surfaceDestroyed
* is the first to be called, mIsSurfaceReady should still be set
* to 'true' during the call to onPause (in a usual scenario).
*/
public static void handlePause() {
if (!SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady) {
SDLActivity.mIsPaused = true;
SDLActivity.nativePause();
mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, false);
}
}
/** Called by onResume or surfaceCreated. An actual resume should be done only when the surface is ready.
* Note: Some Android variants may send multiple surfaceChanged events, so we don't need to resume
* every time we get one of those events, only if it comes after surfaceDestroyed
*/
public static void handleResume() {
if (SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady && SDLActivity.mHasFocus) {
SDLActivity.mIsPaused = false;
SDLActivity.nativeResume();
mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true);
}
}
// Messages from the SDLMain thread
static final int COMMAND_CHANGE_TITLE = 1;
static final int COMMAND_UNUSED = 2;
static final int COMMAND_TEXTEDIT_HIDE = 3;
protected static final int COMMAND_USER = 0x8000;
/**
* This method is called by SDL if SDL did not handle a message itself.
* This happens if a received message contains an unsupported command.
* Method can be overwritten to handle Messages in a different class.
* @param command the command of the message.
* @param param the parameter of the message. May be null.
* @return if the message was handled in overridden method.
*/
protected boolean onUnhandledMessage(int command, Object param) {
return false;
}
/**
* A Handler class for Messages from native SDL applications.
* It uses current Activities as target (e.g. for the title).
* static to prevent implicit references to enclosing object.
*/
protected static class SDLCommandHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Context context = getContext();
if (context == null) {
Log.e(TAG, "error handling message, getContext() returned null");
return;
}
switch (msg.arg1) {
case COMMAND_CHANGE_TITLE:
if (context instanceof Activity) {
((Activity) context).setTitle((String)msg.obj);
} else {
Log.e(TAG, "error handling message, getContext() returned no Activity");
}
break;
case COMMAND_TEXTEDIT_HIDE:
if (mTextEdit != null) {
mTextEdit.setVisibility(View.GONE);
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0);
}
break;
default:
if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {
Log.e(TAG, "error handling message, command is " + msg.arg1);
}
}
}
}
// Handler for the messages
Handler commandHandler = new SDLCommandHandler();
// Send a message from the SDLMain thread
boolean sendCommand(int command, Object data) {
Message msg = commandHandler.obtainMessage();
msg.arg1 = command;
msg.obj = data;
return commandHandler.sendMessage(msg);
}
// C functions we call
public static native void nativeInit();
public static native void nativeLowMemory();
public static native void nativeQuit();
public static native void nativePause();
public static native void nativeResume();
public static native void onNativeResize(int x, int y, int format);
public static native void onNativeKeyDown(int keycode);
public static native void onNativeKeyUp(int keycode);
public static native void onNativeKeyboardFocusLost();
public static native void onNativeTouch(int touchDevId, int pointerFingerId,
int action, float x,
float y, float p);
public static native void onNativeAccel(float x, float y, float z);
public static native void onNativeSurfaceChanged();
public static native void onNativeSurfaceDestroyed();
public static native void nativeFlipBuffers();
public static void flipBuffers() {
SDLActivity.nativeFlipBuffers();
}
public static boolean setActivityTitle(String title) {
// Called from SDLMain() thread and can't directly affect the view
return mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
}
public static boolean sendMessage(int command, int param) {
return mSingleton.sendCommand(command, Integer.valueOf(param));
}
public static Context getContext() {
return mSingleton;
}
static class ShowTextInputTask implements Runnable {
/*
* This is used to regulate the pan&scan method to have some offset from
* the bottom edge of the input region and the top edge of an input
* method (soft keyboard)
*/
static final int HEIGHT_PADDING = 15;
public int x, y, w, h;
public ShowTextInputTask(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
@Override
public void run() {
AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(
w, h + HEIGHT_PADDING, x, y);
if (mTextEdit == null) {
mTextEdit = new DummyEdit(getContext());
mLayout.addView(mTextEdit, params);
} else {
mTextEdit.setLayoutParams(params);
}
mTextEdit.setVisibility(View.VISIBLE);
mTextEdit.requestFocus();
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mTextEdit, 0);
}
}
public static boolean showTextInput(int x, int y, int w, int h) {
// Transfer the task to the main thread as a Runnable
return mSingleton.commandHandler.post(new ShowTextInputTask(x, y, w, h));
}
public static Surface getNativeSurface() {
return SDLActivity.mSurface.getNativeSurface();
}
// Audio
public static int audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);
Log.v("SDL", "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + (sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer");
// Let the user pick a larger buffer if they really want -- but ye
// gods they probably shouldn't, the minimums are horrifyingly high
// latency already
desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);
if (mAudioTrack == null) {
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);
// Instantiating AudioTrack can "succeed" without an exception and the track may still be invalid
// Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java
// Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState()
if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) {
Log.e("SDL", "Failed during initialization of Audio Track");
mAudioTrack = null;
return -1;
}
mAudioTrack.play();
}
Log.v("SDL", "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + (mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
return 0;
}
public static void audioWriteShortBuffer(short[] buffer) {
for (int i = 0; i < buffer.length; ) {
int result = mAudioTrack.write(buffer, i, buffer.length - i);
if (result > 0) {
i += result;
} else if (result == 0) {
try {
Thread.sleep(1);
} catch(InterruptedException e) {
// Nom nom
}
} else {
Log.w("SDL", "SDL audio: error return from write(short)");
return;
}
}
}
public static void audioWriteByteBuffer(byte[] buffer) {
for (int i = 0; i < buffer.length; ) {
int result = mAudioTrack.write(buffer, i, buffer.length - i);
if (result > 0) {
i += result;
} else if (result == 0) {
try {
Thread.sleep(1);
} catch(InterruptedException e) {
// Nom nom
}
} else {
Log.w("SDL", "SDL audio: error return from write(byte)");
return;
}
}
}
public static void audioQuit() {
if (mAudioTrack != null) {
mAudioTrack.stop();
mAudioTrack = null;
}
}
// Input
/**
* @return an array which may be empty but is never null.
*/
public static int[] inputGetInputDeviceIds(int sources) {
int[] ids = InputDevice.getDeviceIds();
int[] filtered = new int[ids.length];
int used = 0;
for (int i = 0; i < ids.length; ++i) {
InputDevice device = InputDevice.getDevice(ids[i]);
if ((device != null) && ((device.getSources() & sources) != 0)) {
filtered[used++] = device.getId();
}
}
return Arrays.copyOf(filtered, used);
}
}
/**
Simple nativeInit() runnable
*/
class SDLMain implements Runnable {
@Override
public void run() {
// Runs SDL_main()
SDLActivity.nativeInit();
//Log.v("SDL", "SDL thread terminated");
}
}
/**
SDLSurface. This is what we draw on, so we need to know when it's created
in order to do anything useful.
Because of this, that's where we set up the SDL thread
*/
class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
View.OnKeyListener, View.OnTouchListener, SensorEventListener {
// Sensors
protected static SensorManager mSensorManager;
protected static Display mDisplay;
// Keep track of the surface size to normalize touch events
protected static float mWidth, mHeight;
// Startup
public SDLSurface(Context context) {
super(context);
getHolder().addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
setOnKeyListener(this);
setOnTouchListener(this);
mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
// Some arbitrary defaults to avoid a potential division by zero
mWidth = 1.0f;
mHeight = 1.0f;
}
public Surface getNativeSurface() {
return getHolder().getSurface();
}
// Called when we have a valid drawing surface
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.v("SDL", "surfaceCreated()");
holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}
// Called when we lose the surface
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.v("SDL", "surfaceDestroyed()");
// Call this *before* setting mIsSurfaceReady to 'false'
SDLActivity.handlePause();
SDLActivity.mIsSurfaceReady = false;
SDLActivity.onNativeSurfaceDestroyed();
}
// Called when the surface is resized
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height) {
Log.v("SDL", "surfaceChanged()");
int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default
switch (format) {
case PixelFormat.A_8:
Log.v("SDL", "pixel format A_8");
break;
case PixelFormat.LA_88:
Log.v("SDL", "pixel format LA_88");
break;
case PixelFormat.L_8:
Log.v("SDL", "pixel format L_8");
break;
case PixelFormat.RGBA_4444:
Log.v("SDL", "pixel format RGBA_4444");
sdlFormat = 0x15421002; // SDL_PIXELFORMAT_RGBA4444
break;
case PixelFormat.RGBA_5551:
Log.v("SDL", "pixel format RGBA_5551");
sdlFormat = 0x15441002; // SDL_PIXELFORMAT_RGBA5551
break;
case PixelFormat.RGBA_8888:
Log.v("SDL", "pixel format RGBA_8888");
sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888
break;
case PixelFormat.RGBX_8888:
Log.v("SDL", "pixel format RGBX_8888");
sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888
break;
case PixelFormat.RGB_332:
Log.v("SDL", "pixel format RGB_332");
sdlFormat = 0x14110801; // SDL_PIXELFORMAT_RGB332
break;
case PixelFormat.RGB_565:
Log.v("SDL", "pixel format RGB_565");
sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565
break;
case PixelFormat.RGB_888:
Log.v("SDL", "pixel format RGB_888");
// Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
sdlFormat = 0x16161804; // SDL_PIXELFORMAT_RGB888
break;
default:
Log.v("SDL", "pixel format unknown " + format);
break;
}
mWidth = width;
mHeight = height;
SDLActivity.onNativeResize(width, height, sdlFormat);
Log.v("SDL", "Window size:" + width + "x"+height);
// Set mIsSurfaceReady to 'true' *before* making a call to handleResume
SDLActivity.mIsSurfaceReady = true;
SDLActivity.onNativeSurfaceChanged();
if (SDLActivity.mSDLThread == null) {
// This is the entry point to the C app.
// Start up the C app thread and enable sensor input for the first time
SDLActivity.mSDLThread = new Thread(new SDLMain(), "SDLThread");
enableSensor(Sensor.TYPE_ACCELEROMETER, true);
SDLActivity.mSDLThread.start();
}
}
// unused
@Override
public void onDraw(Canvas canvas) {}
// Key events
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
//Log.v("SDL", "key down: " + keyCode);
SDLActivity.onNativeKeyDown(keyCode);
return true;
}
else if (event.getAction() == KeyEvent.ACTION_UP) {
//Log.v("SDL", "key up: " + keyCode);
SDLActivity.onNativeKeyUp(keyCode);
return true;
}
return false;
}
// Touch events
@Override
public boolean onTouch(View v, MotionEvent event) {
final int touchDevId = event.getDeviceId();
final int pointerCount = event.getPointerCount();
// touchId, pointerId, action, x, y, pressure
int actionPointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; /* API 8: event.getActionIndex(); */
int pointerFingerId = event.getPointerId(actionPointerIndex);
int action = (event.getAction() & MotionEvent.ACTION_MASK); /* API 8: event.getActionMasked(); */
float x = event.getX(actionPointerIndex) / mWidth;
float y = event.getY(actionPointerIndex) / mHeight;
float p = event.getPressure(actionPointerIndex);
if (action == MotionEvent.ACTION_MOVE && pointerCount > 1) {
// TODO send motion to every pointer if its position has
// changed since prev event.
for (int i = 0; i < pointerCount; i++) {
pointerFingerId = event.getPointerId(i);
x = event.getX(i) / mWidth;
y = event.getY(i) / mHeight;
p = event.getPressure(i);
SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
}
} else {
SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
}
return true;
}
// Sensor events
public void enableSensor(int sensortype, boolean enabled) {
// TODO: This uses getDefaultSensor - what if we have >1 accels?
if (enabled) {
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(sensortype),
SensorManager.SENSOR_DELAY_GAME, null);
} else {
mSensorManager.unregisterListener(this,
mSensorManager.getDefaultSensor(sensortype));
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x, y;
switch (mDisplay.getRotation()) {
case Surface.ROTATION_90:
x = -event.values[1];
y = event.values[0];
break;
case Surface.ROTATION_270:
x = event.values[1];
y = -event.values[0];
break;
case Surface.ROTATION_180:
x = -event.values[1];
y = -event.values[0];
break;
default:
x = event.values[0];
y = event.values[1];
break;
}
SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH,
y / SensorManager.GRAVITY_EARTH,
event.values[2] / SensorManager.GRAVITY_EARTH - 1);
}
}
}
/* This is a fake invisible editor view that receives the input and defines the
* pan&scan region
*/
class DummyEdit extends View implements View.OnKeyListener {
InputConnection ic;
public DummyEdit(Context context) {
super(context);
setFocusableInTouchMode(true);
setFocusable(true);
setOnKeyListener(this);
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// This handles the hardware keyboard input
if (event.isPrintingKey()) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
}
return true;
}
if (event.getAction() == KeyEvent.ACTION_DOWN) {
SDLActivity.onNativeKeyDown(keyCode);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
SDLActivity.onNativeKeyUp(keyCode);
return true;
}
return false;
}
//
@Override
public boolean onKeyPreIme (int keyCode, KeyEvent event) {
// As seen on StackOverflow: http://stackoverflow.com/questions/7634346/keyboard-hide-event
// FIXME: Discussion at http://bugzilla.libsdl.org/show_bug.cgi?id=1639
// FIXME: This is not a 100% effective solution to the problem of detecting if the keyboard is showing or not
// FIXME: A more effective solution would be to change our Layout from AbsoluteLayout to Relative or Linear
// FIXME: And determine the keyboard presence doing this: http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
// FIXME: An even more effective way would be if Android provided this out of the box, but where would the fun be in that :)
if (event.getAction()==KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
if (SDLActivity.mTextEdit != null && SDLActivity.mTextEdit.getVisibility() == View.VISIBLE) {
SDLActivity.onNativeKeyboardFocusLost();
}
}
return super.onKeyPreIme(keyCode, event);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
ic = new SDLInputConnection(this, true);
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI
| 33554432 /* API 11: EditorInfo.IME_FLAG_NO_FULLSCREEN */;
return ic;
}
}
class SDLInputConnection extends BaseInputConnection {
public SDLInputConnection(View targetView, boolean fullEditor) {
super(targetView, fullEditor);
}
@Override
public boolean sendKeyEvent(KeyEvent event) {
/*
* This handles the keycodes from soft keyboard (and IME-translated
* input from hardkeyboard)
*/
int keyCode = event.getKeyCode();
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (event.isPrintingKey()) {
commitText(String.valueOf((char) event.getUnicodeChar()), 1);
}
SDLActivity.onNativeKeyDown(keyCode);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
SDLActivity.onNativeKeyUp(keyCode);
return true;
}
return super.sendKeyEvent(event);
}
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
nativeCommitText(text.toString(), newCursorPosition);
return super.commitText(text, newCursorPosition);
}
@Override
public boolean setComposingText(CharSequence text, int newCursorPosition) {
nativeSetComposingText(text.toString(), newCursorPosition);
return super.setComposingText(text, newCursorPosition);
}
public native void nativeCommitText(String text, int newCursorPosition);
public native void nativeSetComposingText(String text, int newCursorPosition);
}

View File

@@ -0,0 +1,8 @@
set(CMAKE_CXX_FLAGS "-s USE_SDL=2 -s USE_ZLIB=1 -s FULL_ES2=1 -std=c++11 -s TOTAL_MEMORY=16777216 -O0 --preload-file ../../../projects/mtg/bin/Res@/")
#set(CMAKE_CXX_FLAGS "-s USE_SDL=2 -s FULL_ES2=1 -std=c++11 -g4 -s ALLOW_MEMORY_GROWTH=1 --preload-file ../../../projects/mtg/bin/Res@/")
set(CMAKE_EXECUTABLE_SUFFIX ".html")
add_definitions(-DLINUX)
add_definitions(-D_DEBUG)
add_definitions(-DUSERDIR=".wagic")
add_definitions(-DRESDIR="/")
add_definitions(-DGL_ES_VERSION_2_0)

View File

@@ -0,0 +1,5 @@
add_definitions(-DLINUX)
add_definitions(-DUSERDIR=".wagic")
add_definitions(-DRESDIR="Res")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++0x")
set(CMAKE_PREFIX_PATH "/usr/local/opt/qt5")

View File

@@ -0,0 +1,5 @@
add_definitions(-DPSP -G0)
add_definitions(-D_PSP_FW_VERSION=371)
add_definitions(-DDEVHOOK -DPSPFW3XX)
include_directories(${PSPSDK_PATH}/include)

View File

@@ -0,0 +1,4 @@
add_definitions(-DLINUX)
add_definitions(-DUSERDIR=".wagic")
add_definitions(-DRESDIR="Res")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

View File

@@ -0,0 +1,3 @@
add_definitions(-DWIN32)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")

View File

@@ -1,6 +1,9 @@
APP_PROJECT_PATH := $(call my-dir)/..
APP_CPPFLAGS += -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_ABI := arm64-v8a
APP_PLATFORM := android-21
APP_CFLAGS += -march=armv8.1-a
APP_CPPFLAGS += -D__ARM_FEATURE_LSE=1
#APP_ABI := x86 # mainly for emulators
APP_STL := c++_static
APP_MODULES := libpng libjpeg main SDL

244
projects/mtg/CMakeLists.txt Normal file
View File

@@ -0,0 +1,244 @@
#MTGs common sources
set(MTG_generic_src
src/AbilityParser.cpp
src/ActionElement.cpp
src/ActionLayer.cpp
src/ActionStack.cpp
src/AIHints.cpp
src/AIMomirPlayer.cpp
src/AIPlayer.cpp
src/AIPlayerBaka.cpp
src/AIStats.cpp
src/AllAbilities.cpp
src/CardDescriptor.cpp
src/CardDisplay.cpp
src/CardGui.cpp
src/CardPrimitive.cpp
src/CardSelector.cpp
src/CardSelectorSingleton.cpp
src/CarouselDeckView.cpp
src/Closest.cpp
src/Counters.cpp
src/Credits.cpp
src/Damage.cpp
src/DamagerDamaged.cpp
src/DeckDataWrapper.cpp
src/DeckEditorMenu.cpp
src/DeckManager.cpp
src/DeckMenu.cpp
src/DeckMenuItem.cpp
src/DeckMetaData.cpp
src/DeckStats.cpp
src/DeckView.cpp
src/DuelLayers.cpp
src/ExtraCost.cpp
src/GameApp.cpp
src/GameLauncher.cpp
src/GameObserver.cpp
src/GameOptions.cpp
src/GameStateAwards.cpp
src/GameState.cpp
src/GameStateDeckViewer.cpp
src/GameStateDuel.cpp
src/GameStateMenu.cpp
src/GameStateOptions.cpp
src/GameStateShop.cpp
src/GameStateStory.cpp
src/GameStateTransitions.cpp
src/GridDeckView.cpp
src/GuiAvatars.cpp
src/GuiBackground.cpp
src/GuiCardsController.cpp
src/GuiCombat.cpp
src/GuiFrame.cpp
src/GuiHand.cpp
src/GuiLayers.cpp
src/GuiMana.cpp
src/GuiPhaseBar.cpp
src/GuiPlay.cpp
src/GuiStatic.cpp
src/IconButton.cpp
src/InteractiveButton.cpp
src/ManaCost.cpp
src/ManaCostHybrid.cpp
src/MenuItem.cpp
src/ModRules.cpp
src/MTGAbility.cpp
src/MTGCard.cpp
src/MTGCardInstance.cpp
src/MTGDeck.cpp
src/MTGDefinitions.cpp
src/MTGGamePhase.cpp
src/MTGGameZones.cpp
src/MTGPack.cpp
src/MTGRules.cpp
src/ObjectAnalytics.cpp
src/OptionItem.cpp
src/PhaseRing.cpp
src/Player.cpp
src/PlayerData.cpp
src/PlayGuiObject.cpp
src/PlayGuiObjectController.cpp
src/PlayRestrictions.cpp
src/Pos.cpp
src/PriceList.cpp
src/ReplacementEffects.cpp
src/Rules.cpp
src/SimpleMenu.cpp
src/SimpleMenuItem.cpp
src/SimpleButton.cpp
src/SimplePad.cpp
src/SimplePopup.cpp
src/StoryFlow.cpp
src/Subtypes.cpp
src/StyleManager.cpp
src/TargetChooser.cpp
src/TargetsList.cpp
src/Tasks.cpp
src/TextScroller.cpp
src/ThisDescriptor.cpp
src/Token.cpp
src/Translate.cpp
src/TranslateKeys.cpp
src/Trash.cpp
src/utils.cpp
src/WCachedResource.cpp
src/WDataSrc.cpp
src/WEvent.cpp
src/WFilter.cpp
src/WFont.cpp
src/WGui.cpp
src/WResourceManager.cpp
src/WParsedInt.cpp
)
set(MTG_network_src src/NetworkPlayer.cpp)
#the sources we need if we compile a graphical qt version
#TODO: add declarative version since this only works with QWidget right now
set(MTG_qt_graphic_src
src/qt/filedownloader.cpp
src/qt/corewrapper.cpp
include/qt/corewrapper.h #so automoc finds it
include/qt/filedownloader.h
src/Qtmain.cpp)
#the sources we need to compile the testsuit
set(MTG_qt_console_src
src/Qtconsole.cpp
src/TestSuiteAI.cpp)
set(MTG_sdl_src
src/SDLmain.cpp)
set(MTG_android_sdl_src
src/SDLmain.cpp)
set(MTG_iOS_src
iOS/UI/WagicDownloadProgressViewController.m
iOS/asi-http-request/ASIAuthenticationDialog.m
iOS/asi-http-request/ASIDataCompressor.m
iOS/asi-http-request/ASIDataDecompressor.m
iOS/asi-http-request/ASIDownloadCache.m
iOS/asi-http-request/ASIFormDataRequest.m
iOS/asi-http-request/ASIHTTPRequest.m
iOS/asi-http-request/ASIInputStream.m
iOS/asi-http-request/ASINetworkQueue.m
iOS/SoundManager/SoundManager.m
iOS/SoundManager/MyOpenALSupport.c
iOS/Reachability/Reachability/Reachability.m
iOS/ZipArchive/ZipArchive.mm)
set(MTG_iOS_INCLUDE_DIRS iOS/UI iOS/Reachability/Reachability iOS/asi-http-request iOS/ZipArchive iOS/SoundManager)
set(MTG_INCLUDE_DIRS include include/qt)
set(JGE_INCLUDE_DIRS ../../JGE/include ../../JGE/include/hge)
set(JGE_LIBRARY jge)
set(EXTRA_INCLUDE_DIR extra)
#turn moc on
if(backend_qt_console OR backend_qt_widget)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC TRUE)
endif()
if(backend_qt_console)
if(UNIX AND NOT ANDROID)
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${ZIPFS_INCLUDE_DIR} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS}
${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default)
add_executable(wagic ${MTG_generic_src} ${MTG_qt_console_src} ${MTG_network_src})
target_link_libraries(wagic ${JGE_LIBRARY} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS} ${TINYXML_LIBRARIES}
${HGE_LIBRARY} ${ZLIB_LIBRARIES})
else()
message(FATAL_ERROR "qt-console builds are only supported on unix platforms")
endif()
elseif(backend_qt_widget)
if(UNIX AND NOT ANDROID)
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${ZIPFS_INCLUDE_DIR} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS}
${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default)
add_executable(wagic ${MTG_generic_src} ${MTG_qt_graphic_src} ${MTG_network_src})
target_link_libraries(wagic ${JGE_LIBRARY} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS} ${OPENGL_LIBRARIES} ${TINYXML_LIBRARIES}
${HGE_LIBRARY} ${ZLIB_LIBRARIES})# ${X11_LIBRARIES})
else()
message(FATAL_ERROR "qt-widget builds are only supported on unix platforms")
endif()
elseif(backend_sdl)
if((UNIX OR EMSCRIPTEN) AND NOT ANDROID)
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
add_executable(wagic ${MTG_generic_src} ${MTG_sdl_src} ${MTG_network_src} src/TestSuiteAI.cpp src/AIPlayerBakaB.cpp)
target_link_libraries(wagic ${JGE_LIBRARY} ${SDL2_LIBRARY} ${OPENGL_LIBRARIES} ${TINYXML_LIBRARIES} ${HGE_LIBRARY} ${ZLIB_LIBRARIES})
elseif(ANDROID)
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR})
#we should try to get rid of this hack
add_library(wagic SHARED ${MTG_generic_src} ${MTG_network_src} ${MTG_android_sdl_src} src/TestSuiteAI.cpp)
target_link_libraries(wagic ${JGE_LIBRARY} ${SDL2_LIBRARY} ${OPENGL_LIBRARIES} ${TINYXML_LIBRARIES} ${HGE_LIBRARY} ${ZLIB_LIBRARIES})
elseif(WIN32)
include_directories(${EXTRA_INCLUDE_DIR} ${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
${Boost_INCLUDE_DIRS} ${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
add_executable(wagic ${MTG_generic_src} ${MTG_sdl_src} src/TestSuiteAI.cpp src/AIPlayerBakaB.cpp)
link_directories(${Boost_LIBRARY_DIR} ${SDL2_LIBRARY_DIR})
target_link_libraries(wagic PRIVATE
${JGE_LIBRARY}
${PNG_LIBRARIES} # Explicitly link libpng
${ZIPFS_LIBRARY} # Explicitly link libzipFS
${SDL2_LIBRARY}
${OPENGL_LIBRARIES}
${TINYXML_LIBRARIES}
${HGE_LIBRARY}
${BOOST_date_time}
${ZLIB_LIBRARIES} # Ensure zlib is linked
)
endif()
elseif(backend_psp)
if(PSP)
#${PSPSDK_PATH}/include
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
${UNZIP_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${GIF_INCLUDE_DIR} ${HGETOOLS_INCLUDE_DIRS})
add_executable(wagic ${MTG_generic_src} ${MTG_network_src})
target_link_libraries(wagic ${JGE_LIBRARY} ${PSPSDK_LIB} ${HGETOOLS_LIBRARY} ${FREETYPE_LIB} ${JPEG_LIBRARY}
${GIF_LIBRARIES} ${PNG_LIBRARIES} z m ${MIKMOD_LIBRARY} ${TINYXML_LIBRARIES}
stdc++ ${PSPSDK_REQUIRED_LIB})
set(PRXSPECS_FILE "${PSPSDK_PATH}/lib/prxspecs")
set(LINKFILE_FILE "${PSPSDK_PATH}/lib/linkfile.prx")
get_property(wagic_elf_location TARGET wagic PROPERTY LOCATION)
get_filename_component(wagic_elf_directory ${wagic_elf_location} PATH)
set_target_properties(wagic PROPERTIES LINK_FLAGS "-specs=${PRXSPECS_FILE} -Wl,-q,-T${LINKFILE_FILE}")
add_custom_command(TARGET wagic POST_BUILD
COMMAND ${PSPSDK_MKSFO_COMMAND} ARGS "'Wagic, the Homebrew?!'" "${wagic_elf_directory}/PARAM.SFO"
COMMAND ${PSPSDK_FIXUP_IMPORTS_COMMAND} ARGS ${wagic_elf_location}
COMMAND ${PSPSDK_PRXGEN_COMMAND} ARGS ${wagic_elf_location} "${wagic_elf_directory}/wagic.prx"
COMMAND ${PSPSDK_PACK_PBP_COMMAND} ARGS ${wagic_elf_directory}/EBOOT.PBP ${wagic_elf_directory}/PARAM.SFO ${CMAKE_CURRENT_SOURCE_DIR}/icon.png NULL ${CMAKE_CURRENT_SOURCE_DIR}/pic0.png ${CMAKE_CURRENT_SOURCE_DIR}/pic1.png NULL "${wagic_elf_directory}/wagic.prx" NULL)
else()
message(FATAL_ERROR "use the cross-compile toolchain to build as the psp target")
endif()
endif()
if(IOS)
set(MTG_generic_src ${MTG_generic_src} ${MTG_iOS_src} PARENT_SCOPE)
set(MTG_INCLUDE_DIRS ${MTG_INCLUDE_DIRS} ${MTG_iOS_INCLUDE_DIRS} PARENT_SCOPE)
endif()

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +1,84 @@
#NAME:The KOR
#DESC:The Kor never stand down.Golem-Skin Gauntlets (MRD) *1
Plains (8ED) *4
Plains (8ED) *4
Bonesplitter (MRD) *2
Vulshok Battlegear (MRD) *1
Plains (MRD) *4
Plains (MRD) *4
Plains (MRD) *4
Cranial Plating (5DN) *2
Skyhunter Skirmisher (5DN) *2
Paradise Mantle (5DN) *2
Shuko (BOK) *2
Umezawa's Jitte (BOK) *2
Kor Duelist (ZEN) *2
Spidersilk Net (ZEN) *1
Bone Saw (CFX) *2
Armament Master (ZEN) *3
Lone Missionary (ROE) *2
Pennon Blade (ROE) *1
Kor Line-Slinger (ROE) *2
Kitesail Apprentice (WWK) *2
Stoneforge Mystic (WWK) *2
Accorder's Shield (SOM) *2
Swords to Plowshares (EVT) *2
Kor Hookmaster (EVT) *2
#NAME:Tergrid Commander
#DESC:The Tergrid Commander Deck
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Ancient Tomb (EXP) *1
Animate Dead (VMA) *1
Arcane Signet (AFC) *1
Archon of Cruelty (MH2) *1
Barren Moor (C19) *1
Blackblade Reforged (SS2) *1
Bojuka Bog (C19) *1
Braids, Cabal Minion (EMA) *1
Butcher of Malakir *1
Charcoal Diamond *1
Command Beacon (PZ1) *1
Commander's Sphere (C19) *1
Corrupt *1
Crypt Ghast (GTC) *1
Damnation (MM3) *1
Dreadhorde Invasion (WAR) *1
Elvish Doomsayer *1
Fell Specter *1
Geier Reach Sanitarium (C19) *1
Gilded Lotus *1
Grave Pact (CMD) *1
Gray Merchant of Asphodel *1
Hedron Archive (C19) *1
Hymn to Tourach *1
Hypnotic Specter *1
Korlash, Heir to Blackblade *1
Leaden Myr *1
Lightning Greaves (AFC) *1
Liliana of the Dark Realms *1
Liliana, Dreadhorde General (WAR) *1
Liliana's Triumph (WAR) *1
Lotus Petal (MB1) *1
Megrim *1
Memory Jar (FVR) *1
Mind Stone (AFC) *1
Mortuary Mire *1
Mox Jet *1
Necrogen Mists (MRD) *1
Night's Whisper (EMA) *1
No Mercy (MP2) *1
Oppression (7ED) *1
Painful Quandary *1
Palladium Myr (MB1) *1
Phyrexian Arena (TD0) *1
Phyrexian Obliterator *1
Plaguecrafter (C19) *1
Pox (ME1) *1
Ravenous Chupacabra (MB1) *1
Reliquary Tower (M13) *1
Sangromancer (MBS) *1
Shadowspear (THB) *1
Sheoldred, Whispering One *1
Smallpox (M12) *1
Sol Ring (C19) *1
Solemn Simulacrum (TSR) *1
Soul Shatter (ZNR) *1
Steel Hellkite (C17) *1
Strip Mine (EXP) *1
Swamp (2XM) *4
Swamp (OTJ) *4
Swamp (MKM) *4
Swamp (WOE) *4
Swamp (LCI) *4
Swamp (DSK) *4
Swamp (BLB) *3
Sword of Feast and Famine (MPS) *1
Syr Konrad, the Grim *1
Temple of the False God *1
The Eldest Reborn *1
Thought Vessel (MB1) *1
Thoughtseize (2XM) *1
Thran Dynamo (C19) *1
Tinybones, Trinket Thief (JMP) *1
Tourach, Dread Cantor (MH2) *1
Urborg, Tomb of Yawgmoth (TSR) *1
Whip of Erebos (THS) *1
Witch of the Moors (JMP) *1
Witch's Cottage (ELD) *1
Worn Powerstone (PZ1) *1
#CMD:Tergrid, God of Fright (KHM) *1

View File

@@ -1,4 +1,4 @@
#NAME:Krenko's Hellrider
#NAME:Hellrider
#DESC:Standard R Aggro
#DESC:ISD-M13-RTR
#HINT:combo hold(Hellrider|myhand)^until(creature|mybattlefield)^cast(Hellrider|myhand)^restriction{type(creature|mybattlefield)~morethan~2}^totalmananeeded({2}{R}{R})

View File

@@ -1,40 +1,81 @@
#NAME:Wipe them out!
#DESC:Modern RBW Control
#HINT:castpriority(enchantment,sorcery,artifact,instant)
#HINT:combo hold(Devour Flesh|myhand)^until(creature|opponentbattlefield)^cast(Devour Flesh|myhand)^totalmananeeded({1}{B})
#HINT:combo hold(Pyroclasm|myhand)^cast(Pyroclasm|myhand)^restriction{type(creature[toughness<=2]|opponentbattlefield)~morethan~1}~totalmananeeded({1}{R})
#HINT:combo hold(Wrath of God|myhand)^cast(Wrath of God|myhand)^restriction{type(creature|opponentbattlefield)~morethan~1}^totalmananeeded({2}{W}{W})
#HINT:combo hold(Damnation|myhand)^cast(Damnation|myhand)^restriction{type(creature|opponentbattlefield)~morethan~1}^totalmananeeded({2}{B}{B})
#HINT:combo hold(Final Judgment|myhand)^cast(Final Judgment|myhand)^restriction{type(creature|opponentbattlefield)~morethan~1}^totalmananeeded({4}{W}{W})
#22 spells
#8 2-cc
Devour Flesh * 4
Pyroclasm (M11) * 4
#8 4-cc
Damnation * 4
Wrath of God (10E) * 4
#2 6-cc
Final Judgment * 2
#4 x-cc
Black Sun's Zenith * 2
Rakdos's Return * 2
#8 artifacts
Elixir of Immortality * 2
Staff of Nin * 4
Venser's Journal * 2
#4 enchantments
Lightmine Field * 4
#26 lands
Plateau (ME4) * 4
Badlands (ME4) * 4
Scrubland (ME4) * 4
Akoum Refuge * 4
Isolated Chapel * 4
Clifftop Retreat * 2
Urborg, Tomb of Yawgmoth * 1
Plains (CHK) * 2
Swamp (RTR) * 1
#NAME:Belbe Commander
#DESC:Deck by apparently (tappedout.net)
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Ancient Stone Idol
Apex Devastator
Archetype of Endurance
Artisan of Kozilek
Bane of Bala Ged
Beacon of Unrest
Bellowing Tanglewurm
Cabal Conditioning
Caller of the Pack
Colossus of Akros
Command Tower
Conduit of Ruin
Copper Myr
Court of Ambition
Cultivate
Dread Defiler
Eldrazi Conscription
Exsanguinate
Farseek
Fierce Empath
Forest (4ED) *4
Forest (NEO) *4
Forest (ONE) *4
Forest (SNC) *4
Garruk's Uprising
Gilanra, Caller of Wirewood
God-Pharaoh's Statue
Grave Betrayal
Helm of the Host
Hooded Blightfang
Horizon Stone
In Garruk's Wake
Josu Vess, Lich Knight
Kodama's Reach (CMD)
Leaden Myr
Leechridden Swamp
Lim-Dul's Hex
Loxodon Warhammer (10E)
Loyal Subordinate
Mardu Shadowspear
Mirror Shield
Night Market Lookout
Oblivion Sower
Pathrazer of Ulamog
Phyrexian Juggernaut
Phyrexian Triniform
Plague Spitter
Planar Bridge
Platinum Emperion
Polyraptor
Pulse Tracker
Rampant Growth
Return of the Wildspeaker
Sanctum of Stone Fangs
Sandstone Oracle
Sandwurm Convergence
Skull Storm
Skyclave Relic
Sol Ring
Staff of Nin
Swamp (ONE) *4
Swamp (NEO) *4
Swamp (SNC) *4
Swamp (4ED) *3
The Immortal Sun
Thornbow Archer
Thought Vessel
Three Visits
Thunderfoot Baloth
Torment of Hailfire
Ulamog's Crusher
Undergrowth Stadium
Urborg, Tomb of Yawgmoth
Vicious Conquistador
Yavimaya, Cradle of Growth
Zendikar Resurgent
#CMD:Belbe, Corrupted Observer (*) *1

View File

@@ -1,30 +1,92 @@
#NAME:Turbo Stasis
#DESC:Black Summer 1996
City of Brass (*) *4
Island (*) *13
Underground River (*) *4
Boomerang (*) *4
Force of Will (*) *4
Recall (*) *2
Kismet (*) *2
Land Tax (*) *1
Stasis (*) *4
Despotic Scepter (*) *3
Feldon's Cane (*) *2
Howling Mine (*) *4
Ivory Tower (*) *2
Zuran Orb (*) *1
Black Vise (*) *2
Counterspell (*) *4
Adarkar Wastes (*) *4
#SB: Kismet (*) *1
#SB: Wall of Air (*) *2
#SB: Arcane Denial (*) *4
#SB: Blue Elemental Blast (*) *2
#SB: Disenchant (*) *2
#SB: Hydroblast (*) *2
#SB: Lodestone Bauble (*) *1
#SB: Mana Short (*) *3
#SB: Swords to Plowshares (*) *1
#SB: Lim-Dul's Vault (*) *4
#NAME:Bello Commander
#DESC:Bloomburrow Precon Deck
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
#HINT:alwaysattackwith(creature[Elemental])
Abrade (BLC) (*) * 1
Arcane Signet (BLC) (*) * 1
Beast Within (BLC) (*) * 1
Berserkers' Onslaught (BLC) (*) * 1
Big Score (BLC) (*) * 1
Blasphemous Act (*) * 1
Bristling Backwoods (*) * 1
Burnished Hart (BLC) (*) * 1
Chaos Warp (*) * 1
Cinder Glade (BLC) (*) * 1
Command Tower (BLC) (*) * 1
Copperline Gorge (BLC) (*) * 1
Court of Embereth (*) * 1
Cultivate (BLC) (*) * 1
Decimate (BLC) (*) * 1
Domri, Anarch of Bolas (BLC) (*) * 1
Esika's Chariot (BLC) (*) * 1
Etali, Primal Storm (BLC) (*) * 1
Evercoat Ursine (BLC) (*) * 1
Evolving Wilds (BLC) (*) * 1
Exotic Orchard (BLC) (*) * 1
Explore (BLC) (*) * 1
Fanatic of Rhonas (*) * 1
Farseek (BLC) (*) * 1
Fellwar Stone (BLC) (*) * 1
Forest (BLB) (*) * 10
Forest (MH3) (*) * 4
Forest (LCI) (*) * 2
Forgotten Cave (BLC) (*) * 1
Frontier Warmonger (*) * 1
Game Trail (BLC) (*) * 1
Garruk's Packleader (BLC) (*) * 1
Garruk's Uprising (BLC) (*) * 1
Ghalta, Primal Hunger (BLC) (*) * 1
Gilded Lotus (BLC) (*) * 1
Goblin Anarchomancer (*) * 1
Goreclaw, Terror of Qal Sisma (BLC) (*) * 1
Grumgully, the Generous (BLC) (*) * 1
Gruul Signet (BLC) (*) * 1
Gruul Turf (BLC) (*) * 1
Gruul War Chant (*() * 1
Harmonize (BLC) (*) * 1
Hedron Archive (BLC) (*) * 1
Kodama of the East Tree (BLC) (*) * 1
Kona, Rescue Beastie (*) * 1
Llanowar Loamspeaker (BLC) (*) * 1
Lotus Cobra (BLC) (*) * 1
Mind Stone (BLC) (*) * 1
Mossfire Valley (BLC) (*) * 1
Mosswort Bridge (BLC) (*) * 1
Mountain (BLB) (*) * 4
Mountain (MH3) (*) * 4
Nature's Will (*) * 1
Ohran Frostfang (*) * 1
Outpost Siege (BLC) (*) * 1
Path of Discovery (BLC) (*) * 1
Primeval Bounty (BLC) (*) * 1
Prosperous Bandit (BLC) (*) * 1
Rampaging Baloths (BLC) (*) * 1
Rampant Growth (BLC) (*) * 1
Reliquary Tower (BLC) (*) * 1
Rolling Hamsphere (BLC) (*) * 1
Rootbound Crag (BLC) (*) * 1
Rugged Highlands (*) * 1
Sakura-Tribe Elder (BLC) (*) * 1
Sheltered Thicket (BLC) (*) * 1
Sol Ring (BLC) (*) * 1
Spine of Ish Sah (BLC) (*) * 1
Starstorm (BLC) (*) * 1
Street Riot (*) * 1
Sunbird's Invocation (BLC) (*) * 1
Taiga (*) * 1
Talisman of Impulse (BLC) (*) * 1
Temple of Abandon (BLC) (*) * 1
Tendershoot Dryad (BLC) (*) * 1
Terramorphic Expanse (BLC) (*) * 1
The Immortal Sun (*) * 1
The Shattered States Era (*) * 1
Thickest in the Thicket (BLC) (*) * 1
Thought Vessel (BLC) (*) * 1
Thran Dynamo (BLC) (*) * 1
Tranquil Thicket (BLC) (*) * 1
Unnatural Growth (BLC) (*) * 1
Warstorm Surge (BLC) (*) * 1
Wildsear, Scouring Maw (BLC) (*) * 1
Wooded Ridgeline (BLC) (*) * 1
#CMD:Bello, Bard of the Brambles (*) * 1

View File

@@ -1,81 +1,28 @@
#NAME:Belbe Commander 2023
#DESC:Deck by apparently (tappedout.net)
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Ancient Stone Idol
Apex Devastator
Archetype of Endurance
Artisan of Kozilek
Bane of Bala Ged
Beacon of Unrest
Bellowing Tanglewurm
Cabal Conditioning
Caller of the Pack
Colossus of Akros
Command Tower
Conduit of Ruin
Copper Myr
Court of Ambition
Cultivate
Dread Defiler
Eldrazi Conscription
Exsanguinate
Farseek
Fierce Empath
Forest (4ED) *4
Forest (NEO) *4
Forest (ONE) *4
Forest (SNC) *4
Garruk's Uprising
Gilanra, Caller of Wirewood
God-Pharaoh's Statue
Grave Betrayal
Helm of the Host
Hooded Blightfang
Horizon Stone
In Garruk's Wake
Josu Vess, Lich Knight
Kodama's Reach (CMD)
Leaden Myr
Leechridden Swamp
Lim-Dul's Hex
Loxodon Warhammer (10E)
Loyal Subordinate
Mardu Shadowspear
Mirror Shield
Night Market Lookout
Oblivion Sower
Pathrazer of Ulamog
Phyrexian Juggernaut
Phyrexian Triniform
Plague Spitter
Planar Bridge
Platinum Emperion
Polyraptor
Pulse Tracker
Rampant Growth
Return of the Wildspeaker
Sanctum of Stone Fangs
Sandstone Oracle
Sandwurm Convergence
Skull Storm
Skyclave Relic
Sol Ring
Staff of Nin
Swamp (ONE) *4
Swamp (NEO) *4
Swamp (SNC) *4
Swamp (4ED) *3
The Immortal Sun
Thornbow Archer
Thought Vessel
Three Visits
Thunderfoot Baloth
Torment of Hailfire
Ulamog's Crusher
Undergrowth Stadium
Urborg, Tomb of Yawgmoth
Vicious Conquistador
Yavimaya, Cradle of Growth
Zendikar Resurgent
#CMD:Belbe, Corrupted Observer (*) *1
#NAME:Wipe Them Out!
#DESC:Modern RBW Control
#HINT:castpriority(creature,enchantment,sorcery,artifact)
#HINT:combo hold(Cruel Edict|myhand)^until(creature|opponentbattlefield)^cast(Cruel Edict|myhand)^totalmananeeded({1}{B})
#HINT:combo hold(Pyroclasm|myhand)^cast(Pyroclasm|myhand)^restriction{type(creature[toughness<=2]|opponentbattlefield)~morethan~1}~totalmananeeded({1}{R})
#HINT:combo hold(Wrath of God|myhand)^cast(Wrath of God|myhand)^restriction{type(creature|opponentbattlefield)~morethan~1}^totalmananeeded({2}{W}{W})
#HINT:combo hold(Damnation|myhand)^cast(Damnation|myhand)^restriction{type(creature|opponentbattlefield)~morethan~1}^totalmananeeded({2}{B}{B})
#HINT:alwaysattackwith(Blightsteel Colossus)
Blightsteel Colossus * 2
Cruel Edict (10E) * 4
Pyroclasm *4
Damnation * 4
Wrath of God (10E) * 4
Black Sun's Zenith * 2
Rakdos's Return * 2
Elixir of Immortality * 2
Staff of Nin * 4
Venser's Journal * 2
Lightmine Field * 4
Plateau (ME4) * 4
Badlands (ME4) * 4
Scrubland (ME4) * 4
Akoum Refuge * 4
Isolated Chapel * 4
Clifftop Retreat * 2
Urborg, Tomb of Yawgmoth * 1
Plains (CHK) * 2
Swamp (RTR) * 1

View File

@@ -1,4 +1,4 @@
#NAME:Omnath Commander 2023
#NAME:Omnath Commander
#DESC:Deck concept by HurricaneHands
#DESC:(tappedout.net)
#DESC:Refined for Wagic by Bob
@@ -79,4 +79,4 @@ Where Ancients Tread
Wooded Foothills
Zendikar Incarnate
Zendikar's Roil
#CMD:Omnath, Locus of Rage (*) *1
#CMD:Omnath, Locus of Rage (*) *1

View File

@@ -1,104 +1,87 @@
#NAME:Ur-Dragon Commander 2023
#DESC:The Ur-Dragon Commander Deck
#NAME:Lyra Commander
#DESC:Deck by guitrunks01
#DESC:(archidekt.com)
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Aggravated Assault (*) * 1
Ancient Tomb (*) * 1
Arcane Signet (*) * 1
Atarka, World Render (*) * 1
Balefire Dragon (*) * 1
Bayou
Bladewing the Risen (*) * 1
Bloom Tender (*) * 1
Cascading Cataracts (*) * 1
Chromatic Lantern (*) * 1
Chromatic Orrery (*) * 1
Coalition Relic (*) * 1
Command Beacon (*) * 1
#HINT:combo hold(Mass Calcify|myhand)^cast(Mass Calcify|myhand)^restriction{type(creature|opponentbattlefield)~morethan~2}^totalmananeeded({2}{W}{W})
#HINT:combo hold(Blinding Light|myhand)^cast(Blinding Light|myhand)^restriction{type(creature|opponentbattlefield)~morethan~2}^totalmananeeded({3}{W}{W})
Always Watching (*) * 1
Akroma's Memorial (m13) (*) * 1
Akroma, Angel of Wrath (c20) (*) * 1
Angel of Finality (moc) (*) * 1
Angel of Invention (kld) (*) * 1
Angel of Jubilation (avr) (*) * 1
Angel of Serenity (c21) (*) * 1
Angel of the Dire Hour (plst) (*) * 1
Angel of the Ruins (c21) (*) * 1
Angelic Accord (plst) (*) * 1
Angelic Arbiter (m11) (*) * 1
Angelic Field Marshal (*) * 1
Arcane Signet (blc) (*) * 1
Avacyn, Angel of Hope (cmm) (*) * 1
Baneslayer Angel (m21) (*) * 1
Bishop of Wings (plst) (*) * 1
Blinding Light (*) * 1
Boon-Bringer Valkyrie (mom) (*) * 1
Burnished Hart (dsc) (*) * 1
Command Tower (*) * 1
Crucible of Fire (M15)
Crystal Quarry (*) * 1
Cultivate
Curiosity (*) * 1
Cyclonic Rift (*) * 1
Darksteel Ingot
Deathcap Glade
Debtors' Knell (*) * 1
Defense of the Heart (*) * 1
Deserted Beach
Dragonlord Silumgar (*) * 1
Dragonmaster Outcast
Dragon Tempest
Dreamroot Cascade
Elemental Bond
Exotic Orchard
Faeburrow Elder (*) * 1
Farseek (*) * 1
Fearsome Awakening (*) * 1
Fellwar Stone
Force of Will (*) * 1
Growth Spiral
Haunted Ridge
Haven of the Spirit Dragon (*) * 1
Hellkite Charger (ZEN) (*) * 1
Hellkite Tyrant (*) * 1
Indatha Triome (*) * 1
Karrthus, Tyrant of Jund (*) * 1
Keiga, the Tide Star (*) * 1
Ketria Triome (*) * 1
Kokusho, the Evening Star (*) * 1
Lightning Greaves (C17) (*) * 1
Lotus Petal (*) * 1
Malfegor (*) * 1
Mana Confluence (*) * 1
Mana Drain (*) * 1
Mirari's Wake
Mox Amber (*) * 1
Mox Opal (*) * 1
Mox Tantalite (*) * 1
Niv-Mizzet, the Firemind (*) * 1
Overgrown Farmland
Path of Ancestry (*) * 1
Plateau
Prismatic Geoscope (*) * 1
Ramos, Dragon Engine
Raugrin Triome (*) * 1
Rhystic Study
Rockfall Vale
Sarkhan the Masterless
Sarkhan's Unsealing
Savannah
Savage Ventmaw (*) * 1
Savai Triome (*) * 1
Scrubland
Shattered Sanctum
Shipwreck Marsh
Silumgar, the Drifting Death (*) * 1
Skithiryx, the Blight Dragon (*) * 1
Skyclave Relic (*) * 1
Skyshroud Claim (*) * 1
Sol Ring (*) * 1
Spoils of Victory (*) * 1
Stormcarved Coast
Sundown Pass
Swiftfoot Boots (*) * 1
Sword of Feast and Famine (*) * 1
Taiga
Temur Ascendancy (*) * 1
Teneb, the Harvester (*) * 1
Terror of the Peaks (*) * 1
Thrakkus the Butcher
Three Visits (*) * 1
Timeless Lotus
Tropical Island
Tundra
Unburial Rites (*) * 1
Underground Sea
Utvara Hellkite (*) * 1
Vaevictis Asmadi, the Dire (*) * 1
Volcanic Island
Warstorm Surge
Wrathful Red Dragon
Yosei, the Morning Star (*) * 1
Zagoth Triome (*) * 1
#CMD:The Ur-Dragon (*) * 1
Cosmos Elixir (khm) (*) * 1
Court of Grace (*) * 1
Crush Contraband (scd) (*) * 1
Darksteel Citadel (c18) (*) * 1
Divine Sacrament (*) * 1
Emeria Shepherd (znc) (*) * 1
Emeria, the Sky Ruin (plst) (*) * 1
Endless Atlas (cmm) (*) * 1
Entreat the Angels (avr) (*) * 1
Firemane Commando (moc) (*) * 1
Generous Gift (*) * 1
Ghostly Prison (*) * 1
Herald of War (mic) (*) * 1
Inspiring Overseer (blc) (*) * 1
Karmic Guide (ulg) (*) * 1
Lightning Greaves (m3c) (*) * 1
Linvala, Keeper of Silence (*) * 1
Luminarch Ascension (a25) (*) * 1
Marble Diamond (*) * 1
Mass Calcify (m15) (*) * 1
Minas Tirith (ltr) (*) * 1
Path to Exile (pf20) (*) * 1
Plains (bro) (*) * 4
Plains (woe) (*) * 4
Plains (dsk) (*) * 4
Plains (lci) (*) * 4
Plains (mkm) (*) * 4
Plains (blb) (*) * 3
Platinum Angel (plst) (*) * 1
Pristine Talisman (*) * 1
Quicksilver Amulet (brr) (*) * 1
Radiant Fountain (*) * 1
Rebuff the Wicked (tsr) (*) * 1
Revitalize (*) * 1
Righteous Valkyrie (khm) (*) * 1
Segovian Angel (plst) (*) * 1
Sephara, Sky's Blade (cmm) (*) * 1
Seraph Sanctuary (*) * 1
Serra Angel (*) * 1
Serra Ascendant (*) * 1
Serra Avenger (*) * 1
Serra the Benevolent (mh1) (*) * 1
Shadowspear (plst) (*) * 1
Sigarda's Splendor (mid) (*) * 1
Silence (m14) (*) * 1
Sol Ring (m3c) (*) * 1
Solemn Simulacrum (dsc) (*) * 1
Snow-Covered Plains (mh1) (*) * 4
Starnheim Aspirant (j22) (*) * 1
Steel Seraph (bro) (*) * 1
Swiftfoot Boots (blc) (*) * 1
Swords to Plowshares (cns) (*) * 1
Test of Endurance (*) * 1
The Book of Exalted Deeds (afr) (*) * 1
Thraben Watcher (mh2) (*) * 1
Thran Dynamo (uds) (*) * 1
Valkyrie Harbinger (j22) (*) * 1
Worn Powerstone (*) * 1
Youthful Valkyrie (fdn) (*) * 1
#CMD:Lyra Dawnbringer (dmr) (*) * 1

View File

@@ -1,83 +1,23 @@
#NAME:Ranar Commander 2023
#DESC:Kaldheim Commander Deck
#DESC:Phantom Premonition
#HINT:castpriority(commander,*)
#HINT:dontattackwith(Ranar the Ever-Watchful)
#HINT:dontblockwith(Ranar the Ever-Watchful)
Angel of Finality (*) * 1
Angel of Serenity (*) * 1
Arcane Artisan (*) * 1
Arcane Signet (*) * 1
Azorius Chancery (*) * 1
Azorius Guildgate (*) * 1
Azorius Signet (*) * 1
Banishing Light (*) * 1
Behold the Multiverse (*) * 1
Brago, King Eternal (*) * 1
Burnished Hart (*) * 1
Cleansing Nova (*) * 1
Cloudblazer (*) * 1
Cloudgoat Ranger (*) * 1
Command Tower (*) * 1
Commander's Sphere (*) * 1
Cosmic Intervention (*) * 1
Cryptic Caves (*) * 1
Curse of the Swine (*) * 1
Day of the Dragons (*) * 1
Eerie Interlude (*) * 1
Empyrean Eagle (*) * 1
Ethereal Valkyrie (*) * 1
Evangel of Heliod (*) * 1
Flickerwisp (*) * 1
Gates of Istfell (*) * 1
Geist-Honored Monk (*) * 1
Ghostly Flicker (*) * 1
Ghostly Prison (*) * 1
Glacial Floodplain (*) * 1
Goldnight Commander (*) * 1
Hero of Bretagard (*) * 1
Inspired Sphinx (*) * 1
Iron Verdict (*) * 1
Island (*) * 12
Kor Cartographer (*) * 1
Marble Diamond (*) * 1
Marshal's Anthem (*) * 1
Meandering River (*) * 1
Meteor Golem (*) * 1
Migratory Route (*) * 1
Mind Stone (*) * 1
Mist Raven (*) * 1
Mistmeadow Witch (*) * 1
Momentary Blink (*) * 1
Mulldrifter (*) * 1
Myriad Landscape (*) * 1
Niko Defies Destiny (*) * 1
Opal Palace (*) * 1
Plains (*) * 13
Ravenform (*) * 1
Replicating Ring (*) * 1
Restoration Angel (*) * 1
Return to Dust (*) * 1
Sage of the Beyond (*) * 1
Saw It Coming (*) * 1
Sea Gate Oracle (*) * 1
Sejiri Refuge (*) * 1
Sky Diamond (*) * 1
Sol Ring (*) * 1
Soulherder (*) * 1
Spectral Deluge (*) * 1
Stoic Farmer (*) * 1
Storm Herd (*) * 1
Sun Titan (*) * 1
Surtland Elementalist (*) * 1
Swiftfoot Boots (*) * 1
Synthetic Destiny (*) * 1
Tales of the Ancestors (*) * 1
Thunderclap Wyvern (*) * 1
Tranquil Cove (*) * 1
Vega, the Watcher (*) * 1
Wall of Omens (*) * 1
Warhorn Blast (*) * 1
Whirler Rogue (*) * 1
Windfall (*) * 1
#CMD:Ranar the Ever-Watchful (*) * 1
#NAME:Ashenmoor
#DESC:Deck for Wagic by Bob
#HINT:combo hold(Demonic Tutor|myhand)^cast(Demonic Tutor|myhand) targeting(Ashenmoor Liege|mylibrary)^totalmananeeded({1}{B})
#HINT:alwaysattackwith(Ashenmoor Gouger)
#HINT:dontblockwith(Ashenmoor Liege)
Ashenmoor Gouger (*) * 4
Ashenmoor Liege (*) * 4
Badlands (*) * 4
Demonic Tutor (CMM) (*) * 2
Dragonskull Summit (*) * 4
Emberstrike Duo (*) * 4
Footlight Fiend (*) * 4
Glass of the Guildpact (*) * 4
Goblin Outlander (*) * 2
Mountain (DSK) (*) * 4
Mountain (MKM) (*) * 2
Rakdos Cackler (*) * 4
Rakdos Shred-Freak (*) * 4
Shivan Zombie (*) * 2
Spike Jester (*) * 4
Swamp (DSK) (*) * 4
Swamp (MKM) (*) * 2
Terminate (2X2) (*) * 2

View File

@@ -1,83 +1,22 @@
#NAME:Vrondiss Commander 2023
#DESC:Forgotten Realms Commander Deck
#DESC:Draconic Rage
#HINT:castpriority(commander,*)
#HINT:alwaysattackwith(creature[Dragon Spirit])
Bogardan Hellkite (*) *1
Demanding Dragon (*) *1
Dragonmaster Outcast (*) *1
Hoard-Smelter Dragon (*) *1
Opportunistic Dragon (*) *1
Scourge of Valkas (*) *1
Shivan Hellkite (*) *1
Skyline Despot (*) *1
Skyship Stalker (*) *1
Taurean Mauler (*) *1
Terror of Mount Velus (*) *1
Thunderbreak Regent (*) *1
Chameleon Colossus (*) *1
Atarka, World Render (*) *1
Earth-Cult Elemental (*) *1
Anger (*) *1
Dragonlord's Servant (*) *1
Savage Ventmaw (*) *1
Dragonspeaker Shaman (*) *1
Chain Reaction (*) *1
Rishkar's Expertise (*) *1
Shamanic Revelation (*) *1
Rile (*) *1
Cultivate (*) *1
Explore (*) *1
Rampant Growth (*) *1
Magmaquake (*) *1
Spit Flame (*) *1
Decree of Savagery (*) *1
Kindred Summons (*) *1
Return of the Wildspeaker (*) *1
Beast Within (*) *1
Return to Nature (*) *1
Dragon's Hoard (*) *1
Arcane Signet (*) *1
Commander's Sphere (*) *1
Gruul Signet (*) *1
Heirloom Blade (*) *1
Sol Ring (*) *1
Gratuitous Violence (*) *1
Outpost Siege (*) *1
Warstorm Surge (*) *1
Barbarian Class (*) *1
Colossal Majesty (*) *1
Garruk's Uprising (*) *1
Cinder Glade (*) *1
Crucible of the Spirit Dragon (*) *1
Exotic Orchard (*) *1
Game Trail (*) *1
Haven of the Spirit Dragon (*) *1
Mossfire Valley (*) *1
Mosswort Bridge (*) *1
Command Tower (*) *1
Desert (*) *1
Gruul Turf (*) *1
Path of Ancestry (*) *1
Mountain (*) *12
Forest (*) *15
Klauth, Unrivaled Ancient (*) *1
Berserker's Frenzy (*) *1
Chaos Dragon (*) *1
Maddening Hex (*) *1
Vengeful Ancestor (*) *1
Bag of Tricks (*) *1
Druid of Purification (*) *1
Indomitable Might (*) *1
Neverwinter Hydra (*) *1
Wild Endeavor (*) *1
Dragonborn Champion (*) *1
Klauth's Will (*) *1
Wulfgar of Icewind Dale (*) *1
Component Pouch (*) *1
Sword of Hours (*) *1
Underdark Rift (*) *1
#CMD:Vrondiss, Rage of Ancients (*) *1
#DNG:Tomb of Annihilation (*) *1
#DNG:Lost Mine of Phandelver (*) *1
#DNG:Dungeon of the Mad Mage (*) *1
#NAME:Goblin Spike
#DESC:Deck for Wagic by Bob
#HINT:castpriority(creature,sorcery)
#HINT:combo hold(Lava Spike|myhand)^cast(Lava Spike|myhand)^restriction{turn:5}^totalmananeeded({R})
#HINT:combo hold(Goblin War Strike|myhand)^cast(Goblin War Strike|myhand)^restriction{turn:7}^totalmananeeded({R})
Foundry Street Denizen (*) * 4
Goblin Chieftain (*) * 4
Goblin Lackey (*) * 4
Goblin Piledriver (*) * 4
Goblin Rabblemaster (*) * 4
Goblin Ringleader (*) * 2
Goblin Warchief (*) * 2
Goblin War Strike (*) * 2
Lava Spike (*) * 4
Legion Loyalist (*) * 4
Mountain (OTJ) (*) * 4
Mountain (BLB) (*) * 4
Mountain (WOE) (*) * 4
Mountain (DSK) (*) * 4
Mountain (LCI) (*) * 4
Mountain (MKM) (*) * 2
Muxus, Goblin Grandee (*) * 4

View File

@@ -1,79 +1,24 @@
#NAME:Tergrid Commander 2023
#DESC:The Tergrid Commander Deck
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Necrogen Mists (MRD) *1
Animate Dead (VMA) *1
Mind Stone (AFC) *1
Steel Hellkite (C17) *1
Hedron Archive (C19) *1
Blackblade Reforged (SS2) *1
Swamp (2XM) *26
Strip Mine (EXP) *1
Archon of Cruelty (MH2) *1
No Mercy (MP2) *1
Whip of Erebos (THS) *1
Plaguecrafter (C19) *1
Smallpox (M12) *1
Geier Reach Sanitarium (C19) *1
Pox (ME1) *1
Braids, Cabal Minion (EMA) *1
Damnation (MM3) *1
Commander's Sphere (C19) *1
Liliana's Triumph (WAR) *1
Dream Devourer (KHM) *1
Night's Whisper (EMA) *1
Grave Pact (CMD) *1
Bojuka Bog (C19) *1
Chain of Smog (ONS) *1
Memory Jar (FVR) *1
Tinybones, Trinket Thief (JMP) *1
Sol Ring (C19) *1
Dreadhorde Invasion (WAR) *1
Command Beacon (PZ1) *1
Solemn Simulacrum (TSR) *1
Barren Moor (C19) *1
Lotus Petal (MB1) *1
Oppression (7ED) *1
Shadowspear (THB) *1
Worn Powerstone (PZ1) *1
Arcane Signet (AFC) *1
Lightning Greaves (AFC) *1
Tourach, Dread Cantor (MH2) *1
Ravenous Chupacabra (MB1) *1
Ancient Tomb (EXP) *1
Sword of Feast and Famine (MPS) *1
Witch of the Moors (JMP) *1
Thought Vessel (MB1) *1
Urborg, Tomb of Yawgmoth (TSR) *1
Thoughtseize (2XM) *1
Tyrite Sanctum (KHM) *1
Soul Shatter (ZNR) *1
Thran Dynamo (C19) *1
Sangromancer (MBS) *1
Phyrexian Arena (TD0) *1
Liliana, Dreadhorde General (WAR) *1
Crypt Ghast (GTC) *1
Palladium Myr (MB1) *1
Cabal Coffers (MH2) *1
Reliquary Tower (M13) *1
Cabal Stronghold (DOM) *1
Temple of the False God *1
Charcoal Diamond *1
Gilded Lotus *1
Liliana of the Dark Realms *1
Sheoldred, Whispering One *1
Gray Merchant of Asphodel *1
Fell Specter *1
Phyrexian Obliterator *1
Hypnotic Specter *1
Butcher of Malakir *1
The Eldest Reborn *1
Leaden Myr *1
Painful Quandary *1
Corrupt *1
Korlash, Heir to Blackblade *1
Syr Konrad, the Grim *1
Megrim *1
Mox Jet *1
#CMD:Tergrid, God of Fright (KHM) *1
#NAME:Kor Army
#DESC:Deck by dr3amsnatcher
#DESC:(tappedout.net). Refined
#DESC:for Wagic by Bob
Argentum Armor (*) * 2
Armament Master (*) * 4
Bladed Pinions (*) * 2
Bone Saw (*) * 4
Captain's Claws (*) * 4
Cranial Plating (*) * 2
Emeria, the Sky Ruin (*) * 1
Kabira Crossroads (*) * 2
Kitesail Apprentice (*) * 4
Kor Duelist (*) * 4
Oath of Gideon (*) * 2
Plains (ZEN) (*) * 4
Plains (BFZ) (*) * 4
Plains (M19) (*) * 4
Plains (ZNR) (*) * 4
Plains (TMP) (*) * 2
Stone Haven Outfitter (*) * 4
Stone Haven Pilgrim (*) * 2
Sword of Vengeance (*) * 3
Zamriel, Seraph of Steel (*) * 2

View File

@@ -1,90 +1,26 @@
#NAME:Tatyova Commander 2023
#DESC:The Tatyova Commander Deck
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
#HINT:combo hold(Finale of Devastation|myhand)^cast(Finale of Devastation|myhand) targeting(Worldspine Wurm|mylibrary)~totalmananeeded({11}{G}{G})
#HINT:combo hold(Genesis Wave|myhand)^cast(Genesis Wave|myhand)~totalmananeeded({5}{G}{G}{G})
Allosaurus Shepherd (JMP) *1
Rimewood Falls (KHM) *1
Explore (C19) *1
Rampant Growth (PRM) *1
Echoing Truth (C19) *1
Mystic Sanctuary (ELD) *1
Ramunap Excavator (PRM) *1
Prismatic Vista (H1R) *1
Harmonize (PRM) *1
Summer Bloom (POR) *1
Mana Reflection (SHM) *1
Cyclonic Rift (MM3) *1
Upheaval (MH2) *1
Wild Growth (AFC) *1
Narset, Parter of Veils (WAR) *1
Timetwister (PRM) *1
Thrasios, Triton Hero (PZ2) *1
Strip Mine (EXP) *1
Tropical Island (ME4) *1
Avenger of Zendikar (PRM) *1
Harrow (MB1) *1
Kodama's Reach (C17) *1
Fastbond (VMA) *1
Crucible of Worlds (PRM) *1
Force of Will (EMA) *1
Broken Bond (MB1) *1
Command Tower (C19) *1
Sylvan Scrying (MB1) *1
Solemn Simulacrum (MB1) *1
Simic Signet (C15) *1
Reliquary Tower (C19) *1
Genesis Wave (IMA) *1
Khalni Garden (PZ1) *1
Cultivate (PZ1) *1
Yavimaya Elder (UDS) *1
Exploration (PRM) *1
Sol Ring (C19) *1
Koma, Cosmos Serpent (KHM) *1
Simic Growth Chamber (C19) *1
Command Beacon (PZ1) *1
Eternal Witness (PZ1) *1
Kinnan, Bonder Prodigy (IKO) *1
Lotus Cobra (PRM) *1
Island (UNH) *8
Dryad Arbor (TSR) *1
Finale of Devastation (WAR) *1
Arcane Signet (AFC) *1
Flooded Grove (EXP) *1
Crop Rotation (2XM) *1
Forest (2XM) *10
Lightning Greaves (AFC) *1
Scalding Tarn (MH2) *1
Ancient Tomb (EXP) *1
Sakura-Tribe Elder (MB1) *1
Seedborn Muse (C19) *1
Prophet of Kruphix (PRM) *1
Misty Rainforest (ZNE) *1
Wayfarer's Bauble (C17) *1
Tyrite Sanctum (KHM) *1
Gaea's Cradle (USG) *1
Consecrated Sphinx (MBS) *1
Castle Vantress (ELD) *1
Verdant Catacombs (MH2) *1
Primeval Titan (TSR) *1
Rampaging Baloths (C19) *1
Pongify (TSR) *1
Flooded Strand (EXP) *1
Nyxbloom Ancient (THB) *1
Nexus of Fate (M19) *1
Polluted Delta (ONS) *1
Birds of Paradise (PRM) *1
Courser of Kruphix (TSR) *1
Search for Tomorrow (MB1) *1
Worldspine Wurm *1
Decanter of Endless Water *1
Tangled Islet *1
Hinterland Harbor *1
Thran Dynamo *1
Ancient Greenwarden *1
Multani, Yavimaya's Avatar *1
Scute Swarm *1
Oran-Rief Hydra *1
Aesi, Tyrant of Gyre Strait *1
#CMD:Tatyova, Benthic Druid (DOM) *1
#NAME:Shocking Minotaurs
#DESC:Deck for Wagic by Bob
#HINT:combo hold(Raise Dead|myhand)^cast(Raise Dead|myhand)^restriction{type(creature[toughness>=2]|mygraveyard)~morethan~0}~totalmananeeded({B})
Badlands (*) * 1
Blackcleave Cliffs (*) * 2
Bloodrage Brawler (*) * 4
Dragonskull Summit (*) * 2
Fanatic of Mogis (*) * 1
Felhide Petrifier (*) * 2
Gnarled Scarhide (*) * 2
Kragma Warcaller (*) * 4
Lightning Bolt (*) * 4
Mogis, God of Slaughter (*) * 2
Moraug, Fury of Akoum (*) * 1
Mountain (DSK) (*) * 4
Mountain (MKM) (*) * 3
Mountain (WOE) (*) * 4
Neheb, the Eternal (*) * 1
Neheb, the Worthy (*) * 3
Rageblood Shaman (*) * 4
Ragemonger (*) * 4
Raise Dead (9ED) (*) * 2
Shock (*) * 2
Swamp (DSK) (*) * 4
Swamp (WOE) (*) * 2
Terminate (NCC) (*) * 2

View File

@@ -1,85 +1,27 @@
#NAME:Ragavan Commander 2023
#DESC:The Ragavan Commander Deck
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Treasure Nabber (PZ2) *1
Dire Fleet Daredevil (AFC) *1
Trash for Treasure (C16) *1
Tome of Legends (ELD) *1
Helm of the Host (DOM) *1
Coercive Recruiter (CMR) *1
World at War (ROE) *1
Commander's Plate (CMR) *1
Neheb, the Eternal (AKR) *1
Strike It Rich (MH2) *1
Stolen Strategy *1
Shinka, the Bloodsoaked Keep (CHK) *1
Inventors' Fair (KLD) *1
Strip Mine (EXP) *1
Embercleave (ELD) *1
Break Through the Line (FRF) *1
Valakut, the Molten Pinnacle (ZEN) *1
Imperial Recruiter (ME2) *1
Tibalt's Trickery (KHM) *1
Mogg Salvage (NMS) *1
Seize the Day (ODY) *1
Mishra's Bauble (MB1) *1
Hellkite Tyrant (GTC) *1
Goblin Engineer (MH1) *1
Aggravated Assault (ONS) *1
Xorn (AFR) *1
Chromatic Lantern *1
Magda, Brazen Outlaw (KHM) *1
Sensei's Divining Top (EMA) *1
Combat Celebrant (AKR) *1
Blood Moon (2XM) *1
Access Tunnel (STX) *1
Sword of Hearth and Home (MH2) *1
Mox Opal (2XM) *1
Treasure Vault (AFR) *1
Sword of Fire and Ice (2XM) *1
Urza's Saga (MH2) *1
Jeska's Will (CMR) *1
Sol Ring (C19) *1
Seize the Spoils (KHM) *1
Abrade (PLIST) *1
Fury of the Horde (CSP) *1
Valakut Awakening (ZNR) *1
Mountain (UNH) *20
Godo, Bandit Warlord (CHK) *1
Mox Amber (DOM) *1
Breeches, Brazen Plunderer *1
Cursed Mirror (C21) *1
Price of Glory (ODY) *1
Spire of Industry (AER) *1
Vandalblast (AFC) *1
Ancient Tomb (ZNE) *1
Passionate Archaeologist *1
Mana Confluence (CMR) *1
Shatterskull Smashing (ZNR) *1
Thran Dynamo *1
Lightning Greaves (MB1) *1
Pirate's Pillage (RIX) *1
Shatter *1
Sword of Feast and Famine (MPS) *1
Goblin Tunneler *1
War's Toll (BBD) *1
Wayfarer's Bauble (C17) *1
Cathedral of War (M13) *1
Sword of Light and Shadow (2XM) *1
Underworld Breach (THB) *1
Reckless Fireweaver *1
Dockside Extortionist (C19) *1
Mox Diamond (FVR) *1
Bloodstained Mire (ONS) *1
Lightning Bolt (ME1) *1
City of Brass (ME4) *1
Goldspan Dragon (KHM) *1
Ruby Medallion (C14) *1
Sword of the Animist (AFC) *1
Grenzo, Havoc Raiser (PZ2) *1
Ancient Copper Dragon *1
Moraug, Fury of Akoum (ZNR) *1
Wheel of Fortune (VMA) *1
Port Razer (CMR) *1
#CMD:Ragavan, Nimble Pilferer (MH2) *1
#NAME:Rising Panic
#DESC: Deck for Wagic by Bob
#HINT:castpriority(artifact,instant,enchantment)
#HINT:combo hold(Rising Waters|myhand)^cast(Rising Waters|myhand)^restriction{type(Rising Waters|mybattlefield)~lessthan~1}^totalmananeeded({3}{U})
#HINT:combo hold(Dictate of Kruphix|myhand)^cast(Dictate of Kruphix|myhand)^restriction{type(Dictate of Kruphix|mybattlefield)~lessthan~1}^totalmananeeded({1}{U}{U})
#HINT:combo hold(Frozen Aether|myhand)^cast(Frozen Aether|myhand)^restriction{type(Frozen Aether|mybattlefield)~lessthan~1}^totalmananeeded({3}{U})
#HINT:combo hold(Propaganda|myhand)^cast(Propaganda|myhand)^restriction{type(Propaganda|mybattlefield)~lessthan~1}^totalmananeeded({2}{U})
#HINT:combo hold(Overburden|myhand)^cast(Overburden|myhand)^restriction{type(Overburden|mybattlefield)~lessthan~1}^totalmananeeded({1}{U})
#HINT:combo hold(Dream Tides|myhand)^cast(Dream Tides|myhand)^restriction{type(Dream Tides|mybattlefield)~lessthan~1}^totalmananeeded({1}{U})
Anvil of Bogardan (*) * 2
Black Vise (*) * 4
Dictate of Kruphix (*) * 3
Dream Tides (*) * 3
Ebony Owl Netsuke (*) * 2
Force of Will (*) * 4
Frozen Aether (*) * 3
Howling Mine (*) * 4
Iron Maiden (*) * 2
Island (4ED) (*) * 4
Island (M10) (*) * 4
Island (ICE) (*) * 4
Island (M20) (*) * 4
Island (MIR) (*) * 4
Island (REV) (*) * 3
Overburden (*) * 3
Propaganda (*) * 3
Rising Waters (*) * 4

View File

@@ -1,4 +1,4 @@
#NAME:Arcades Commander 2023
#NAME:Arcades Commander
#DESC:Original Deck by ashby4 (tappedout.net),
#DESC:refined for Wagic by Bob
#HINT:castpriority(commander,*)
@@ -95,4 +95,4 @@ Wall of Stolen Identity (*) * 1
Wall of Tanglecord (*) * 1
Wave of Reckoning (*) * 1
Yavimaya Coast (*) * 1
#CMD:Arcades, the Strategist (*) * 1
#CMD:Arcades, the Strategist (*) * 1

View File

@@ -1,4 +1,4 @@
#NAME:Krenko Commander 2023
#NAME:Krenko Commander
#DESC:Original Deck by AGunWithLegs (tappedout.net),
#DESC:refined for Wagic by Bob
#HINT:castpriority(commander,creature,*)
@@ -132,4 +132,4 @@ Warren Instigator (*) * 1
Whispersilk Cloak (*) * 1
#CMD:Krenko, Mob Boss (*) * 1
#CMD:Krenko, Mob Boss (*) * 1

View File

@@ -1,4 +1,4 @@
#NAME:Edgar Markov Commander 2023
#NAME:Edgar Markov Commander
#DESC:Original Deck Concept by DespairFaction (tappedout.net)
#DESC:Designed for Wagic by Bob
#HINT:castpriority(commander,creature,*)
@@ -94,4 +94,4 @@ Vito, Thorn of the Dusk Rose (*) * 1
Voldaren Stinger (*) * 1
Whispersilk Cloak (*) * 1
Wing-Scarred Crag (*) * 1
#CMD:Edgar Markov (*) * 1
#CMD:Edgar Markov (*) * 1

View File

@@ -1,57 +1,91 @@
#NAME:Lord of The Rings Commander 2023
#DESC:Original Deck Concept by ElderKuradio (tappedout.net)
#DESC:Designed for Wagic by Vitty85
#HINT:castpriority(commander,creature,*)
Aragorn and Arwen, Wed (*) * 1
Aragorn, the Uniter (*) * 1
Arwen, Mortal Queen (*) * 1
Elvish Mariner (*) * 1
Frodo, Determined Hero (*) * 1
Galadriel, Gift-Giver (*) * 1
Gandalf the White (*) * 1
Gandalf, White Rider (*) * 1
Gloin, Dwarf Emissary (*) * 1
Gollum, Scheming Guide (*) * 1
Gorbag of Minas Morgul (*) * 1
#NAME:Sauron Commander
#DESC:Original deck by Josh
#DESC:Edmundson (tappedout.net)
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Abrade (*) * 1
An Offer You Can't Refuse (*) * 1
Arcane Denial (*) * 1
Arcane Signet (*) * 1
Badlands (*) * 1
Bedevil (*) * 1
Big Score (*) * 1
Bone Miser (*) * 1
Callous Dismissal (*) * 1
Changeling Outcast (*) * 1
Chromatic Lantern (*) * 1
Command Tower (*) * 1
Commander's Sphere (*) * 1
Crumbling Necropolis (*) * 1
Dragonskull Summit (*) * 1
Dreadhorde Invasion (*) * 1
Drowned Catacomb (*) * 1
Eternal Skylord (*) * 1
Evolving Wilds (*) * 1
Exotic Orchard (*) * 1
Faithless Looting (*) * 1
Feed the Swarm (*) * 1
Fellwar Stone (*) * 1
Foray of Orcs (*) * 1
Gleaming Overseer (*) * 1
Gothmog, Morgul Lieutenant (*) * 1
Gwaihir the Windlord (*) * 1
Ioreth of the Healing House (*) * 1
Rangers of Ithilien (*) * 1
Saruman of Many Colors (*) * 1
Grishnakh, Brash Instigator (*) * 1
Haunted Ridge (*) * 1
Herald of Secret Streams (*) * 1
Honor the God-Pharaoh (*) * 1
Infernal Grasp (*) * 1
Inherited Envelope (*) * 1
Island (LTR) (*) * 4
Island (WOE) (*) * 1
Lazotep Chancellor (*) * 1
Lazotep Plating (*) * 1
March from the Black Gate (*) * 1
Mauhur, Uruk-hai Captain (*) * 1
Mindless Conscription (*) * 1
Mithril Coat (*) * 1
Mountain (LTR) (*) * 4
616930
619388
619389
619390
619391
619392
619393
619394
619395
Orcish Bowmasters (*) * 1
Orcish Siegemaster (*) * 1
Ringsight (*) * 1
Saruman the White (*) * 1
Sauron, the Dark Lord (*) * 1
Sauron, the Lidless Eye (*) * 1
Strider, Ranger of the North (*) * 1
Witch-king of Angmar (*) * 1
Saruman's Trickery (*) * 1
Saruman, the White Hand (*) * 1
Sauron, Lord of the Rings (*) * 1
Sauron, the Necromancer (*) * 1
Sheoldred, Whispering One (*) * 1
Shipwreck Marsh (*) * 1
Shivan Reef (*) * 1
Smoldering Marsh (*) * 1
Sol Ring (*) * 1
Stormcarved Coast (*) * 1
Sulfurous Springs (*) * 1
Sunken Hollow (*) * 1
Swamp (LTR) (*) * 4
Swamp (WOE) (*) * 4
Swamp (DSK) (*) * 3
Swarming of Moria (*) * 1
Talisman of Creativity (*) * 1
Talisman of Dominance (*) * 1
Talisman of Indulgence (*) * 1
Teferi's Ageless Insight (*) * 1
Temple of Epiphany (*) * 1
The Locust God (*) * 1
Thrill of Possibility (*) * 1
Ulamog, The Infinite Gyre (*) * 1
Underground River (*) * 1
Underground Sea (*) * 1
Vandalblast (*) * 1
Whispersilk Cloak (*) * 1
Widespread Brutality (*) * 1
Windfall (*) * 1
Witch-king, Bringer of Ruin (*) * 1
Barad-dur (*) * 1
Mount Doom (*) * 1
Mountain (LTR) * 13
Island (LTR) * 10
Swamp (LTR) * 10
Forest (LTR) * 10
Plains (LTR) * 10
Elven Chorus (*) * 1
Fires of Mount Doom (*) * 1
Gift of Strands (*) * 1
Long List of the Ents (*) * 1
Oath of the Grey Host (*) * 1
Scroll of Isildur (*) * 1
War of the Last Alliance (*) * 1
Borne Upon a Wind (*) * 1
Friendly Rivalry (*) * 1
Press the Enemy (*) * 1
Sauron's Ransom (*) * 1
Stern Scolding (*) * 1
You Cannot Pass! (*) * 1
Assault on Osgiliath (*) * 1
Hew the Entwood (*) * 1
Horses of the Bruinen (*) * 1
Last March of the Ents (*) * 1
Shadow Summoning (*) * 1
Shadow of the Enemy (*) * 1
Bilbo's Ring (*) * 1
Glamdring (*) * 1
Palantir of Orthanc (*) * 1
#CMD:Tom Bombadil (*) * 1
#CMD:Sauron, the Dark Lord (*) * 1

View File

@@ -0,0 +1,95 @@
#NAME:Graaz Commander
#DESC:Deck concept thanks to punkeduard
#DESC:Original deck by vasarto77 (tappedout.net)
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,creature,*)
#HINT:combo hold(All is Dust|myhand)^cast(All is Dust|myhand)^restriction{type(creature|opponentbattlefield)~morethan~2}^totalmananeeded({7})
Akroma's Memorial (*) * 1
All is Dust (*) * 1
Alloy Myr (*) * 1
Ancient Tomb (*) * 1
Arcbound Crusher (*) * 1
Ash Barrens (*) * 1
Bitterthorn, Nissa's Animus (*) * 1
Blinkmoth Urn (*) * 1
Bonded Construct (*) * 1
Captain's Claws (*) * 1
Chief of the Foundry (*) * 1
Coat of Arms (*) * 1
Commander's Plate (*) * 1
Copper Myr (*) * 1
Darksteel Citadel (*) * 1
Darksteel Forge (*) * 1
Darksteel Juggernaut (*) * 1
Dolmen Gate (*) * 1
Eldrazi Monument (*) * 1
Environmental Sciences (*) * 1
Etched Champion (*) * 1
Fellwar Stone (*) * 1
Field of the Dead (*) * 1
Flayer Husk (*) * 1
Forsaken Monument (*) * 1
Foundry of the Consuls (*) * 1
Gemini Engine (*) * 1
Gold Myr (*) * 1
Golem Foundry (*) * 1
Guildless Commons (*) * 1
Ichorclaw Myr (*) * 1
Iron Apprentice (*) * 1
Iron Myr (*) * 1
It That Betrays (*) * 1
Kozilek, Butcher of Truth (*) * 1
Leaden Myr (*) * 1
Mascot Exhibition (*) * 1
Memnite (*) * 1
Mishra's Self-Replicator (*) * 1
Monkey Cage (*) * 1
Mox Opal (*) * 1
Myr Battlesphere (*) * 1
Myr Retriever (*) * 1
Myr Turbine (*) * 1
Nettlecyst (*) * 1
Oketra's Monument (*) * 1
Ornithopter (*) * 1
Ornithopter of Paradise (*) * 1
Palladium Myr (*) * 1
Patchwork Automaton (*) * 1
Phyrexian Walker (*) * 1
Plague Myr (*) * 1
Pristine Talisman (*) * 1
Scavenger Grounds (*) * 1
Sea Gate Wreckage (*) * 1
Searchlight Companion (*) * 1
Shimmer Myr (*) * 1
Shrine of the Forsaken Gods (*) * 1
Signal Pest (*) * 1
Silver Myr (*) * 1
Skittering Cicada (*) * 1
Skittering Invasion (*) * 1
Sol Ring (*) * 1
Sparring Construct (*) * 1
Spawning Bed (*) * 1
Spawnsire of Ulamog (*) * 1
Steel Overseer (*) * 1
Stonecoil Serpent (*) * 1
Swiftfoot Boots (*) * 1
Temple of the False God (*) * 1
Thopter Assembly (*) * 1
Thought Vessel (*) * 1
Thran Dynamo (*) * 1
Universal Automaton (*) * 1
Unwinding Clock (*) * 1
Urza's Mine (*) * 1
Urza's Power Plant (*) * 1
Urza's Saga
Urza's Tower (*) * 1
Urza's Workshop (*) * 1
Void Winnower (*) * 1
Wastes (CMM) (*) * 4
Wastes (J22) (*) * 4
Wastes (OGW) (*) * 4
Wastes (TSR) (*) * 4
Worn Powerstone (*) * 1
Zhalfirin Void (*) * 1
#CMD:Graaz, Unstoppable Juggernaut (*) * 1

View File

@@ -1,79 +1,96 @@
#Black/White Deck 10E/RV
#NAME:The Hive
#DESC:When the last living being
#DESC:succumbs to the terrible blight
#DESC:the wasps will rise
#DESC:stirring the barren air
#DESC:with their hum.
#4x The hive
135253
135253
135253
135253
#4x pestilence
1172
1172
1172
1172
#4x Ancestor chosen
130550
130550
130550
130550
#4x assassinate
135194
135194
135194
135194
#4x bottle gnomes
129495
129495
129495
129495
#4x Drudge skelettons
129529
129529
129529
129529
#4x Glorious Anthem
129572
129572
129572
129572
#4x Paladin en Vec
129668
129668
129668
129668
#2 x Deathmark
129910
129910
#2x Demistify
129524
129524
#12 swamps
129754
129756
129755
129757
129754
129756
129755
129757
129754
129756
129755
129757
#12x plains
129680
129681
129682
129683
129680
129681
129682
129683
129680
129681
129682
129683
#NAME:Tobias Commander
#DESC:Tobias Andrion considers himself
#DESC:a master of strategy. Can you
#DESC:defeat him?
#DESC:
#DESC:Win Wagic duels to unlock
#DESC:more Commander opponents
#DESC:
#DESC:Original deck idea by Goraghull
#DESC:(mtggoldfish.com)
#DESC:Built for Wagic by Bob
#HINT:castpriority(commander,*)
Acrobatic Maneuver (*) * 1
Aethersnipe (*) * 1
Alabaster Dragon (*) * 1
Angelic Renewal (*) * 1
Aqueous Form (*) * 1
Archaeomancer (*) * 1
Ash Barrens (*) * 1
Azorius Guildgate (*) * 1
Azorius Signet (*) * 1
Blur (*) * 1
Capsize (*) * 1
Cloak of Mists (*) * 1
Cloudshift (*) * 1
Command Tower (*) * 1
Commander's Sphere (*) * 1
Counterspell (*) * 1
Deep Analysis (*) * 1
Displace (*) * 1
Drifting Meadow (*) * 1
Enlightened Maniac (*) * 1
Ephemerate (*) * 1
Essence Flux (*) * 1
Fellwar Stone (*) * 1
Flicker of Fate (*) * 1
Forge of Heroes (*) * 1
Forsake the Worldly (*) * 1
Ghostly Flicker (*) * 1
Icewind Stalwart (*) * 1
Idyllic Beachfront (*) * 1
Inspiring Overseer (*) * 1
Island (*) * 4
Island (WOE) (*) * 4
Island (LCI) (*) * 4
Journey to Nowhere (*) * 1
Kor Cartographer (*) * 1
Late to Dinner (*) * 1
Lonely Sandbar (*) * 1
Lose Focus (*) * 1
Man-o'-War (*) * 1
Meandering River (*) * 1
Mind Stone (*) * 1
Mist Raven (*) * 1
Mnemonic Wall (*) * 1
Momentary Blink (*) * 1
Muse Drake (*) * 1
Negate (M12) (*) * 1
Oblivion Ring (*) * 1
Opal Palace (*) * 1
Palace Sentinels (*) * 1
Pegasus Guardian (*) * 1
Plains (*) * 4
Plains (WOE) (*) * 4
Plains (LCI) (*) * 4
Plains (OTJ) (*) * 1
Ponder (M12) (*) * 1
Pondering Mage (*) * 1
Preordain (*) * 1
Protective Bubble (*) * 1
Remote Isle (*) * 1
Revoke Existence (*) * 1
Salvager of Secrets (*) * 1
Scrivener (*) * 1
Scrollshift (*) * 1
Sea Gate Oracle (*) * 1
Sensor Splicer (*) * 1
Settle Beyond Reality (*) * 1
Skyscanner (*) * 1
Soul Warden (*) * 1
Soul of Migration (*) * 1
Spirited Companion (*) * 1
Stonehorn Dignitary (*) * 1
Suture Priest (*) * 1
Swords to Plowshares (*) * 1
Teferi's Time Twist (*) * 1
Temporal Fissure (*) * 1
The Modern Age (*) * 1
Thought Vessel (*) * 1
Tranquil Cove (*) * 1
Turn to Mist (*) * 1
Vedalken Dismisser (RAV) (*) * 1
Whirlpool Rider (*) * 1
Whispersilk Cloak (*) * 1
#CMD:Tobias Andrion (*) * 1

View File

@@ -0,0 +1,92 @@
#NAME:Shalai-Hallar Commander
#DESC:Deck concept thanks to Vitty85
#DESC:Original deck by gabao (tappedout.net)
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,creature,*)
#HINT:dontattackwith(Birds of Paradise)
#HINT:dontblockwith(Birds of Paradise)
#HINT:alwaysattackwith(Kalonian Hydra)
Abzan Battle Priest (*) * 1
Abzan Falconer (*) * 1
Ajani's Pridemate (M11) (*) * 1
All Will Be One (*) * 1
Arcane Signet (*) * 1
Arwen, Weaver of Hope (*) * 1
Basri's Solidarity (*) * 1
Birds of Paradise (*) * 1
Botanical Brawler (*) * 1
Branching Evolution (*) * 1
Bretagard Stronghold (*) * 1
Canopy Vista (*) * 1
Cathars' Crusade (*) * 1
Cinder Glade (*) * 1
Command Tower (*) * 1
Conclave Mentor (*) * 1
Cultivate (*) * 1
Death's Presence (*) * 1
Defiler of Vigor (*) * 1
Dusk Legion Duelist (*) * 1
Enduring Scalelord (*) * 1
Evolution Sage (*) * 1
Evolving Wilds (*) * 1
Exotic Orchard (*) * 1
Farseek (*) * 1
Felidar Retreat (*) * 1
Forest (LTR) (*) * 4
Forest (CMM) (*) * 4
Fortified Village (*) * 1
Game Trail (*) * 1
Goblin Anarchomancer (*) * 1
Good-Fortune Unicorn (*) * 1
Grumgully, the Generous (*) * 1
Gyre Sage (*) * 1
Halana and Alena, Partners (*) * 1
Hardened Scales (*) * 1
Heliod, Sun-Crowned (*) * 1
Hydra's Growth (*) * 1
Incubation Druid (*) * 1
Inspiring Call (*) * 1
Invigorating Surge (*) * 1
Ivy Lane Denizen (*) * 1
Kalonian Hydra (*) * 1
Kami of Whispered Hopes (*) * 1
Keen Sense (*) * 1
Kodama's Reach (CMM) (*) * 1
Krenko, Tin Street Kingpin (*) * 1
Krosan Grip (*) * 1
Krosan Verge (*) * 1
Lifelink (*) * 1
Loyal Guardian (*) * 1
Managorger Hydra (*) * 1
Master Chef (*) * 1
Mayael's Aria (*) * 1
Mikaeus, the Lunarch (*) * 1
Mountain (LTR) (*) * 4
Mountain (CMM) (*) * 4
Nature's Lore (*) * 1
Ozolith, the Shattered Spire (*) * 1
Path to Exile (*) * 1
Plains (LTR) (*) * 4
Plains (CMM) (*) * 4
Pledge of Unity (*) * 1
Rampant Growth (*) * 1
Renata, Called to the Hunt (*) * 1
Resourceful Defense (*) * 1
Rhythm of the Wild (*) * 1
Shalai, Voice of Plenty (*) * 1
Sol Ring (*) * 1
Solidarity of Heroes (*) * 1
Sungrass Prairie (*) * 1
Surge of Salvation (*) * 1
Sword of Truth and Justice (*) * 1
Swords to Plowshares (*) * 1
Take Up the Shield (*) * 1
Taurean Mauler (*) * 1
Temple of the False God (*) * 1
Terramorphic Expanse (*) * 1
Together Forever (*) * 1
Trelasarra, Moon Dancer (*) * 1
Twinblade Paladin (*) * 1
Visions of Dominance (*) * 1
Wildwood Scourge (*) * 1
#CMD:Shalai and Hallar (*) * 1

View File

@@ -0,0 +1,89 @@
#NAME:Vial Smasher Commander
#DESC:Original deck by GrwingErbw (tappedout.net)
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
#HINT:dontattackwith(Vial Smasher the Fierce)
#HINT:dontblockwith(Vial Smasher the Fierce)
Abrade (*) * 1
Angrath, the Flame-Chained (*) * 1
Archfiend of Despair (*) * 1
Badlands (*) * 1
Banefire (M19) (*) * 1
Baneful Omen (*) * 1
Bituminous Blast (C16) (*) * 1
Black Market (*) * 1
Blasphemous Act (*) * 1
Bojuka Bog (*) * 1
Brash Taunter (*) * 1
Breath of Malfegor (*) * 1
Charmbreaker Devils (*) * 1
Cinder Barrens (*) * 1
City on Fire (*) * 1
Command Tower (*) * 1
Curtains' Call (*) * 1
Decree of Pain (*) * 1
Doom Blade (*) * 1
Dragonskull Summit (*) * 1
Dreadbore (*) * 1
Everlasting Torment (*) * 1
Expedition Map (*) * 1
Exsanguinate (*) * 1
Falkenrath Noble (*) * 1
Fiery Confluence (*) * 1
Fiery Emancipation (*) * 1
Fire Diamond (*) * 1
Font of Mythos (CON) (*) * 1
Foreboding Ruins (*) * 1
Go for the Throat (*) * 1
Gratuitous Violence (*) * 1
Gray Merchant of Asphodel (*) * 1
Guttersnipe (*) * 1
Hero's Downfall (*) * 1
Howling Mine (*) * 1
In Garruk's Wake (*) * 1
Indulgent Tormentor (*) * 1
Kaervek the Merciless (*) * 1
Kederekt Parasite (*) * 1
Lightning Reaver (*) * 1
Malfegor (*) * 1
Mogis, God of Slaughter (*) * 1
Mountain (MKM) (*) * 4
Mountain (WOE) (*) * 4
Mountain (LCI) (*) * 4
Mountain (LTR) (*) * 1
Murder (*) * 1
Neheb, the Eternal (*) * 1
Painful Quandary (*) * 1
Phyrexian Arena (*) * 1
Polluted Bonds (*) * 1
Rakdos Carnarium (*) * 1
Rakdos Guildgate (*) * 1
Rakdos Signet (*) * 1
Rakdos's Return (*) * 1
Rakdos, Lord of Riots (*) * 1
Sheoldred, the Apocalypse (*) * 1
Sin Prodder (*) * 1
Skull Rend (*) * 1
Smoldering Marsh (*) * 1
Sol Ring (*) * 1
Solemn Simulacrum (*) * 1
Star of Extinction (*) * 1
Starstorm (*) * 1
Swamp (MKM) (*) * 4
Swamp (WOE) (*) * 4
Swamp (LCI) (*) * 4
Swamp (LTR) (*) * 1
Temple of Malice (*) * 1
Temple of the False God (*) * 1
Temporal Extortion (*) * 1
Terminate (CMD) (*) * 1
Thought Vessel (*) * 1
Torment of Hailfire (*) * 1
Tragic Slip (*) * 1
Twilight Prophet (*) * 1
Unlicenced Disintergration (*) * 1
Vicious Shadows (*) * 1
Volcanic Vision (*) * 1
Waste Not (*) * 1
Wound Reflection (*) * 1
#CMD:Vial Smasher the Fierce (*) * 1

View File

@@ -0,0 +1,25 @@
#NAME:Draw and Die!
#DESC:Deck concept by ChocolateLightning
#DESC:(tappedout.net), refined for
#DESC:Wagic by Bob
#HINT:dontattackwith(Fate Unraveler)
#HINT:dontblockwith(Fate Unraveler)
Dictate of Kruphix (*) * 3
Dismal Backwater (*) * 2
Drowned Catacomb (*) * 4
Fate Unraveler (*) * 4
Fog Bank (*) * 2
Forced Fruition (*) * 2
Howling Mine (*) * 4
Island (MIR) (*) * 4
Island (ICE) (*) * 4
Liliana's Caress (*) * 2
Master of the Feast (*) * 4
Ob Nixilis, the Hate-Twisted (*) * 3
Peer into the Abyss (*) * 1
Teferi's Puzzle Box (*) * 2
Shield Sphere (*) * 3
Swamp (ZEN) (*) * 4
Swamp (4ED) (*) * 4
Underworld Dreams (*) * 4
Underground Sea (*) * 4

View File

@@ -0,0 +1,29 @@
#NAME:Cut Off One Head...
#DESC:Deck concept by Prospekt
#DESC:(tappedout.net), refined for
#DESC:Wagic by Bob
#HINT:dontattackwith(Birds of Paradise)
#HINT:dontblockwith(Birds of Paradise)
#HINT:dontattackwith(Karametra's Acolyte)
#HINT:alwaysattackwith(Kalonian Hydra)
#HINT:combo hold(Alpha Authority|myhand)^until(creature[-Hydra]|mybattlefield)^cast(Alpha Authority|myhand) targeting(creature[-Hydra]|mybattlefield)^restriction{type(Alpha Authority|mybattlefield)~lessthan~1}^totalmananeeded({1}{G})
#HINT:combo hold(Canopy Cover|myhand)^until(creature[-Hydra]|mybattlefield)^cast(Canopy Cover|myhand) targeting(creature[-Hydra]|mybattlefield)^restriction{type(Canopy Cover|mybattlefield)~lessthan~1}^totalmananeeded({1}{G})
Alpha Authority * 2
Birds of Paradise * 4
Beast Within * 3
Canopy Cover * 2
Cultivate * 4
Forest (MIR) * 4
Forest (ICE) * 4
Forest (4ED) * 4
Forest (5ED) * 4
Forest (7ED) * 4
Forest (RAV) * 2
Kalonian Hydra * 2
Karametra's Acolyte * 2
Khalni Hydra * 4
Managorger Hydra * 4
Mistcutter Hydra * 3
Primordial Hydra * 4
Solidarity of Heroes * 2
Voracious Hydra * 2

View File

@@ -0,0 +1,31 @@
#NAME:Nazgul
#DESC:Deck for Wagic by Bob
#HINT:combo hold(Sam's Desperate Rescue|myhand)^cast(Sam's Desperate Rescue|myhand) targeting(Nazgul|mygraveyard)^totalmananeeded({B})
#HINT:combo hold(Demonic Tutor|myhand)^cast(Demonic Tutor|myhand) targeting(Nazgul|mylibrary)^totalmananeeded({1}{B})
Bog Wraith (*) * 4
Claim the Precious (*) * 3
Demonic Tutor (*) * 2
Forced Adaptation (*) * 2
Forest (LTR) (*) * 4
Forest (WOE) (*) * 3
Hardened Scales (*) * 4
Inherited Envelope (*) * 3
Ringwraiths (*) * 2
Sam's Desperate Rescue (*) * 2
Sheoldred, Whispering One (*) * 1
Smeagol, Helpful Guide (*) * 2
Swamp (DSK) (*) * 4
Swamp (LTR) (*) * 4
Swamp (WOE) (*) * 3
The Black Breath (*) * 2
Urborg, Tomb of Yawgmoth (LTC) (*) * 2
Woodland Cemetery (LTC) * 4
616930
619388
619389
619390
619391
619392
619393
619394
619395

View File

@@ -1,60 +1,60 @@
#Plain white deck
#NAME:Justice
#DESC:Defending law with an army
#DESC:of zealous followers,
#DESC:every criminal shall be punished
#DESC:with the wrath of the just.
#4x Crusade,{W}{W}, Enchantment, all white creatures +1/+1
1341
1341
1341
1341
#4x Swords to Plowshares, {W} Remove target creature from game, controller gains life = strength
1367
1367
1367
1367
#NAME:Kithkin
#DESC:Led by the Cenn,
#DESC:united by the thoughtweft,
#DESC:challenge just one
#DESC:champion of Goldmeadow,
#DESC:and you will face
#DESC:the entire cla-chan!
#4x Glorious Anthem, {1}{W}{W}, Enchantment, Creatures you control get +1/+1
129572
129572
129572
129572
#4x Paladin en-Vec, {1}{W}{W}, Creature - Human Knight,2/2, first strike protection from red and black
129668
129668
129668
129668
#4x Knight of Meadowgrain,{W}{W}, Creature-Kithin Knight,2/2,first strike,lifelink
139715
139715
139715
139715
#4x Wizened Cenn,{W}{W}, Creature - Kithin Cleric,2/2, other kithin get +1/+1
#4x Wizened Cenn,{W}{W}, Creature - Kithkin Cleric,2/2, other kithin get +1/+1
139716
139716
139716
139716
#4x Zealous Guardian,{WU}, Creature - Kithin Soldier,1/1,flash
#4x Zealous Guardian,{WU}, Creature - Kithkin Soldier,1/1,flash
142028
142028
142028
142028
#4x Ballynock Cohort,{2}{W},Creature - Kithin Soldier,2/2,First strike, get +1/+1 aslongas you control another white creature
#4x Ballynock Cohort,{2}{W},Creature - Kithkin Soldier,2/2,First strike, get +1/+1 aslongas you control another white creature
142045
142045
142045
142045
#2x Armored Ascension,{3}{W},Enchant creature, +1/+1 for each plains and flying
#4x Armored Ascension,{3}{W},Enchant creature, +1/+1 for each plains and flying
146041
146041
#2x Oversoul of Dusk,{WG}{WG}{WG}{WG}{WG},5/5, Creature - Spirit avatar, protection from blue,red and black
146735
146735
#4x Thistledown Liege,{1}{WU}{WU}{WU}, 1/3, creature - Kithin Knight, give +1/+1 to blue and white creature you control
146041
146041
#4x Thistledown Liege,{1}{WU}{WU}{WU}, 1/3, creature - Kithkin Knight, give +1/+1 to blue and white creature you control
147409
147409
147409
147409
#4x Kihtkin Shielddare, {1}{W},1/1 creature - Kithkin soldier, {t}{W}:target blocking creature gets +2/+2
158238
158238
158238
158238
#4x Goldmeadow Harrier, {W},1/1 creature - Kithkin soldier,{W}:tap target creature
139397
139397
139397
139397
#4x Field Marshall, {1}{W}{W}, 2/2 creature - Human soldier, Other Soldier creatures get +1/+1 and have first strike
135258
135258
135258
135258
#4x Mobilization, {2}{W}, enchantment, Soldier creatures have vigilance, {2}{W}:Put a 1/1 white Soldier creature token into play
129716
129716
129716
129716
#20x Plains (10E)
129683
129683

View File

@@ -1,78 +1,90 @@
#NAME:Kithkin
#DESC:Led by the Cenn,
#DESC:united by the thoughtweft,
#DESC:challenge just one
#DESC:champion of Goldmeadow,
#DESC:and you will face
#DESC:the entire cla-chan!
#4x Glorious Anthem, {1}{W}{W}, Enchantment, Creatures you control get +1/+1
129572
129572
129572
129572
#4x Wizened Cenn,{W}{W}, Creature - Kithkin Cleric,2/2, other kithin get +1/+1
139716
139716
139716
139716
#4x Zealous Guardian,{WU}, Creature - Kithkin Soldier,1/1,flash
142028
142028
142028
142028
#4x Ballynock Cohort,{2}{W},Creature - Kithkin Soldier,2/2,First strike, get +1/+1 aslongas you control another white creature
142045
142045
142045
142045
#4x Armored Ascension,{3}{W},Enchant creature, +1/+1 for each plains and flying
146041
146041
146041
146041
#4x Thistledown Liege,{1}{WU}{WU}{WU}, 1/3, creature - Kithkin Knight, give +1/+1 to blue and white creature you control
147409
147409
147409
147409
#4x Kihtkin Shielddare, {1}{W},1/1 creature - Kithkin soldier, {t}{W}:target blocking creature gets +2/+2
158238
158238
158238
158238
#4x Goldmeadow Harrier, {W},1/1 creature - Kithkin soldier,{W}:tap target creature
139397
139397
139397
139397
#4x Field Marshall, {1}{W}{W}, 2/2 creature - Human soldier, Other Soldier creatures get +1/+1 and have first strike
135258
135258
135258
135258
#4x Mobilization, {2}{W}, enchantment, Soldier creatures have vigilance, {2}{W}:Put a 1/1 white Soldier creature token into play
129716
129716
129716
129716
#20x Plains (10E)
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
129683
#NAME:Atarka Commander
#DESC:Atarka's dragons bring death
#DESC:from the air. Can you defeat
#DESC:her?
#DESC:
#DESC:Win Wagic duels to unlock
#DESC:more Commander opponents
#DESC:
#DESC:Draconic Destruction
#DESC:Precon deck, 2022
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Akoum Hellkite (*) * 1
Arcane Signet (*) * 1
Atarka Monument (*) * 1
Beast Within (*) * 1
Bower Passage (*) * 1
Bristling Backwoods (*) * 1
Chain Reaction (*) * 1
Cinder Glade (*) * 1
Command Tower (*) * 1
Commander's Sphere (*) * 1
Crucible of Fire (ALA) (*) * 1
Cultivate (*) * 1
Demanding Dragon (*) * 1
Draconic Disciple (*) * 1
Dragon Mage (*) * 1
Dragon Tempest (*) * 1
Dragon's Hoard (*) * 1
Dragonkin Berserker (*) * 1
Dragonlord's Servant (*) * 1
Dragonmaster Outcast (*) * 1
Dragonspeaker Shaman (*) * 1
Drakuseth, Maw of Flames (*) * 1
Drumhunter (*) * 1
Elemental Bond (*) * 1
Fervor (*) * 1
Flameblast Dragon (ALA) (*) * 1
Foe-Razer Regent (*) * 1
Forest (BLB) (*) * 4
Forest (MKM) (*) * 4
Forest (LCI) (*) * 4
Furnace Whelp (10E) (*) * 1
Game Trail (*) * 1
Garruk's Uprising (*) * 1
Harbinger of the Hunt (*) * 1
Harmonize (*) * 1
Hoard-Smelter Dragon (*) * 1
Hunter's Insight (*) * 1
Hunter's Prowess (*) * 1
Kazandu Refuge (*) * 1
Kodama's Reach (CHK) (*) * 1
Lathliss, Dragon Queen (*) * 1
Lightning Bolt (*) * 1
Llanowar Elves (*) * 1
Magmaquake (C14) (*) * 1
Mordant Dragon (*) * 1
Mountain (BLB) (*) * 4
Mountain (MKM) (*) * 4
Mountain (LCI) (*) * 4
Mountain (WOE) (*) * 4
Mountain (LTR) (*) * 2
Primal Might (*) * 1
Rapacious Dragon (*) * 1
Return to Nature (*) * 1
Rugged Highlands (*) * 1
Runehorn Hellkite (*) * 1
Sakura-Tribe Elder (*) * 1
Sarkhan, the Dragonspeaker (*) * 1
Savage Ventmaw (*) * 1
Scourge of Valkas (*) * 1
Shamanic Revelation (*) * 1
Shivan Devastator (*) * 1
Shivan Oasis (*) * 1
Sol Ring (*) * 1
Spit Flame (*) * 1
Steel Hellkite (*) * 1
Sweltering Suns (*) * 1
Swiftfoot Boots (*) * 1
Talisman of Impulse (*) * 1
Temple of Abandon (*) * 1
Thunderbreak Regent (*) * 1
Thundermaw Hellkite (*) * 1
Timber Gorge (*) * 1
Tyrant's Familiar (*) * 1
Unleash Fury (*) * 1
Vandalblast (*) * 1
Verix Bladewing (*) * 1
Wooded Ridgeline (*) * 1
#CMD:Atarka, World Render (*) * 1

View File

@@ -1,4 +1,4 @@
#NAME:Jihad
#NAME:Armored Ascent
#DESC:They may look weak
#DESC:and barely present,
#DESC:but if you let them grow

View File

@@ -1,55 +1,96 @@
#NAME:Kobold Overlord
#DESC:"You may think we are weak
#DESC: But we are many
#DESC: And sometimes we can hire
#DESC: A powerful mercenary!"
# Cards considered, but not included:
# Orcish Oriflamme - would match the deck's focus of
# strengthening the creatures, but is too expensive. Perhaps add
# it when mana acceleration is possible for this deck.
# Cards removed from he deck:
# 3 x Bravado (USG) (ID 5848)
# The card's name and illustration don't really fit the "kobold"
# theme, but the effect (strength through numbers) definitely
# does.
# Removed because the AI casts it on its opponent's creatures.
# 4 x Brightstone Ritual (ONS) (ID 39846)
# for mana acceleration
# Removed because the AI doesn't use the mana.
# Also ... only works with goblins. Duh. *blush*
# Land(s)
Kher Keep (TSP) * 2 # produces kobold tokens
Mountain (ONS) * 20
# Creature(s)
Battle Squadron (MMQ) * 2
Crimson Kobolds (ME3) * 4
Crookshank Kobolds (ME1) * 4
Keldon Warlord (5ED) * 2
# Doesn't fit the theme too well (would a Keldon Warlord really
# work as a mercenary for a Kobold Overlord?), but without it
# the deck would be too weak, and a deck full of weak
# creatures is exactly the environment where a Keldon Warlord
# thrives.
Kobold Drill Sergeant (ME3) * 4
Kobold Overlord (ME3) * 4
Kobold Taskmaster (ME3) * 4
Kobolds of Kher Keep (ME3) * 4
# Artifact(s)
Howling Mine (7ED) * 4
Slate of Ancestry (ONS) * 2
#To draw more cards (check whether the AI overuses it and
#decks itself out)
# Sorcery(s)
Mob Justice (*) * 3
Wheel of Fortune (VMA) * 1
#To get a new hand (hopefully) full of cheap kobolds once the
#previous hand has been used up. Only 1 because it's
#restricted.
#NAME:Ragavan Commander
#DESC:Ragavan's pirates steal both
#DESC:treasure and your spells!
#DESC:Can you defeat him?
#DESC:
#DESC:Win Wagic duels to unlock
#DESC:more Commander opponents
#DESC:
#DESC:The Ragavan Commander Deck
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
Abrade (PLIST) *1
Academy Manufactor *1
Access Tunnel (STX) *1
Aggravated Assault (ONS) *1
Ancient Copper Dragon *1
Ancient Tomb (ZNE) *1
Arcane Signet *1
Blood Moon (2XM) *1
Bloodstained Mire (ONS) *1
Break Through the Line (FRF) *1
Breeches, Brazen Plunderer *1
Captain Lannery Storm *1
Cathedral of War (M13) *1
Chromatic Lantern *1
City of Brass (ME4) *1
Coercive Recruiter (CMR) *1
Combat Celebrant (AKR) *1
Commander's Plate (CMR) *1
Cursed Mirror (C21) *1
Dire Fleet Daredevil (AFC) *1
Dockside Extortionist (C19) *1
Dwarven Mine *1
Embercleave (ELD) *1
Fellwar Stone *1
Fury of the Horde (CSP) *1
Goblin Engineer (MH1) *1
Goblin Tunneler *1
Godo, Bandit Warlord (CHK) *1
Goldspan Dragon (KHM) *1
Grenzo, Havoc Raiser (PZ2) *1
Hellkite Tyrant (GTC) *1
Helm of the Host (DOM) *1
Imperial Recruiter (ME2) *1
Inventors' Fair (KLD) *1
Lightning Bolt (ME1) *1
Lightning Greaves (MB1) *1
Magda, Brazen Outlaw (KHM) *1
Mana Confluence *1
Mishra's Bauble (MB1) *1
Mogg Salvage (NMS) *1
Moraug, Fury of Akoum (ZNR) *1
Mountain (UNH) *4
Mountain (WOE) *4
Mountain (LCI) *4
Mountain (MKM) *4
Mountain (BLB) *4
Mox Amber (DOM) *1
Mox Diamond (FVR) *1
Mox Opal (2XM) *1
Neheb, the Eternal (AKR) *1
Passionate Archaeologist *1
Pirate's Pillage (RIX) *1
Port Razer (CMR) *1
Price of Glory (ODY) *1
Reckless Fireweaver *1
Seize the Day (ODY) *1
Seize the Spoils (KHM) *1
Shatter *1
Shinka, the Bloodsoaked Keep (CHK) *1
Sol Ring (C19) *1
Spire of Industry (AER) *1
Stolen Strategy *1
Strike It Rich (MH2) *1
Strip Mine (EXP) *1
Sword of Feast and Famine (MPS) *1
Sword of Fire and Ice (2XM) *1
Sword of Hearth and Home (MH2) *1
Sword of Light and Shadow (2XM) *1
Sword of the Animist (AFC) *1
Thran Dynamo *1
Tome of Legends (ELD) *1
Trash for Treasure (C16) *1
Treasure Nabber (PZ2) *1
Treasure Vault (AFR) *1
Underworld Breach (THB) *1
Urza's Saga (MH2) *1
Valakut Awakening (ZNR) *1
Valakut, the Molten Pinnacle (ZEN) *1
Vandalblast (AFC) *1
War's Toll (BBD) *1
Wayfarer's Bauble (C17) *1
Wheel of Fortune (VMA) *1
World at War (ROE) *1
Xorn (AFR) *1
#CMD:Ragavan, Nimble Pilferer (MH2) *1

View File

@@ -1,49 +1,92 @@
#NAME:Ashenmoor Cohort
#
#DESC: How does it feel
#DESC: to be dead
#DESC: I hear you ask?
#DESC:
#DESC: It hurts.
#DESC: It burns.
#DESC:
#DESC: It makes you ...
#DESC: ... want to come back.
Ashenmoor Cohort (SHM) *2 # lots of Cinder creatures
Ashenmoor Gouger (SHM) *3
Corrosive Mentor (SHM) *3
Crowd of Cinders (SHM) *4
Smoldering Butcher (EVE) *4
Emberstrike Duo (SHM) *3 # gets pumped by red or black spells
Nyxathid (CFX) *2
Sickle Ripper (SHM) *3
Spiteflame Witch (SHM) *2
Soul Snuffers (EVE) *2 # dangerous for the AI
Scar (SHM) *4 # cheap red/black damage spell
Haunted Crossroads (MRQ) *2 # compensates for Soul Snuffers
Raise Dead (RV) *2 # compensates for Soul Snuffers
Swamp (10E) *24
# Cards considered, but not included:
# Cinderbones: Expensive and weak in this deck
# Sootstoke Kindler - AI can't choose target well
# Fulminator Mage - most lands of player will be basic for a while
# Midnight Covenant - buggy in 0.8.1
# Cards removed from the deck:
# none
# Notes:
# The Soul Snuffers may have to be removed since the AI often
# hurts itself with them.
#
# This is a pure black deck, it doesn't explore most of the
# potential red/black synergies. I'd like to do that as well, but
# I'd want the Ashenmoor Liege as a central card in that deck, and
# that card isn't implemented yet. Hence, the deck is black and
# the central creature is a black creature.
#NAME:Tatyova Commander
#DESC:The Tatyova Commander Deck
#DESC:Refined for Wagic by Bob
#HINT:castpriority(commander,*)
#HINT:combo hold(Finale of Devastation|myhand)^cast(Finale of Devastation|myhand) targeting(Worldspine Wurm|mylibrary)~totalmananeeded({11}{G}{G})
#HINT:combo hold(Genesis Wave|myhand)^cast(Genesis Wave|myhand)~totalmananeeded({5}{G}{G}{G})
Arcane Signet (AFC) *1
Avenger of Zendikar (PRM) *1
Azusa, Lost but Seeking *1
Birds of Paradise (PRM) *1
Broken Bond (MB1) *1
Castle Vantress (ELD) *1
Command Beacon (PZ1) *1
Command Tower (C19) *1
Consecrated Sphinx (MBS) *1
Courser of Kruphix (TSR) *1
Crop Rotation (2XM) *1
Crucible of Worlds (PRM) *1
Cultivate (PZ1) *1
Cyclonic Rift (MM3) *1
Decanter of Endless Water *1
Dryad Arbor (TSR) *1
Echoing Truth (C19) *1
Eternal Witness (PZ1) *1
Exploration (PRM) *1
Explore (C19) *1
Finale of Devastation (WAR) *1
Flooded Grove (EXP) *1
Flooded Strand (EXP) *1
Force of Will (EMA) *1
Forest (2XM) *4
Forest (BLB) *4
Forest (OTJ) *3
Gaea's Cradle (USG) *1
Genesis Wave (IMA) *1
Harmonize (PRM) *1
Harrow (MB1) *1
Hinterland Harbor *1
Island (UNH) *4
Island (OTJ) *4
Island (BLB) *1
Khalni Garden (PZ1) *1
Kinnan, Bonder Prodigy (IKO) *1
Kodama's Reach (C17) *1
Koma, Cosmos Serpent (KHM) *1
Lightning Greaves (AFC) *1
Lotus Cobra (PRM) *1
Mana Reflection (SHM) *1
Misty Rainforest (ZNE) *1
Multani, Yavimaya's Avatar *1
Mystic Sanctuary (ELD) *1
Narset, Parter of Veils (WAR) *1
Nexus of Fate (M19) *1
Nyxbloom Ancient (THB) *1
Oran-Rief Hydra *1
Polluted Delta (ONS) *1
Pongify (TSR) *1
Primeval Titan (TSR) *1
Prismatic Vista (H1R) *1
Prophet of Kruphix (PRM) *1
Rampaging Baloths (C19) *1
Rampant Growth (PRM) *1
Ramunap Excavator (PRM) *1
Reliquary Tower (C19) *1
Rimewood Falls (KHM) *1
Ruin Crab *1
Sakura-Tribe Elder (MB1) *1
Scalding Tarn (MH2) *1
Search for Tomorrow (MB1) *1
Seedborn Muse (C19) *1
Simic Growth Chamber (C19) *1
Simic Signet (C15) *1
Sol Ring (C19) *1
Solemn Simulacrum (MB1) *1
Sporemound *1
Strip Mine (EXP) *1
Summer Bloom (POR) *1
Sylvan Scrying (MB1) *1
Tangled Islet *1
Thran Dynamo *1
Thrasios, Triton Hero (PZ2) *1
Timetwister (PRM) *1
Tropical Island (ME4) *1
Tyrite Sanctum (KHM) *1
Upheaval (MH2) *1
Verdant Catacombs (MH2) *1
Wayfarer's Bauble (C17) *1
Wild Growth (AFC) *1
Worldspine Wurm *1
Yavimaya Elder (UDS) *1
Zendikar's Roil *1
#CMD:Tatyova, Benthic Druid (DOM) *1

View File

@@ -1,22 +1,95 @@
#NAME:Wild Cats
#DESC:Ferocious predators
#DESC:descend from the mountains,
#DESC:lured down
#DESC:by the sweet smell
#DESC:of your fighters' cold sweat.
Sabretooth Tiger (ICE) * 4 #
Raging Cougar (POR) * 4 #
Canyon Wildcat (TMP) * 4 #
Giant Strength (TMP) * 4 #
Guma (USG) * 4 #
Reflexes (USG) * 2 #
Wild Jhovall (MRQ) * 4 #
Scarred Puma (INV) * 4 #
Maniacal Rage (INV) * 4 #
Brute Force (PLC) * 2 #
Mountain (10E) * 4 #
Mountain (10E) * 4 #
Mountain (10E) * 4 #
Mountain (10E) * 4 #
Mountain (M10) * 4 #
Mountain (M10) * 4 #
#NAME:Brimaz Commander
#DESC:Brimaz draws power from his
#DESC:cat army. Can you defeat him?
#DESC:
#DESC:Win Wagic duels to unlock
#DESC:more Commander opponents
#DESC:
#DESC:Original deck idea by Rowdy1705
#DESC:(mtggoldfish.com)
#DESC:Built for Wagic by Bob
#HINT:castpriority(commander,*)
Ajani's Influence (*) * 1
Ajani's Mantra (*) * 1
Ajani's Sunstriker (*) * 1
Ajani's Welcome (*) * 1
Alms Collector (*) * 1
Animal Sanctuary (*) * 1
Arcane Signet (*) * 1
Authority of the Consuls (*) * 1
Basri's Acolyte (*) * 1
Blade of the Sixth Pride (TSR) (*) * 1
Blessing of the Nephilim (*) * 1
Disenchant (BRO) (*) * 1
Drifting Meadow (*) * 1
Enlightened Ascetic (*) * 1
Felidar Cub (*) * 1
Garrison Cat (*) * 1
Gift of Estates (*) * 1
Graceful Cat (*) * 1
Guardian Lions (*) * 1
Healer of the Pride (*) * 1
Heirloom Blade (*) * 1
Idyllic Grange (*) * 1
Intangible Virtue (*) * 1
Ironpaw Aspirant (*) * 1
Jedit's Dragoons (TSP) (*) * 1
Jhovall Queen (*) * 1
Kabira Crossroads (*) * 1
Kemba, Kha Enduring (*) * 1
Kemba, Kha Regent (*) * 1
King of the Pride (*) * 1
Land Tax (CMM) (*) * 1
Leonin Abunas (*) * 1
Leonin Battlemage (*) * 1
Leonin Iconoclast (*) * 1
Leonin Lightbringer (*) * 1
Leonin Scimitar (MRD) (*) * 1
Leonin Skyhunter (MRD) (*) * 1
Leonin Snarecaster (*) * 1
Leonin Vanguard (*) * 1
Lightning Greaves (MRD) (*) * 1
Loxodon Warhammer (MRD) (*) * 1
Maned Serval (*) * 1
Mask of Memory (*) * 1
Mass Calcify (M15) (*) * 1
Mesa Lynx (*) * 1
Minas Tirith (*) * 1
New Benalia (*) * 1
Oblivion Ring (*) * 1
Oreskos Sun Guide (*) * 1
Path of Ancestry (*) * 1
Path to Exile (*) * 1
Plains (ONE) (*) * 4
Plains (MOM) (*) * 4
Plains (WOE) (*) * 4
Plains (LCI) (*) * 4
Plains (MKM) (*) * 4
Plains (OTJ) (*) * 3
Pride Guardian (*) * 1
Ravnica at War (*) * 1
Regal Caracal (*) * 1
Reliquary Tower (*) * 1
Sacred Cat (*) * 1
Sanctuary Cat (DKA) (*) * 1
Savannah Lions (*) * 1
Savannah Sage (*) * 1
Secluded Steppe (*) * 1
Short Sword (*) * 1
Sigarda's Aid (*) * 1
Skullclamp (*) * 1
Skyhunter Cub (MRD) (*) * 1
Skyhunter Patrol (MRD) (*) * 1
Skyhunter Prowler (*) * 1
Skyhunter Skirmisher (10E) (*) * 1
Sol Ring (*) * 1
Steelshaper's Gift (*) * 1
Steppe Lynx (*) * 1
Swiftfoot Boots (*) * 1
Sword of Vengeance (*) * 1
Sword of the Animist (*) * 1
Swords to Plowshares (*) * 1
Trained Caracal (*) * 1
White Sun's Zenith (*) * 1
Zarichi Tiger (*) * 1
#CMD:Brimaz, King of Oreskos (*) * 1

View File

@@ -1,15 +1,83 @@
#NAME:Shocking Minotaurs
#DESC:The bright flash
#DESC: of the opening attacks
#DESC:is followed by the deafening thunder
#DESC: of a multitude of hooves
Hurloon Minotaur (RV) * 4 #
Anaba Spirit Crafter (HML) * 4 #
Talruum Minotaur (MIR) * 4 #
Minotaur Warrior (POR) * 4 #
Raging Minotaur (POR) * 4 #
Mountain (10E) *24 #
Anaba Bodyguard (10E) * 4 #
Burst Lightning (ZEN) * 4 #
Canyon Minotaur (M10) * 4 #
Lightning Bolt (M10) * 4 #
#NAME:Ranar Commander
#DESC:Kaldheim Commander Deck
#DESC:Phantom Premonition
#HINT:castpriority(commander,*)
#HINT:dontattackwith(Ranar the Ever-Watchful)
#HINT:dontblockwith(Ranar the Ever-Watchful)
Angel of Finality (*) * 1
Angel of Serenity (*) * 1
Arcane Artisan (*) * 1
Arcane Signet (*) * 1
Azorius Chancery (*) * 1
Azorius Guildgate (*) * 1
Azorius Signet (*) * 1
Banishing Light (*) * 1
Behold the Multiverse (*) * 1
Brago, King Eternal (*) * 1
Burnished Hart (*) * 1
Cleansing Nova (*) * 1
Cloudblazer (*) * 1
Cloudgoat Ranger (*) * 1
Command Tower (*) * 1
Commander's Sphere (*) * 1
Cosmic Intervention (*) * 1
Cryptic Caves (*) * 1
Curse of the Swine (*) * 1
Day of the Dragons (*) * 1
Eerie Interlude (*) * 1
Empyrean Eagle (*) * 1
Ethereal Valkyrie (*) * 1
Evangel of Heliod (*) * 1
Flickerwisp (*) * 1
Gates of Istfell (*) * 1
Geist-Honored Monk (*) * 1
Ghostly Flicker (*) * 1
Ghostly Prison (*) * 1
Glacial Floodplain (*) * 1
Goldnight Commander (*) * 1
Hero of Bretagard (*) * 1
Inspired Sphinx (*) * 1
Iron Verdict (*) * 1
Island (*) * 12
Kor Cartographer (*) * 1
Marble Diamond (*) * 1
Marshal's Anthem (*) * 1
Meandering River (*) * 1
Meteor Golem (*) * 1
Migratory Route (*) * 1
Mind Stone (*) * 1
Mist Raven (*) * 1
Mistmeadow Witch (*) * 1
Momentary Blink (*) * 1
Mulldrifter (*) * 1
Myriad Landscape (*) * 1
Niko Defies Destiny (*) * 1
Opal Palace (*) * 1
Plains (*) * 13
Ravenform (*) * 1
Replicating Ring (*) * 1
Restoration Angel (*) * 1
Return to Dust (*) * 1
Sage of the Beyond (*) * 1
Saw It Coming (*) * 1
Sea Gate Oracle (*) * 1
Sejiri Refuge (*) * 1
Sky Diamond (*) * 1
Sol Ring (*) * 1
Soulherder (*) * 1
Spectral Deluge (*) * 1
Stoic Farmer (*) * 1
Storm Herd (*) * 1
Sun Titan (*) * 1
Surtland Elementalist (*) * 1
Swiftfoot Boots (*) * 1
Synthetic Destiny (*) * 1
Tales of the Ancestors (*) * 1
Thunderclap Wyvern (*) * 1
Tranquil Cove (*) * 1
Vega, the Watcher (*) * 1
Wall of Omens (*) * 1
Warhorn Blast (*) * 1
Whirler Rogue (*) * 1
Windfall (*) * 1
#CMD:Ranar the Ever-Watchful (*) * 1

View File

@@ -1,26 +1,83 @@
#NAME:Goblin Spike
#DESC:"Huh? Waddarya yellin, mage?
#DESC: Can't understand ya
#DESC: with all that spell firing
#DESC: going on!
#DESC: Wait, lemme read your lips.
#DESC: 'Get ... get ... aw... awhat?"
#DESC:
#DESC: (last words of a goblin warrior,
#DESC: moments before being incinerated)
Goblin Balloon Brigade (RV) * 3 #
Goblin Soothsayer (MIR) * 4 #
Mob Justice (STH) * 4 #
Goblin Sledder (ONS) * 4 #
Goblin Pyromancer (ONS) * 1 #
Lava Spike (CHK) * 3 #
Goblin King (10E) * 1 #
Mountain (10E) *19 #
Shock (10E) * 3 #
Fists of the Anvil (10E) * 4 #
Mogg Fanatic (10E) * 3 #
Rockslide Elemental (ALA) * 1 #
Raging Goblin (M10) * 4 #
Lightning Bolt (M10) * 4 #
Blaze (10E) * 2 #
#NAME:Vrondiss Commander
#DESC:Forgotten Realms Commander Deck
#DESC:Draconic Rage
#HINT:castpriority(commander,*)
#HINT:alwaysattackwith(creature[Dragon Spirit])
Bogardan Hellkite (*) *1
Demanding Dragon (*) *1
Dragonmaster Outcast (*) *1
Hoard-Smelter Dragon (*) *1
Opportunistic Dragon (*) *1
Scourge of Valkas (*) *1
Shivan Hellkite (*) *1
Skyline Despot (*) *1
Skyship Stalker (*) *1
Taurean Mauler (*) *1
Terror of Mount Velus (*) *1
Thunderbreak Regent (*) *1
Chameleon Colossus (*) *1
Atarka, World Render (*) *1
Earth-Cult Elemental (*) *1
Anger (*) *1
Dragonlord's Servant (*) *1
Savage Ventmaw (*) *1
Dragonspeaker Shaman (*) *1
Chain Reaction (*) *1
Rishkar's Expertise (*) *1
Shamanic Revelation (*) *1
Rile (*) *1
Cultivate (*) *1
Explore (*) *1
Rampant Growth (*) *1
Magmaquake (*) *1
Spit Flame (*) *1
Decree of Savagery (*) *1
Kindred Summons (*) *1
Return of the Wildspeaker (*) *1
Beast Within (*) *1
Return to Nature (*) *1
Dragon's Hoard (*) *1
Arcane Signet (*) *1
Commander's Sphere (*) *1
Gruul Signet (*) *1
Heirloom Blade (*) *1
Sol Ring (*) *1
Gratuitous Violence (*) *1
Outpost Siege (*) *1
Warstorm Surge (*) *1
Barbarian Class (*) *1
Colossal Majesty (*) *1
Garruk's Uprising (*) *1
Cinder Glade (*) *1
Crucible of the Spirit Dragon (*) *1
Exotic Orchard (*) *1
Game Trail (*) *1
Haven of the Spirit Dragon (*) *1
Mossfire Valley (*) *1
Mosswort Bridge (*) *1
Command Tower (*) *1
Desert (*) *1
Gruul Turf (*) *1
Path of Ancestry (*) *1
Mountain (*) *12
Forest (*) *15
Klauth, Unrivaled Ancient (*) *1
Berserker's Frenzy (*) *1
Chaos Dragon (*) *1
Maddening Hex (*) *1
Vengeful Ancestor (*) *1
Bag of Tricks (*) *1
Druid of Purification (*) *1
Indomitable Might (*) *1
Neverwinter Hydra (*) *1
Wild Endeavor (*) *1
Dragonborn Champion (*) *1
Klauth's Will (*) *1
Wulfgar of Icewind Dale (*) *1
Component Pouch (*) *1
Sword of Hours (*) *1
Underdark Rift (*) *1
#CMD:Vrondiss, Rage of Ancients (*) *1
#DNG:Tomb of Annihilation (*) *1
#DNG:Lost Mine of Phandelver (*) *1
#DNG:Dungeon of the Mad Mage (*) *1

View File

@@ -10,7 +10,7 @@ def createResZipFile(filename):
rename = False
if not os.path.isfile('settings/options.txt'):
os.rename('settings/options.orig.txt', 'settings/options.txt')
remame = True
rename = True
if not os.path.isfile('player/options.txt'):
os.rename('player/options.orig.txt', 'player/options.txt')
rename = True

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