There exists bool CardInstance::hasSubtype(const string& _subtype) and the
const char* version converts _subtype into string deeper in the call
hierarchy anyway. So both methods did the same.
- removed CardEffect.cpp reference from Android.mk build file.
- added sdk.buildtools=18.1.1 line to default.properties and project.properties
- updated .gitignore
and make the linker put every data element and function into its own section.
On linktime, we can output every discarded section and get a list of dead
code (for that build).
FRAND and Clamp were not used and Clamp collided when doing unit builds.
SQUARE(x) is longer than x*x and if x is an expression it gets evaluated
twice.
Deck description and statistics were being drawn as black text, this made it invisible as it was rendered over a black background. I made it change the color to white before drawing, so its shown as its suposed to be.(Did the default text color change?)
Fix some valgrind memcheck warnings. However there remains one...
... within the threaded texture cache. Once it is resized, some textures
in GetQuad(...) (WCachedResource.cpp:102/103) have uninitialized widths/heights.
... within the threaded texture cache. Once it is resized, some textures
in GetQuad(...) (WCachedResource.cpp:102/103) have uninitialized widths/heights.
Defines do not follow scope rules, but enums do. Enum classes
even utilize strong type checking (but i am not sure about compiler
support for c++11 on all target platforms).
Issue
attach then equip: plating will give bonus to both creatures
Fix
Changed "attach" to "retarget target(creature|mybattlefield)"
as this doesnot admit this bug
Attach should become deprecated in future
- saves source card in storedSourceCard for ATransform
- adds support for WParsedInt in pay as "pay[[{value:WParsedInt}]]":
name=Spell Rupture
target=*|stack
auto=if cantargetcard(*|opponentstack) then transforms((,newability[pay[[{value:power:highest:creature:opponentbattlefield}]] name(pay {value} mana) donothing?fizzle])) forever
text=Counter target spell unless its controller pays {X}, where X is the greatest power among creatures you control.
mana={1}{U}
type=Instant
- adds support for {x} in *some* “pay” abilities (Syncopate):
name=Syncopate
target=*|stack
auto=transforms((,newability[pay[[{x}]] name(pay {value} mana) donothing?fizzleto(exile)])) forever
text=Counter target spell unless its controller pays {X}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.
mana={X}{U}
type=Instant
- support of "name(pay {value} mana)" in pay abilities to show actual number to pay (see example above)
Here is a small example inspired from SDLmain.c:
g_launcher = new JGameLauncher();
InitGame();
MTGCollection()->loadFolder("sets/primitives/");
MTGCollection()->loadFolder("sets/", "_cards.dat");
options.reloadProfile();
TestSuite testSuite("test/_tests.txt");
int result = testSuite.run();
DestroyGame();
delete g_launcher;
return result;
Get rid of common code
Better naming of zone (where we put spell after countering)
More generic syntax: fizzleto(X) where X in [hand, exile, librarytop]
which will give more flexibility later
Edge of autumn
Mirrorworks
Clone of the card now have the same image as original
Issue with cloning and trigger "nontoken * enters"
Blitzkrig rules
Hermit druid rules
Wildfire
Fixed:
Stitch in Time -- missing flipend at end
Raging Ravine -- can't have trigger inside second transofrm
Prey Upon -- can be cast only on opponents creature
Mesmeric Fiend -- target(player) --> target(opponent)
Caribou Range -- ability should be on ench
This appeared in several places (usually unsupported and mtg):
Churning Eddy
Izzet Staticaster
Kjeldoran Pride
Storage Matrix
Torch Song
This had multiline values under "text=" or "auto=":
Debt to the Deathless
Smelt-Ward Gatekeepers
Sunspire Gatekeepers
Teysa, Envoy of Ghosts
Ubul Sar Gatekeepers
added
"whenever a creature enters the battlefield you may pay {1}, if you do gain one life"
conditional may pay({cost}) effect
this version is a super type ability, and can only be used in certain combos.
to nest you will need to use it in its subtype pay[[{cost}]] effect
pay keyword can have sideeffects coded as follows
pay[[{1}]] life:1?life:-1
pay one mana and gain 1 life, if you dont then you lose one life. notice no space between the abilities and the question mark.
added castcard()
a method to cast a targeted card, this contains the following subkeywords which can be used in combinations
(normal)
(restricted)
(copied)
(noevent)
castcard(restricted copied noevent) for example will cast a card that is a copy or the spell without sending a cast event only when the spell is castable.
"normal" subkeyword cast the actual spell, not a copy.
extended the use of exiledeath to everyzone, any card going from any zone to graveyard is placed in exile if it has exiledeath.
limited swipe left to open hand only when hand is closed view.
"moveto(" can now be named.
i choose to use other cost instead of creating a brand new cost type.
otherrestriction determines if the card is the miracle for the turn.
[card]
name=Devastation Tide
auto=all(*[-land]) moveto(ownerhand)
other={1}{u} name(Miracle)
otherrestriction=miracle
text=Return all nonland permanents to their owners' hands. -- Miracle {1}{U} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.)
mana={3}{U}{U}
type=Sorcery
[/card]
example:
[card]
name=AEther Burst
target=<plusonetype:AEther Burst:graveyard>creature|battlefield
auto=moveto(ownerhand)
text=Return up to X target creatures to their owners' hands, where X is one plus the number of cards named AEther Burst in all graveyards as you cast AEther Burst.
mana={1}{U}
type=Instant
[/card]
[card]
name=Vitalizing Cascade
auto=life:Xplusthree
text=You gain X plus 3 life.
mana={X}{G}{W}
type=Instant
[/card]
what this means is that if a player so choose, they can list the sets 3 letter code in the en.txt as follows
BOK=betrayers of kamikawa
it will now list the names either as the 3 letter code if thier is no entry, or as whatever you call it in the lang->en.txt file.
example usage:
auto=life:thriceX
auto=@damaged(player):life:twicethatmuch
auto=life:twicetype:creature:mybattlefield
so to code cards like Debt to the Deathless
[card]
name=Debt to the Deathless
auto=@lifeloss(opponent):life:thatmuch controller
auto=life:-twiceX opponent
text=Each opponent loses two times X life. You gain life equal to the life lost this way.
mana={X}{W}{W}{B}{B}
type=Sorcery
[/card]
#HINT:good(icy prison)
ai will act as though the effects of this card are now good, choosing to cast it on it's own creatures.
#HINT:bad(ancestral recall)
ai will now use this card targeting the opponent.
good in cases where you are trying to mill the opponent
the effects in wagic have gotten so complex that ai simply has no idea what some cards should target. this helps in most of the cases.
adjusted normal difficulty to include 2 lands, 2 spells under 3 mana.
adjusted hard difficulty to always include 2 lands, the rest are randomly drawn. this prevents ai from being mana screwed on opening hand.
first, i added a timer to hide the big card after 5 secs or until a movement is registered.
2nd, removed the advancing of phases with flick up.
3rd added a flick left to "show/hide hand"
4th, fixed an error in the logic of "getDifficulty" part of the reason optimizedhand was not working.
finally, unrefactored the checks of optimized hand, it was FAR to difficult to see what was actually happening the way it was coded.
optimizedhand is finally working again,
toggledifficulty and optimizedhand will again trigger and greatly improve ai vs player matches
Jilt
Jugan, the Rising Star
Laquatus's Creativity
Mogg Infestation
Prahv, Spires of Order
Quest for the Holy Relic
Razing Snidd
Fix:
Gerrard Capashen - first ability is targeted
Spiraling Embers - removed "(" and ")" and revised
Sword of War and Peace - revised
Venser's Journal - revised
Vicious Shadows - ability is targeted
opponentpoolsave(
mypoolsave(
ex:Upwelling
added a tag for mana, doesntempty
add{g}{g}{g} doesntempty
what this does is make THAT mana remain in the pool until end of turn.
ex:
Sakura-Tribe Springcaller
Decimate should only be castable if there are 4 legal targets for it.
If treated like it is in the current way of coding, the card is more then overpowered and thus shouldn't even be moved to crappy.txt!
added
cantbeblockerof(this)<--this = the card who owns the ability.
cantbeblockerof(targetchooser) <--the target cant block anything targetable by this targetchooser.
spin engine and similar will use cantbeblockerof(this).
others were done with a workaround, which i hope will be updated soon.
Azorius Ploy
Barter in Blood
Consuming Ferocity
Corpse Harvester
Corrupted Resolve
Cruel Ultimatum
Cyclopean Tomb
Borderline:
Consume Strength
Fixes:
Contagion Engine - can select targets once but add counters twice
Emblems missing forever tag
Moved Drain Life - we can now limit black using {X:black}
the other threads were running test suite at 0 which was causing race condition fails in test suite, i incremented by 1 until the normally passing test no longer failed, test effected were proliferate and mortician beetle both passing test in normal mode, failing in hyperspeed. test suite takes only 30 secs more to run but we can't sacrifice actual results for speed.
the commented out section is not even taken into account after first test is run.
ownerscontrol
opponentscontrol
ownerscontrol returns 1 if the owner has the card in thier battlefield. 0 otherwise. vice versa.
this should make it easier to add cards which should be treated differently depending on who controls them.
Reap
Rebel Informer
Repopulate
Rix Maadi Guildmage
Rocket Launcher
Roots of Life
Rotting Giant
Rune of Protection: Artifacts
Rune of Protection: Black
Rune of Protection: Blue
Rune of Protection: Green
Rune of Protection: Lands
Rune of Protection: Red
Rune of Protection: White
Sadistic Augermage
borderline:
Rakdos Augermage
Moved Maralen of the Mornsong to borderline since the effect is not draw replacement but players cant draw anything (there isn't any stated "would draw"), maybe we can have CANTDRAW ability in the future.
I dont know why my previous commit has been removed but its all working. I included tests for the cards in this commit. All test suite passes. please update your FUT/_cards.dat because i change the name of oriss to its original name.
--------------------------------------
[card]
primitive=Oriss, Samite Guardian
id=136210
rarity=R
[/card]
"donothing"
this is to avoid using powerandtoughness 0/0 ability to mean "do nothing"
old code
[card]
name=Inquisition
target=player
auto=target(*|targetedpersonshand) 0/0
auto=foreach(*[white]|targetedpersonshand) damage:1 targetedplayer
text=Target player reveals his or her hand. Inquisition deals damage to that player equal to the number of white cards in his or her hand.
mana={2}{B}
type=Sorcery
[/card]
new code
[card]
name=Inquisition
target=player
auto=target(*|targetedpersonshand) donothing
auto=foreach(*[white]|targetedpersonshand) damage:1 targetedplayer
text=Target player reveals his or her hand. Inquisition deals damage to that player equal to the number of white cards in his or her hand.
mana={2}{B}
type=Sorcery
[/card]
just for future notice this card should be moved to crappy.
whenever an ability has
blah blah:effect
that means, {cost}:effect
if you can not do it with supported cost in engine, do not add it as
{0}:effect && effect
this is a workaround we stopped using a very very long time ago.
the ability of losing life is not treated the same as "paying" life. same as any other cost.
the issue arose several times while i have added support, and due to a workaround, my support would be flawed, at first i would try to munipulate what i coded to allow for the workarounds to continue working.
that was the past, i long since stopped doing that, if a card is a workaround, and it breaks, i remove it completely.
------------
Lore Broker
Lorthos, the Tidemaker
Luminarch Ascension
Lurking Evil
Magus of the Jar
Makeshift Mannequin
Malfegor
Manaforge Cinder
Memory Jar
fixed:
------------
Geist of Saint Traft token, it says @combat ends exile the token.
auto=choice damage:1 target(creature) restriction{type(creature[blue])~morethan~1}
this choice menu will only appear is there is more than one blue creature inplay
------------
Laquatus's Champion
Lich's Tomb
Liege of the Tangle
Living Death
Living End,
Locust Miser
Lodestone Bauble
Fixes: Flakenrath Aristocrat, Sublime Archangel
the progress is removed on this though, so you might not notice it until next release when you do a fresh install.
any new decks for both player or ai will show the mana symbols after a match is completed.
this should also allow for the ai difficulty tools to work correctly again. mana symbols displayed again, mini info, and everything related to the stats.
In details:
- I removed my player swap idea, it caused tons of issues with randoms
- instead I simply keep both peer on the exact same game and added one single parameter allowing to configure the view on the game. So, each peer is rendering the same game (gameObserver class) from a different player point of view (DuelLayers and related classes).
- a lot of gui stuff are missing to prevent user forbidden interactions but it works fine on Windows
Fixes in GameObserver serialization/deserialization code
Fixes in JNetwork and JSocket on windows
Various code cleanup (currentGamePhase access in particular)
Updated GUI code to re-enable a basic network GUI
Activated threaded tests on Windows. It uses 4 threads by default.
added 19 other cards from unsupported
-------------------------------------
Deus of Calamity
Diaochan, Artful Beauty
Dralnu's Pet
Dreams of the Dead
Due Respect
Ebon Praetor
Ego Erasure
Elemental Mastery
Erhnam Djinn
Essence Vortex
Exhume
False Cure
False Memories
Fanning the Flames
Feast of Worms
Festival of the Guildpact
Fight to the Death
Figure of Destiny
Final Punishment
added 16 dredge & cards with "draw" replacement
-----------------------------------------------
Dakmor Salvage
Darkblast
Golgari Brownscale
Golgari Grave-Troll
Golgari Thug
Grave-Shell Scarab
Greater Mossdog
Life from the Loam
Moldervine Cloak
Necroplasm
Nightmare Void
Obstinate Familiar
Plagiarize
Shambling Shell
Stinkweed Imp
Thought Reflection
auto=replacedraw choice damage:2
auto=replacedraw choice draw:2 noreplace
notice noreplace exempts the draw from sending a draw event. draw events and drawn events are seperate events.
added dredge and it's rules.
[card]
name=Dakmor Salvage
auto=tap
auto={t}:add{b}
dredge=dredge(2)
text=Dakmor Salvage enters the battlefield tapped. -- {T}: Add {B} to your mana pool. -- Dredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.)
type=Land
[/card]
Added variable "controllerturn", "opponentturn" -> returns integer value if its your turn then 1 if not then 0.
ex. use
restriction=during my turn
otherrestriction=during opponent turn
auto=this(variable{controllerturn}) lord(creature|mybattlefield) 8/0
auto=this(variable{opponentturn}) lord(creature|mybattlefield) 0/8
Added entwine cards and other cards as of SVN r4587.
Entwine Cards
----------------------
Incite War
Journey of Discovery
Promise of Power
Roar of the Kha
Rude Awakening
Savage Beating
Solar Tide
Stir the Pride
Temporal Cascade
Tooth and Nail
Wail of the Nim
Cards from Unsupported
----------------------
Circle of Protection: Shadow
Circle of Solace
Cloudstone Curio
Coalition Relic
Commando Raid
Copy Artifact
Cornered Market
Crack the Earth
Crag Saurian
Crescendo of War
Crypt Champion
Curfew
Dance of the Dead
I don't have an exact amount of cards supported in the latest SVN because there are a lot of cards in my local copy to be tested before commiting.
OT: I think overload card can be done if the target card and store it for use until the spell resolves. ex:
[card]
name=Blustersquall
other={3}{U} name(Overload)
auto=if paid(alternative) then tap all(creature)
auto=ifnot paid(alternative) then tap all(mytarget)
text=Tap target creature you don't control. -- Overload {3}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.")
mana={U}{target(creature|opponentbattlefield)}
type=Instant
[/card]
paid(blah)
auto=if paid(alternative) then damage:3 target(creature)
auto=if paid(alternative) then life:10 target(player)
auto=ifnot paid(alternative) then damage:3 controller
auto=ifnot paid(alternative) then life:4 opponent
it can be used any place a restriction can be used.
rearranged the constants for the payment type keywords to match the order we int the alternatePayment array on a card, added keywords for the remaining payment types,
"notpaid",
"paidmana",
the 2 above pretain to paying the real manacost of a card
it checks the mana={1} cost line and is not joined to the other types.
"kicker",
"alternative",
"buyback",
"flashback",
"retrace",
"facedown",
"suspended"
note: all test pass in this revision.
corrected steelclad_serpent2 test missing choice 0 and p2.
ai proliferate test was not failing for me. it was sucessful on each run.
note 100% pass on this rev.
Card Fixes:
--------------
Ajani Goldmane - moved token id to dat file
Army of the Damned - change token id to source token id
Black Vise - can choose opponent
Chromium - upcost sacrifice
Elephant Resurgence - change token id to source token id
Melancholy - upcost sacrifice
Midnight Ritual - change token id to source token id
Polar Kraken - fix upcost
Rackling - soft coded
Skeletonize - must target beforehand and fix token color & id
Storm World - fix. can't use foreach..<4 because X is 4 minus the cards
Tatsumasa, the Dragon's Fang - revised workaround
Terastodon - change token id to source token id
Tetravus - change token id to source token id
The Rack - soft coded
Thirst - upcost sacrifice
Tombstone Stairwell - revised ability, removed tombspawn primitive
Varchild's War-Riders - fix cumulative upcost
Venser, the Sojourner - fix loyalty counters
Vexing Sphinx - upcost sacrifice
Vraska the Unseen - moved token id
Wall of Shards - fix cumulative upcost
Waylay - generic token coded
Wheel of Torture - fix. can't use foreach..<3 because X is 3 minus the cards
updated necessary dat files for the token ids.
-------------------------
Crosis, the Purger
Dromar, the Banisher
Numot, the Devastator
Rith, the Awakener
Treva, the Renewer
Vorosh, the Hunter
Fixed 2 Legendary Dragons
-------------------------
Oros, the Avenger
Teneb, the Harvester
If we have like UEOP ( until end of phase| until end of step ) keyword this will be perfect, but for now I use oneshot. :)
Cleaned Manacost.cpp
My observation so far when paying X in activated abilities, when X doesn't work, I press escape to get in the main menu and play another game(test again), then X activated ability will work. I really don't know where to start/look for the cause of it.
this can also be used for "equipped creature has unattach and blah" cards using
auto=teach(creature) {unattach}:blah
also corrected a long standing guiupdating issue. a long long time ago a replace was removed from GuiPlay::Update in hopes to increase performance no amount of performance increase is worth having cards not updating thier position after an event recieve happens. this means curse will finally go to the correctly choosen players battlefield, equipment will no longer just linger after its target dies, auras won't stay on battlefield after a card is exiled. ect. no preformance decrease noticed, if anyone else notices one let me know.
restriction{{ }} incases where we will have squiqqly brackets in a tc.
this corrects the bug where helix pennicle restricted trigger was not triggering.
this should allow players to code cards with the detain ability of rtr correctly, as well as a handful of similar cards in the unsupported text.
detain is coded
auto={1}{t}:target(creature|opponentBattlefield) transforms((Detained,newability[cantattack],newability[cantblock],newability[noactivatedability])) uynt
enjoy
format is as follows
HINT#combo hold(blah|myhand)^until(blah|mygraveyard)^until(blah|opponentshand)^restriction{type(creature|mybattlefield)~morethan~2}^cast(blah) targeting(blah|mygraveyard)^totalmananneeded({g}{g}{r}{u}{2})
the ai can be told to hold more then one card, until as many condiations as you want are met, until( is a TC and can basically be used in a fasion of saying "hold arbor elf until you have a lord of atlantas in play and a gaint growth in you hand"
once the condiations are met you can later tell it to cast(gaint growth) targeting(arbor elf[fresh]|mybattlefield)...
I also included the whole of the games restrictions system...
so you can get really really creative with this so far.
the next thing I will do is ability targeting and card favoring.
although I tested this fix, it will require extremely indepth testing which I can not do alone to ensure that doing this does not screw up something else.
I think however that we are safe, becuase we test the same condition under test destroy and gameobserver update without any negitive recourse.
it requires an update to your mtg rules txt...
the coding is as follows
[card]
name=Arbor Elf
mana={g}
auto=soulbond 1/3
auto=soulbond {t}:add{g}
abilities=soulbond
type=Creature
subtype=Elf Druid
power=1
toughness=1
[/card]
auto=soulbond *any ability supported by wagic*
abilities=soulbond
the above arbor elf gives itself and its soulbond creature a 1/3 bonus and the ability to tap for green mana.
* updated build tools to have core files zip naming scheme be based on version information contained in build.number.properties
* added new python library to allow reading java property files, remember to add the library to your PYTHONPATH before executing the python script otherwise the script will fail.
`
adjusted the calculation of x for enstack attackers to avoid drawing cards on top of the phase wheel out outside of the red box. adjusted the red box length for uniformity.
the previous calculation only drew cards to the middle of the screen and after about 15 attackers it pushed cards out of the red box, over on top of the phase wheel making it impossible to click or touch requiring alternative methods to advance to damage phase or reduction of the amount of attackers.
the new calculation draws attackers at the start of the red box keeping the enstack a cardwidth and a half from the edge of the screen on both sides instead instacking massive amounts of attackers tighter inside the red box, much how we handle battlefield enstack...attacking with more then 40 creatures no longer pushes attackers off screen.
I remember adding that patchwork fix a long time ago, not sure if whatever it fixed was even really an issue or just a overprotective line i added. either way if it was an issue, addType is what should re-add the name, not transformer ability.
They now target a player. This means they cannot be casted anymore on a player who cannot be targeted, like for the case he controls a card like True Believer.
{x:black}
{x:color}
creating a snapshot of a card instance in garbage for stored cards, the issue with previous version was it was using base model value instead of what the storedcard was actually at the time it was in battlefield. example, animal boneyard test was coming up 1 toughness short becuase the creature storedcard pointed to was sent to graveyard for the sacrifice.
changed myStored TargetChooser to use storedSourceCard instead, as this is supposed to point to the actual card and not a snapshot.
this is a method to set the order in which ai decides to play cards, you can for example tell ai to look for 2 instants, before trying to find a creature.
be sure to list all main types of the deck otherwise ai will pass on stuff
this is the current
const char* types[] = {"planeswalker","creature", "enchantment", "artifact", "sorcery", "instant"};
so be sure you include them if the decks need them.
other the above example would be coded
HINT:castpriority(instant,instant,creature,planeswalker,enchantment,artifact,sorcery)
as you can see this deck will now look for and play if possible, 2 instants before any of the other types.
this will really help with decks which rely on cards like dark ritual to produce mana to cast creature, simply by listing instant before creature. if the deck had dark rituals, in the above example, and it had them in hand, it would then cast dark ritual, dark ritual, then one of the remaining types. this is actually tested not just assumed.
Call for Blood
Carrion
Corpse Lunge
Final Strike
Fling
Forge Armor
Ichor Explosion
Momentous Fall
Rite of Consumption
Surge of Strength
Worthy Cause
- Added Stunted Growth
- Fixed Specter's Shroud
AI is able now to make simple decisions like "Chosen Discard", "Chosen Sacrifice" and so on. This leads to a massive card package which contains many powerful and much beloved cards like the Eldrazi creatures:
[card]
name=Kozilek, Butcher of Truth
autostack=draw:4 controller
autograveyard=moveTo(ownerlibrary) && shuffle
auto=@combat(attacking) source(this):name(Annihilate) ability$!name(sacrifice 4 permanents) notatarget(<4>*|mybattlefield) sacrifice!$ opponent
text=When you cast Kozilek, Butcher of Truth, draw four cards. -- Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.) -- When Kozilek is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library.
mana={10}
type=Legendary Creature
subtype=Eldrazi
power=12
toughness=12
[/card]
Tests will follow.
Card list in the first comment. Have fun!
reasons behind this are as follows:
1:separation of the battlefields is already incredibly clear by the huge gap between the center...
2:a line drawn on battlefield that represents the seperation is something that should be handled outside of the engine, in the actual battlefield graphic.
3:on hires screens this line stands out like a sore thumb.
4:the line is draw on top level above the cards making it stand out even worse when you have a battle going. as well as cutting over the top of the cards in displayed hand view.
over all the battlefield looks cleaner.
- Fixed the animation for the menu fonts when selecting an item in the menu. mTargetScale and mScale in SimpleButton are here for a reason, people!
-- Note: I'm not sure I actually like the "zoom on currently selected item" thing, not sure it brings much.
-- we should definitely consider a hi resolution font because now it really doesn't look good, when it is scaled that much
Why is the subtypes menu using a different font from all other simpleMenus ?
- Removed one "stats" button as well as the "menu" button. The goal is to let the screen "breathe" and show cards as much as possible.
-- Removing the "menu" button is also in line with all other screens of the game, where that button never appears.
- With the same goal, the "XXX of XXX cards" text is now displayed only when scrolling
- removed ACTION_LOGGING_TESTING code
- Fixed AIvsAI games multithreaded games
- Activated undo when testsuite is enable
- Defined an initial player comparison operator
- Fixed multi-threaded modification to subtypes
- Fixed gameTurn cleanup for gameObserver reuse
adjusted the way cardsacrificed events were sent
added a ability which is a way to tell a targeted player, yourself, or opponent to do a set of abilities.
ability$! EFFECT _ EFFECT !$ WHO
the idea here is that the abilities are being added to the targeted players game...so
target(player) ability$!target(<2>*|myhand) reject!$ targetedplayer
this line tells the player to discard 2 cards...
you can also use it without targeting by using WHO words..
controller, owner, targetcontroller, opponent, targetedplayer
this ability defualts to opponent.
cards coming soon...
if it saids "target a player, do blah to all the blah in that players ZONE" then you *have* to target it.
there is still some odd cases where i could not update thier code, either becuase i missed them of the support is not fully there to use targeting in thier cases.
Curse of Oblivion moved back to unsupported.
added support for targeting a zone by targeting a player...
any time you have targeted a player, you can access items in thier zones by using
targetedpersonsZONE
targetedpersonsbattlefield for example...
added "targetedplayer" as a targetchooser and who.
added "mycurses" targetchooser.
added "targetedcurses" word variable.
I never have been so excited about a card commit than this.
WE GOT PLANESWALKERS! And they couldn't work any better!
This card package contains a gigantic amount of the most powerful cards of Magic (Time Walk, Mana Crypt, Vendilion Clique, Mystical Tutor, Meditate, etc.)
Card list below.
Tests will follow.
taught ai when not to play a planeswalker, told ai to look for planeswalkers as a card type to play.
fixed a crash related to tokens and cardgui..tokens dont have models....
made a 1 line change to deckveiwer that makes it usable on touch devices and improves the overall look and feel of deckveiwer....
counter{}
so you can get a count of a certain counter on a card
the next consist of parts using the same targetchooser method as type:
power:
toughness:
convertedcost:
followed by ---
highest:
lowest:
followed by targetchooser
blah:mybattlefield
so if i want highest converted cost of creatures i control..
convertedcost:highest:creature:mybattlefield
also added an internal ability to reuse and display flying text with a string passed to it.
Added a place marker to allow volume change during app. Right now it's either loud or off. There isn't a way to allow the volume to gradually go up and odwn based on the values set in settings.
added deck names to screen when bringing up the menu during a match. The deck names appear below the AI avatar and above the player avatar.
fixed a mem leak in ZipArchive.mm
minor correction to handling download delegate removal
changed constant literals to use constant labels. Not sure why this was changed in the first place as it didn't need to be.
modified pc and android impls to ensure new calls are made. These still have the same effective outcome (kill and start) until the equivalent is coded on these platforms to pause and resume the music.
fixed bug with iOS sound effects not playing. Forgot to assign the key to the associated music sample
- Removed pointless #ifdef IOS ... it was perfectly OK before the IOS code. Basically if you don't understand the code AND if you cannot test it, you should not modify it =(
- Readded a gard against short horizontal swipe. There were removed cause there are some gards in the iOS frontend ...
- Note that all this code use non-normalized coordinates, so something should be done in this sense in the frontends...
This should partially resolve the issue with it appearing as "Sance" ingame. Not sure if it's possible to display accented characters in the English version
moverandom(creature[green]) from(mygraveyard) to(opponentbattlefield)
example card
[card]
name=Tariel, Reckoner of Souls
auto={t}:moverandom(creature) from(opponentgraveyard) to(mybattlefield)
mana={4}{W}{B}{R}
abilities=Flying,vigilance
type=Legendary Creature
subtype=Angel
power=4
toughness=7
text=Flying, vigilance {T}: Choose a creature card at random from target opponent's graveyard. Put that card onto the battlefield under your control.
[/card]
moved init() from ManaCost to a private call
changed ManaPool method init() to Empty() to better represent what it does.
renamed ManaCost::reinit to resetCosts() as reinit sounds like your are returning the ManaCost object back to initial state which is not what happens. Only the cost related members are reset, the bool isMulti is left alone
corrected an issue by removing a constant, if you want it defined as a constant do so, however make sure when you build for psp the variable is actually still defined in the scope.
- Added 50 cards based on rev4237-rev4242 (card list below).
- Related on this addition, I changed the card.dat
information of Flipping and Transforming Cards in the
card.dat so that the flipped sides of a card are not
shown in the shop or in the trophy room.
- Updated the card text of Contested Cliffs. It now uses the word "fight".
- Fixed issue787
Tests will follow.
which tells the ai not to use the targetible cards as attackers, this can be card names, and CD modes.
modified the way ai handles multikicker. it will not be casting 1/1 joragas anymore :D
made WParsedInt ignore "+" signs....
added a new affinity ability...autohand=affinity(creature[vampire]|mygraveyard) ....
this is essentially affinity for creatures in your grave.
added supkeyword to clone clone addtype(zombie)....it adds the type listed to the cards types on clone...
reparse PT bonus on resolve.
reworked bushido, it should now work correctly...aside from that it now excepts word variables...fumiko is now bushido(type:creature[attacking]:battlefield/type:creature[attacking]:battlefield)
added a keyword to access acontrolsteal..the keyword is "steal"
auto=ueot steal target(creature)
reworked persist to handle undying..added the new counter handling rules intruduced by wotc in ISD
added a vector cardsAbilities to mtgcardinstance...this keeps the abilities added to the game for a card to use stored where we can easly alter or remove them.
added an automatic increase to geteff return if the ability is a putinplay ability.
finished coding support for flip and double sided cards, though viewing the "other side" is still not possible yet.
the ability follows the mtg rules.
the ability syntax is flip(card name)...a card can flip into any other card by name...even flip into itself.
added a "canPay() call for Ninja cost...to prevent it from coming up in a menu unless you're in blockers....
added 3 new restriction types that work very similar to type(
thisturn(tc)~morethan~2
lastturn(tc)~lessthan~thisturn(tc)
compare(wordvarible)~equalto~compare(wordvarible)
these are pretty self explanitory.
moved "&&" ability parsing below "this(" allowing "this(" to grant abilities now which contain &&...enclave egologist bug is fixed by this.
fixed an issue with combatspirit link for some reason the way i was doing the bool was not always working.
took care of the todo for AProtectionFrom...you can now give a protection from(blah) in a instant or ueot ability.
added altho very limited right now a "targetedplayer" tc word. i hope to increase this with time.
as always my sidekick doc already has some cards coded for this and test will follow the addition of the cards.
- Added a call to input reset after each update in the Qt frontends to avoid strange auto-keypress
- Removed tutorial display in AI vs AI (test AI mode)
- Commit Qt project with latest buttons files
- Added a small isHuman method to the Player class
fixed a compiler warning in SimplePopup in the constructor declaration
===DECK Editor changes ===
Added two touch buttons , one for "Sell Card", the other to switch between Deck and Collection.
changed swipe Left/Right to rotate card collection; removing the previous action which was to swap between deck/collection viewing
Note: GameStateDeckViewer isn't a JGuiController so can't leverage off the mButtons vector. Thus, the buttons have to be handled by this class separately. (setButtonState, userPressedButton)
refined detailed info window for stats display
removed PSP button for Touch interfaces (currently only iOS and Android) on deck selection screens
to not break the core engine and reduce some more complex code, I created a new vector in the JController object. mButtons. This vector will contain all the valid buttons for a given screen. The appropriate Add/Remove methods have been updated to account for this new vector.
- Coded a resource package download GUI based on QWidget
- Removed compilation warning on unused variable
- Updated Maemo desktop file to start directly the binary
- Updated .pro file
- Updated version macros to be able to compose the resource package file
- Updated QML interface for Android
- Updated QML interface to not contain the name of the resource package
- Updated the file downloader class to be able to get the resource package hash from the google code server
- Updated the file downloaded class to verify the resource package hash from the remote server at each startup to be able to perform automatic update
- Defined several JGE operation as static to clean up the wagic wrapper
Fixed issue719.
Fixed issue760.
Fixed issue779.
Moved Harmonic Sliver due to a bug report back to unsupported.txt. For now, the problems occuring when playing with Harmonic Sliver are not fixable.
I was wrong, the recursion was not due to weird call order of WGuiList and WGuiMenu at all. It was due to two different problems:
1) there is some code in WGuiMenu to handle keys previously held. I guess it's to be able to go through the options very quickly on PSP.
2) Each PSP generated keys stays held if the corresponding code for release is not called...
=> Each time we generate some PSP keys press from gesture in the core or in a frontend, we absolutely need to generate the release code corresponding or the core might think that some keys are still held ... That's precisely what was not done by the code handling swipe in filters =).
Basically options are fixed on all the platforms (you can create and
select a profile for example). Regarding the filters, it works perfectly
with QML on desktop. For SDL on Android and QML on Meego, it causes
either annoying blinking letting you do what you want or some kind of
blinking deadlock. I think there is some recursion happening in the GUI
items and to be sorted.
* adjusted the touch sensitivity of the iOS port for deck menu selection. Decks were being selected even though the selection was touched. It was highlighted but as soon as you let go it would instantly select (OK button) select the selected deck. This isn't a problem on Android as the SDL already handles this as far as I can tell. I limited this to only iOS so I don't accidentally mess up the other ports.
Usage: createResourcezip.py [--platform=[ios,android]]
Currently only iOS is the only other platform supported. android, maemo, meego, etc will need to be added if core files are different from standard core files
Jailbroken devices have full access to the filesystem and don't have this restriction. although I do recommend that they do drop zip files into the Documents directory to reduce the risk of causing any undefined behavior with updating the config files while the game runs.
TODO: Please have somebody test on non-Touch device. I don't have one anymore. If it breaks it let me know and I'll make it a compile time option. Seems to work with 2 and 3 blockers. I couldn't get the game to get 4 blockers on the screen, but I think it should work the same. This should be cross platform and not iOS specific
[card]
name=Phyrexian Soulgorger
auto=cumulativeupcost[{S(creature|myBattlefield)}] sacrifice
text=Cumulative upkeep - Sacrifice a creature. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)
mana={3}
type=Snow Artifact Creature
subtype=Construct
power=8
toughness=8
[/card]
was only charging you 1 sacrifice per upkeep.
added thisTargetComparison, this(cantargetcard(targetchooser))...its a thisdescriptor that compares if the card can be targeted by a target chooser...
- fixed some issues in zstream that prevented to use "getline" in zipped streams
- added a "pooled buffers" system to keep a cache of file descriptors. This is potentially dangerous though, but shaves several seconds of loading time on the PSP. If problems arise on other platforms I'll make it a compilation parameter
- gracefully fail when calling manacost information on a not properly initialized mana cost
first somehow accidentally line 3616 mtgability.cpp removefromgame was adding an observer instead of removing it, this explains "abilities sometimes acting strangely or not being removed"...I'm surprised it didn't create memleaks or extremely visible side-effects...
2nd fixed a bug where triggered abilities would share a menu with activated abilities of a card when ever you had enough mana floating to pay an activated ability before the trigger resolved.
adjust the way ai calculates if it should use cards like wrath of god, though it is still open to using it at a random chance, i noticed that the method we use might not be the best.
an ability with an eff of 1 for example actually has a 10% chance of being choosen....
lets say rng rolls 3402
when you % this it simply takes the 2 last numbers making this roll 2...meaning that unless we assign no "random chance to do blah" the actual chance of ai using a stupid ability is 10%...I'm leaving that logic how it is tho I "unfactored"(?) it to make it easier to track the numbers, also added a debug trace to help see how often we hit "lottery chance" ...
fixed a minor crash from multiability trying to fetch menutext when no abilities existed in the vector anymore.
this patch introduces a new subkeyword for "may " which is syntax pay(manacost)
auto=may pay({w}) untap
this is to allow the card group that was coded using the activated ability loophole i described at the start. it works the same way as it did with the loophole only it is actually something we want to happen instead of a flaw in the engine...you float the mana same as before and when the may line is triggered it will check if payment can be made with exist mana if so then it displays the menutext for the ability, if that ability is choosen it then charges you the mana directly before activation.
this patch also include flip( ability, tho not intended originally for this version, I had previously had it finished and was polishing it right before I noticed the bugs above. since this keyword is not intended to add cards for this version, I wont go into massive details about it at this time.
- Coded a small resource downloader in QML from the Qt frontend. It's completly useless for the moment and it's poorly integrated
- Various tweaking in the Qt project file for Symbian and Android
The old X11 version can still be built with make x11.
If this breaks some use cases, please tell me - it's hard to
predict. My minimal testing seems to indicate it works, and
make does the heavy lifting for us.
Updated the unsupported.txt file to reflect the 2 card afari added some days ago
Added some undergraded cards (crappy as not chosen discard)
Augur of Skulls
Bog Down
Brain Weevil
Cao Cao, Lord of Wei
Compulsive Research
Consult the Necrosages
Cunning Advisor
Elder Mastery
Esper Charm
Funeral Charm
Mournwhelk
Piracy Charm
Tendrils of Despair
Three Tragedies
Unburden
Unnerve
Voices from the Void
Waking Nightmare
Wit's End
- attempt at reducing loading times on the PSP: I merged a few graphics files together, removed some unused calls from the initialization functions, and moved some other ones to have a more lazy approach. The PSP version remains fairly slow in some parts (especially loading, but also entering the shop, or starting a new game), so I will try to reduce file access as much as possible in the days to come. Not a release blocker IMO though, but I4d sure love if it were faster.
- uppercased "Track1.mp3" to be in line with the actual filename. Most likely this had been broken forever on case-sensitive OSes
- I removed costly calls from the textscroller. I believe it wasn't very useful in its previous state. Now it's only "advertising" for unlockable stuff, which I think is ok (and allows to refresh it every time the menu is loaded)
- As a counterpart, added a "% complete" progress bar in the menu, something I wanted to add a while ago.
required libs:
* ZipArchive - Obj-C impl of zip
* asi-http-request : http request help to assist with asynchoronous downloading of files
* minizip : support for ZipArchive
*
Added default splash screen for iOS app. (using the Wagic background to keep it neutral to module)
TODO: refine handling for iPad splash screen
* add selection screen and input screen for location of downloadable content. (ie core files, image files, etc )
* add support to opt out of backing up to iCloud for core files. Right now iOS will automatically backup all files under Documents folder to iCloud. Consider only allowing player data to be backed up to iCloud. All graphics and other assets are considered volatile.
After months of research, card coding and testing, i proudly present you this high-end card package.
It contains 163 new cards! I never thought to find such a massive amount of codable cards on the current card-availability level Wagic has reached now.
Some cards look like they were coded in a much too complicated way, but believe me: There is no other way to make them work.
Talking about the card code, I have to thank Zethfox alot for coding the 'transforms((,newability...))" complex, which was very very useful. THANK YOU!
Added several tests to safe the code of the cards for future changes.
I think this is the last time i will be able to add such a huge number of new cards outside of the upcoming of a new set, we have reached the outer limits of what is doable with the current code. Let's hope there will be some new some time in the future, though i have my doubts there will be anything new in that section of Wagic for a long time.
Below, you will find the card list. Some really exciting cards are hitting the Wagic scene!
I need a break...
- Modified the testsuite and gameobserver to be able to replay all the testcases based on the actions logged during the first pass. This allows to test the action logging and replay used during undo. It's only activated in multithreaded mode and it does not work on Momir tests.
- Modified choice logging and replay to use menuId instead of ability index, as, for some obscur reasons related to Lord, those ability indexes may change.
- Fixed bug in nextphase logging wrongly generating click actions
- Added a "stack" zone to the click ability logging to be able to replay properly interrupt
- Fixed a wonderful bug mixing card names with zone names in the actions execution engine
- Added a "combatok" action logging/execution
- Added a "clone" virtual method to MTGCardInstance and Token to be able to clone correctly the right object type. Used that in MTGGameZones::removeCard
- Modified DuelLayers to not use a global MTGPhaseGame instance anymore
- Moved the reset of currentActionCard out of the ActionLayer render function : that fixes the remaing problematic tests in the multithreaded testsuite
- Added a method in ActionLayer converting a card ability into a menu index
- Used this new method in the game observer to log correctly AI ability actions
- Added a DumpAssert method in the game observer, it can be used to dump the game and assert in order to easy crash reproduction
- Cleaned up TargetList properties access
- Added an optimisation in GuiMana to not compute update code if the rendering is not used (multi-threaded mode)
- Added a deadlock detection in the test AI vs AI multithreaded mode
- Fixed minor bugs in test AI vs AI multithreaded mode
- Added a games/second counter in the test AI vs AI rendering
Their code was just fine and 100% accurate in concerns with the official rules.
The tests 'cycling2' and 'resounding_roar' occured because of a missing 'choice 0'. Now, the test suite passes.
- Added an "ACTION_LOGGING_TESTING" mode in the gameObserver. When this is defined, the game reloads itself in every update. I want to use that to track undo problems. Be aware that it kills performances and crashes with the testsuite if you want to activate it.
- Various cleanup/refactor of the game observer.
- Added a gameObserver == operator to compare two games
- Added player mode to the player serialization
- Added a multi-threaded mode to AI_CHANGE_TESTING. For the moment it's only useable with Qt. If you want to use it without, just defined a thread_count higher than 1.
- Refactored random generator class to use list intead of queue
- Defined a specific type for interrupt decision instead of int
-- There's still lots of things to figure out: scalability of the server (can we host the files someplace else? Can we have several servers in case one of them fails?), versioning, possibility to download several mods, etc... but this is the basic functionality and should be enough for the first version.
-- The Java file should probably be split...it's close to 1000 lines now :/
this cost type sends both the event for discard and the event for cycled trigger, it no longer automatically draws a card, that is part of this cost ability instead.
standard cycling is autohand={cycle}:draw:1 controller
its trigger is
auto=@cycled(*|myhand):damage:2 target(creature)
"whenever you cycle a card deal 2 damage to a target creature."
fixed a crash from random deck game modes where it was trying to check against a selected deck...but there is no selected deck in random.
(side effect of this is that i can not bypass this, the stat still need to be run through without causing choas so i set it to deckname "" and id 0...we *might* need to find a different id...though it didn't seem to effect deck 0 as the name does not match)
- Reworked the testsuite to be able to work multithreaded. This is deactivated by default everywhere except in QT_CONFIG as one testcase still refuses to pass in multithreaded mode. On my 4 cores linux desktop, the 650 tests passes now in 4 seconds (1 fails).
- Replaced usage of CardSelectorSingleton by a card selector per game observer.
- Modified the resource manager to be optionnal and per game observer instance instead of being a singleton. Two reasons here : threading AND Open Gl access. I only updated the crashing parts called from the game observer, so most of the code is still using the single instance. Beware of copy-paste concerning resources ...
- Cleaned up the game observer constructors
- Fixed several problems in action logging code while testing proliferate decks
- Cleaned up Threading implementation based on QThread
- Decorelated the testsuite AI timer from the game timer to be able to have reproduceable results with AI tests.
- Created a random generator wrapper class
- Used two seperate instances of this random generator for AI and for the game
- Added methods to load randoms into AI from a testcase
- Fixed a probleme with undo and premade decks introduced in r4035
- Added basic test to test AI proliferate code
- Cleaned up goblin_artillery test
- Added AI tests into the testsuite test list
- Fixed looping bug into the multi target AI code
- Modified undo to stop at "next phase" action
- Added "muligan" and "force library shuffling" to the list of logged action
- Fixed random logging
- Fixed double logging of actions
- Merged all the "next game" functions into a single one
- Created a PlayerType type instead of using int
- Moved the player loading code into the GameObserver and out of GameStateDuel to avoid having player references in both and simplify the initialization and termination. Tweeked a bit the humanplayer class to be able to do that.
- Added a "load" menu available in testsuite mode, I use that to load problematique game. To use it, just copy-paste a game from the traces into Res/test/game/timetwister.txt. Game in traces starts by "rvalues:..." and ends by "[end]"
- Added some untested and commented out code in GuiCombat to use the mouse/touch to setup the damage on the blockers
- Broke the network game ... hoh well, I'll repair it when everything else works !!
- various code cleanup and compilation fixes on Linux
First version where I managed to finish a normal game while undoing several actions until the end. There are still some problems in direct damage spells and interruption management. I added several assert in the code to catch them.
* This resolves a compiler warning found in XCode.
NOTE: This method is not even called in the code anywhere. The only reference I can find is in the AladdinsLamp.fire() method, but it's commented out. This method sounds like it should exist, but nothing is using it. Was this not working before for Aladdin's lamp, and commented out to get it to sort of work?
-- I added an AbilityParser.cpp file, mid term goal is to move AbilityFactory there, so that MTGAbility.cpp becomes a bit less big.
-- I tried to add the file reference in Makefiles, but only tested windows compilation so far
- Fixed bugs related to "castRestriction" variables in MTGAbility. these variables were declared in both the parent and children classes, leading to bugs and duplicate code/content
The test suite passes
- Added an undo menu using this code (beware, it's still very very alpha).
- Removed various warning
- Cleaned up avatar loading
- Added full random lists load/save including the deck shuffling (not sure if I could not replace that with seed load/save)
- Moved momir and Co rules configuration out of GameStateDuel
- Create a GameType type to avoid mixing int everywhere
Included in a new modrules.xml tags.
<cardgui>
<background> Stores information concerning the colors </ background>
<renderbig> Stores information to draw the card </ renderbig>
<rendertinycrop> Stores information to draw the card </ rendertinycrop>
</ cardgui>
Change the variables array for vectors
Azorius Herald
Boros Fury-Shield
Dryad's Caress
Ogre Savant
Patagia Viper
Plaxmanta
Ribbons of Night
Rolling Spoil
Seed Spark
Steamcore Weird
Tin Street Hooligan
Vigor Mortis
Replaced all counter(1/1), counter(1/2) and counter(2/2) to counter(1/1,1), counter(1/2,1) and counter(2/2,1).
also corrected an issue with the changed logic of ALife eff return. you have to take into account that "{cost}:life:200" <---is not targeted so there is no player targeting involved with such code, making the eff return always 0 in cases where you don't have {cost}:target(player) life:200...i might need to review the eff returns to check that there are not other cases similar to this, :P my original code there was messy but took that into account. so careful with refactors in this area.
to see how this function was intended to work, try the following lines on any card
auto={t(creature|opponentbattlefield)}:life:233
auto={s(creature|mybattlefield)}:damage:4 target(player)
- Android: changed application package name ( issue 730 ) - also changed the publisherID to avoid confusion with the alpha, which is 3tied3 to org.libsdl.app
this allows users to create a mod without having to struggle with avoiding certain phase based or cost actions.
attackrule and attacker phase can be seperated now by not including auto=attackrule in your rules.txt....this means you can still have an attackers phase, but clicking the cards won't put the cards into attacker mode or add "attacker" to thier menu abilities. ect...
this also allows us to eventaully change/add to these base rules without having to create entirely new rules for them by modifying the base classes with new variables and so on.
IMPORTANT: UPDATE YOUR RULES FOLDER, OR NOTHING WILL WORK FOR YOU.
- Added a "cachesize" option (not available from the menu, but can be manually edited in players/options.txt, for example cachesize=200 means 200MB of cache). The hardcoded cache on windows/linux is 20MB, which is not enough for Hi Res cards (60 is better, 200 is great)
this fixes 2 crashes I found, the first, 2 color random mode would crash on load.
2nd, ai vs ai testing would randomly crash, this should fix that also.
I noticed 2 color random mode is now trying to search for it's rules and sometimes flashes for a brief moment "error cant read file" or something like that....I could not find the source of that, it doesn't cause it to crash however it causes it to take a sec longer to load, this is before this commit btw, so the issue is still there.
it was trying to load the rules, flashed the error then crashes...i fixed the crash but not the rules error.
please review, i might have left in useless stuff...
I also did notice something, the way we are creating players is kind of all over the place. imo this is bad, it made this conversation extra hard becuase you create one player over here, another type over there, the human over in this direction, back track and create another somewhere else...this needs to be taken into account for a refactor, all player creation should happen in the same function, and at the same times...
the reason these 2 crashes existed was becuase players were being created before "gameobserver" in some modes, and in other modes, no player would exist at the time game was creating to set the player. but we then later call the same function when we actually load the player using the method specific to a mode.
this just leads to headaches, I mean no offense, just a general observation i made when converting this players array. unfortunately that kind of refactor is just a little beyond my coding ability.
important note: AiAction you always want to call "owner" becuase "player" here means single target spell has a target and the target is "player". I didn't come up with the variable name, sorry it is very confusing in this spot of the code.
- removed every references to the gameobserver singleton. This object can now be instantiated several times as it's needed for minmax. To be able to do that, I mostly added a reference to a gameobserver from any targetable object (cards, players, spells) and abilities.
This is its new code:
[card]
name=Bloodhall Ooze
auto=@each my upkeep restriction{type(*[black]|myBattlefield)~morethan~0}:may counter(1/1)
auto=@each my upkeep restriction{type(*[green]|myBattlefield)~morethan~0}:may counter(1/1)
text=At the beginning of your upkeep, if you control a black permanent, you may put a +1/+1 counter on Bloodhall Ooze. -- At the beginning of your upkeep, if you control a green permanent, you may put a +1/+1 counter on Bloodhall Ooze.
mana={R}
type=Creature
subtype=Ooze
power=1
toughness=1
[/card]
This new version, using one of Zeth's latest additions ("restriction{...}"), shows to be a nice improvement concerning the ingame experience: NOW, the trigger will only show up in the interruption window if the restriction is matched. In the old version, it always showed up in the restriction window whenever the trigger potentially could trigger, even if the restriction was not matched.
"restriction{}" also gives us more options in coding new cards. This is one of them:
[card]
name=Library of Alexandria
auto={T}:add{1}
auto={T}:draw:1 restriction{type(*|myhand)~equalto~7}
text={T}: Add {1} to your mana pool. -- {T}: Draw a card. Activate this ability only if you have exactly seven cards in hand.
type=Land
[/card]
A famous and powerful classic! And you can for sure only tap it to draw a card if you have 7 cards in it.
Exchanged the Multikicker test for another one. The older one was doing trouble.
2) Updated all {X}-spells with x targets. They are using "prex" instead of "x" now. Their code is now completely
following the official rules.
3) Changed the code of most cards which search your library for a land card and put it onto the battlefield tapped.
They are using "and((tap))" now. More cards will be changed to that in upcoming revisions.
4) Added 2 tests to save "prex".
- removed incorrect casts of MTGCardInstance into Spell objects.
- AI Test system now allows you to put decks in ai/bakaA and ai/bakaB instead of ai/baka. This allows to let AIPlayerBaka and AIPlayerBakaB play with specific decks
- Test suite speed improvement. Improved the card name cache. Test suite now runs in 850 seconds instead of 950 on my machine.
- minor code cleanup
- In order to clarify getEfficiency, started creating "getEfficiency" functions specific to each type of ability (see example with Damager). This won't reduce the file size but should make things bit clearer
- Minor cleanup of getEfficiency
- bug fixes in getEfficiency
- Minor fixes in AI code
- Attempt at preventing the AI from interrupting itself while it's selecting targets. I don't know why this happens, and my fix didn't work. I believe it shouldn't be possible to interrupt when there is an active targetChooser, please let me know if this is an incorrect assumption.
-- This is a copy/paste and shouldn't have any impact on the logic. I just moved some functions from AIPlayer to AIPlayerBaka
- Added back the possibility to select a different Resource folder with file Res.txt
- Fix a crash when a token id does not exist
opponent play an ability, player interupts and clicks a card with TargetChooser which has no valid targets; player then tries to cancel targetchooser, instead the stack is displayed again, player is then locked in a TargetChooser unable to click other cards.
originally i was going to do it in the reactToClick however, after thinking about it, it made no sense to me that a targetchooser would be set and a cardwaitingfortargets would be set if you know ahead of time that no valid targets existed.
now when clicking cards which have TargetChoosers and no valid targets, no tc is set, and no cardiswaitingfortargets; instead return 0.
what this does currently is remove a counter of the type counterstring and when the ability is destroyed it puts the counter back for us.
meant for weapons used as follows.
auto=teach(creature) countertrack(0/0,1,hand)
when the creature is equipped with this weapon it will remove a hand counter from the creature, when you remove the weapon, or the weapon is destroyed or whatever...it will put a hand counter back on the creature.
added dualwielding thisdescriptor...
auto=this(dualwielding) 2/2
auto=this(dualwielding) firststrike
enabled "restriction{" on phasebased triggers @next and @each...
i will work more on countertrack to extend it to domains if it currently isnt possible to use it in this case(haven't tested it on domains)....
puresteel paladin...removed from supported...added to unsupported.
I have no idea why, but this card has cause a surge of completely different bug reports, crashes, strange interactions between cards, you name it...im surprised we didn't receive a report that it caused someone dog to die of heartworms....
anyways if i find some time, i will debug this pandora's box of a code and see why exactly it causes such strange difficult to reproduce bugs.
ok this target chooser is set apart from the others becuase it focuses on relationship between cards instead of other forms of checking, also i made sure to add a method for deeper Targeting.
it is the same as any other target chooser when it comes to writeing the syntax and can be used in almost every way a normal one can.
here is what i mean by deeper targeting
this targetchooser allows you to denote a nested targetchooser.
target(children[targerchooser])
all(parents[targetchooser])
it is plural becuase i do allow maxtargeting to be denoted here. lets say you want to have a domain that lets you do the following
"2 of my target inhabitants get +1/+1 until end of turn"
you can do this...
auto={0}:target(<2>children) +1/+1 ueot
how about even more complex?
auto={0}:target(<2>children[elf[power=1]]) +1/+1
2 of my children that are elves with power equal to 1.
the same goes for parents, you can also lord( with this targetchooser.
if you want to say
"the inhabitants of this domain gain flying"
auto=lord(children) flying
here are some example coding that you can play around with.
[card]
name=Forest
text=G
auto=lord(children[elf]) +3/+3
auto={0}:target(<2>children) +12/+12
type=Basic Land
subtype=Forest
[/card]
[card]
name=Tidal Kraken
abilities=unblockable
target=land|mybattlefield
auto=connect
auto={0}:target(parents) destroy
text=Tidal Kraken is unblockable.
mana={0}
type=Creature
subtype=Kraken
power=6
toughness=6
[/card]
[card]
name=Arbor Elf
target=<upto:3>land|mybattlefield
auto=connect
auto=foreach(parents[forest]) 1/1
mana={0}
type=creature
subtype=elf
power=1
toughness=1
[/card]
*above, arbor elf can target upto 3 domains...for each one you choose to connect him to that is a forest, arbor elf would gain 1/1..
so as you can see it is pretty indepth.
note: all test pass.
target=*|mybattlefield
auto={0}:equip
auto=connect
notice i declare the equip before the connect, this is becuase connect will use the equip ability of the card to handle it.
target= can be used for connecting them now as the first time equip. please remember to use teach( or autoskill= to avoid giving abilities forever to a target...this makes equipments hybrid auras.
also, moved parentchildrule init from original init to rules.txt...
in yourrules.txt
should look like this:
include mtg.txt
name=Classic
[INIT]
mode=mtg
auto=connectrule
[PLAYERS]
auto=shuffle
auto=draw:7
i did this becuase i want to reuse the parentchild associations for mtgabilities...and if parents will always kill thier children, i won't be able to use it :P
changed connect into an instant ability, i don't want this ability to be done by menu choice.
added parentchildrule which currently only handles the removel of children if a parent dies, but will be extended to handle other actions based on event receiving that deal with child and parent association.
add keyword targetable ability "connect"
connect means "the source adds the target to it's parent vector, the target adds the source to it's children vector"
this can be multitargeted, so it is possible that
"Big Bad Dragon" can live it 2 different domains.
not sure if this was even asked for, but i thought it would be cool to be able to say
"to play big bad creature you need to give it 2 homes"
or
"big bad creature can live in upto 4 homes"
this adds a level of stratigy, becuase now big bad creature can have "all creatures which share a domain with big bad creature gain +2/+2"...or "all domains that city planner live in gain 1 capacity"
but also add the possibility of faster removel from a card like
"destroy all creatures on target domain".
i thought it would be a nice add to kai rules.
connect clears a target= on a card after connecting...this is to avoid abilities transfering to the target, unless you want it to effect the target like
"tap target domain as this becomes a inhabatant"
target=domain
auto=tap
auto=connect
auto=<==this line on will not be targeting the domain
refactored some of the initialization code
left place holder for Zoom in/out with pinch recognizer. The idea here is to make a virtual function like OnScroll for Zoom so we can take care of the zoom features natively.
reorganized some of the method declarations.
moved debug framerate message to be 10px higher. current position covers the credit count on the game shop screens.
changed hard coded numeric values for menu ids to Labels. ( this was done only to GameStateAward )
small add with big impact:
added the useage of castrestriction on triggers and activated abilities.
this can be used to create such cards as library of alexandria.
{t}:draw:1 restriction{type(*|myhand)~equalto~7}
and replace instances were we were putting false triggers on the stack from abilities which contained nested aslongas...
meaning cards like epic struggle, won't need to be triggered every turn even if you have no creatures...
for epic struggle here is an example of how to replace it
@each myupkeep restriction{type(creature|mybattlefield)~morethan~19}:wingame controller
any of the current cast and other restrictions can be used. this includes turn:1 <===and various others such as phase based checking.
syntax is
restriction{ whatever casting/other restriction you want }
a nice quality of life fix for false triggers (which don't mean theyre incorrect, just annoying when they trigger when they will do nothing)
another example would be the triggers on cards like
skullcage.
auto=@each opponent upkeep:aslongas(*|opponenthand) damage:2 opponent >4
auto=@each opponent upkeep:aslongas(*|opponenthand) damage:2 opponent <3
becomes
auto=@each opponent upkeep restriction{type(*|opponenthand)~morethan~4}:damage:2 opponent
auto=@each opponent upkeep restriction{type(*|opponenthand)~lessthan~3}:damage:2 opponent
now instead of triggering every opponent upkeep even without a resolve...it will only triggers when the restriction requirement is met.
enjoy :)
note:all test pass.
* Single Tap now implemented
* Touch and Hold (2 secs) to pop up menu
* added a pan gesture to simulate flicking up/down and left/right
* removed dependency on binding keys to game for iOS devices. (perhaps extend this to all touch devices.)
* flicking motion needs to be expanded to allow for smooth scrolling. Right now every flick is equivalent to going one slot up/down/left/right.
-- Most of the added cards are from recent sets and unhinged.
- removed Cinder Seer from Borderline as it seems a more accurate version is in crappy
*** Removed from unsupported.txt because they also exist in other files:
Ancient Ooze was in supported files but also in unsupported ones
Blood Moon was in supported files but also in unsupported ones
Custody Battle was in supported files but also in unsupported ones
Deglamer was in supported files but also in unsupported ones
Flourishing Defenses was in supported files but also in unsupported ones
Fylgja was in supported files but also in unsupported ones
Glowering Rogon was in supported files but also in unsupported ones
Magus of the Unseen was in supported files but also in unsupported ones
Mana Chains was in supported files but also in unsupported ones
Mana Echoes was in supported files but also in unsupported ones
Melira's Keepers was in supported files but also in unsupported ones
Nullmage Advocate was in supported files but also in unsupported ones
Orim's Thunder was in supported files but also in unsupported ones
Overwhelming Instinct was in supported files but also in unsupported ones
Preeminent Captain was in supported files but also in unsupported ones
Protean Hydra was in supported files but also in unsupported ones
Renewing Touch was in supported files but also in unsupported ones
Renounce was in supported files but also in unsupported ones
Riptide Survivor was in supported files but also in unsupported ones
Rise from the Grave was in supported files but also in unsupported ones
Sky Hussar was in supported files but also in unsupported ones
Tatterkite was in supported files but also in unsupported ones
Tidal Warrior was in supported files but also in unsupported ones
Twigwalker was in supported files but also in unsupported ones
Wu Scout was in supported files but also in unsupported ones
Examples:
# COUNTER-MOVING CARDS #
[card]
name=Ghave, Guru of Spores
auto=counter(1/1,5)
auto={1}{C(1/1,-1),creature|mybattlefield}:token(Saproling,Creature Saproling,1/1,green)
auto={1}{S(creature|mybattlefield}:counter(1/1,1) target(creature)
text=Ghave, Guru of Spores enters the battlefield with five +1/+1 counters on it. -- {1}, Remove a +1/+1 counter from a creature you control: Put a 1/1 green Saproling creature token onto the battlefield. -- {1}, Sacrifice a creature: Put a +1/+1 counter on target creature.
mana={2}{B}{G}{W}
type=Legendary Creature
subtype=Fungus Shaman
power=0
toughness=0
[/card]
# IF...THEN #
[card]
name=Goblin Goon
auto=@each my attackers:if type(creature|opponentbattlefield)~morethan~type(creature|mybattlefield) then transforms((,cantattack)) ueot
auto=@each my blockers:if type(creature|opponentbattlefield)~morethan~type(creature|mybattlefield) then transforms((,cantblock)) ueot
text=Goblin Goon can't attack unless you control more creatures than defending player. -- Goblin Goon can't block unless you control more creatures than attacking player.
mana={3}{R}
type=Creature
subtype=Goblin Mutant
power=6
toughness=6
[/card]
[card]
name=Pulse of the Tangle
auto=token(Beast,Creature Beast,3/3,green)
auto=if type(creature|opponentbattlefield)~morethan~type(creature|mybattlefield) then moveto(myhand)
text=Put a 3/3 green Beast creature token onto the battlefield. Then if an opponent controls more creatures than you, return Pulse of the Tangle to its owner's hand.
mana={1}{G}{G}
type=Sorcery
[/card]
# MULTIKICKER #
[card]
name=Joraga Warcaller
auto=kicker counter(1/1,kicked)
kicker=multi{1}{G}
auto=thisforeach(counter{1/1.1}) lord(other elf|myBattlefield) 1/1
text=Multikicker {1}{G} (You may pay an additional {1}{G} any number of times as you cast this spell.) -- Joraga Warcaller enters the battlefield with a +1/+1 counter on it for each time it was kicked. -- Other Elf creatures you control get +1/+1 for each +1/+1 counter on Joraga Warcaller.
mana={G}
type=Creature
subtype=Elf Warrior
power=1
toughness=1
[/card]
# PROLIFERATE #
[card]
name=Contagion Clasp
auto=counter(-1/-1,1) target(creature)
auto={4}{T}:target(proliferation) proliferate
text=When Contagion Clasp enters the battlefield, put a -1/-1 counter on target creature. -- {4}, Tap: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={2}
type=Artifact
[/card]
# MULTI-TARGET #
[card]
name=Argothian Elder
auto={T}:target(<2>land) untap
text={T}: Untap two target lands.
mana={3}{G}
type=Creature
subtype=Elf Druid
power=2
toughness=2
[/card]
[card]
name=Aven Augur
abilities=flying
auto={S}:target(<upto:2>other creature) moveTo(ownerhand) myUpkeepOnly
text=Flying -- Sacrifice Aven Augur: Return up to two target creatures to their owners' hands. Activate this ability only during your upkeep.
mana={3}{U}
type=Creature
subtype=Bird Wizard
power=2
toughness=2
[/card]
[card]
name=Bone Harvest
target=<anyamount>creature|mygraveyard
auto=moveTo(mylibrary)
auto=@next upkeep:draw:1 controller
text=Put any number of target creature cards from your graveyard on top of your library. -- Draw a card at the beginning of the next turn's upkeep.
mana={2}{B}
type=Instant
[/card]
Test suite tests will follow on weekend.
Have fun!
added abilities:
proliferate
ProliferateChooser:new targetchooser for cards with counter and poison counters "proliferation".
MenuAbility:new internal ability to create custom menus of abilities which can be activated in sequence one after another.
multikicker, syntax kicker=multi{b}
works with variable word "kicked", the amount of times it was kicked.
target=<number>tc,target=<upto:>tc,target=<anyamount>tc,target(<number>tc),target(<upto:>tc),target(<anynumber>tc);
multitarget is now supported with the exception of "devided any way you choose" which can not be supported becuase we allow detoggling of targeted cards with a "second" click....so you can not click the same card 2 times to add it to the targets list twice for example.
this is minor, as the bulk of multitarget is not "devided"
removed 's' parsing for multitarget, added a limit of 1000 to "unlimited" for easier handling; we currently can't handle activation of an ability on a 1000 cards very well on any platform(infact i don't suggest it)
Countershroud(counterstring), this MTGAbility allows you to denote that a card can not have counters of the type "counterstring" put on it.
"any" is for no counters allowed at all. this is a replacement effect. cards state that they can still be the targets of counter effects, however on resolve nothing is placed on them instead.
@counteradded(counterstring) from(target):,@counterremoved(counterstring) from(target):: these are triggers for cards which state "whenever you add a counter of "counterstring" to "target"; added counterEvents struct;
other changes:
added support for ai handling of multitargeted spells.
changed a few of delete( into SAFE_DELETE(, safed up a couple areas where they did not seem safe to me;
added better handling of menus presented to ai, it will try to select the best based on eff returns.
added varible lastactioncontroller for ai use, it keeps it truely from ever tripping over itself and brings ai more inline with MTG rules.
converted TC into a protected member.
added "abilitybelongsto" string to tc, and set "owner" of the tc. a tc should never belong to "no one" it should always have a owner.
abilitybelongs to string is solely for easier debugging, i found it was a pain to never know what ability created a tc while i coded multitarget. the owner of the tc is the only one that should be using it, if an ability needs to declare the opponent as the owner (choose discard which is currently unsupported for example) this will allow us to better handle that situation by setting the tc owner in the ability which called it.
rewrote the logic of "checkonly" in ai choose targets, the only time it is "checkonly" is when it is trying to see if it had a target for a spell before it cast it, i now set this in the actual function call instead, the old method was far to error prone.
wrote logic for ai checking of menu objects presented to it,
ai will now make better choices when a menu is presented to it based on what it already knows. this changes it from it's old method of "just click the first option".
taught ai how to use multi-mana producers such as birds and duel lands by adding a method for it to find it's mana for a payment. it can effectively use cards like birds of paradise and sol ring(without locking up). It's primary method of pMana searching was maintain for performance(no need to deep search if we have it in pMana).
added a vector to actionlayer to store mana abilities for pMana. this provides us with a dramatic improvement when mana lords are present by reducing the amount of objects that need checking when ai checks pMana.
with 80 mana objects and a ton of lords one instance i checked went from 8000ish checks down to 80<===big difference.
added "tapped" green coloring(sorry i missed that!)...added red coloring to current actionLayers current action card (usually the source).
changed "type(" restrictions second amount from atoi into wparsedint for more flexiable coding.
add "&" parsing to CD targetchooser, removed "iscolorandcolor" variables and functions becuase they were a hack the real fix was this.
cretaure[dragon&black&blue] a creature that is a dragon, and black and also blue.
changed some of the ai computeactions and
removed unneeded gaurds in ai chooseblockers, they did more harm then good.
-- zipFS has several limitations...
--- in a general way, seekg doesn't work... so getting a file's size needs to be done through JFileSystem.
--- getLine on files open with zipFS doesn't work so great. Not sure if it is a normal issue because files are open in binary or not... JFileSystem therefore offers a "readIntoString" function that needs to be used instead of the usual "getline" technique. However getLine can then be used on a stream connected to the string.
-- tested on Windows and PSP, I also made sure android still works, but haven't tested zip support on Android.
-- I tried to maintain backwards compatibility, but this might break on some platforms, if I broke some platforms and you can't find a way to fix them, please contact me and we'll figure something out
-- This removes wagic::ifstream. I didn't reimplement the securities that were involved in this, apologies for that. Might be useful to reimplement such securities in JFileSystem
-- I haven't tested options/profiles in a deep way, it is possible I broke that.
- rewrote some code dealing with text formatting for a card when rendering in text mode. I could swear my code has been reverted. If somebody has good reason to believe we should re-process the string formatting on every frame, please let me now. I believe my change can help rendering speed of text mode a lot.
- counters change to vector instead of array
this fixes an issue with infect creatures not triggering "bloodthirst" ...all other cases this was working correctly, bloodthirst however checks the damageCount.....
if you are going to use the trigger + ability from trigger effect...make sure you create the trigger before you remove the card from play...otherwise the trigger never gets a chance to see it's source leaving play.
the ability checks against any of the current cast restriction checks and is written in the following syntax
example phaige the untouchable is
auto=ifnot casted(this) then wingame opponent
if|ifnot condiation then ability
this can also be used in && abilities such as this card
pulse of the grid
auto=draw:2 && target(*|myhand) reject && if type(*|opponenthand)~morethan~type(*|myhand) then moveto(myhand) all(this)
this adds a few cards in its current state, though the aim for this ability was removing the use of "kicker" workaround for cards like the divinity creatures.
i plan to extend this to support such effects as "if spentmana({b}{u}) then effect....and other conditional checks currently not possible even with workarounds.
I'm committing these now since im working on abilities for kiaos mod and don't want to have a 20 page changelog.
also added missing text to binding grasp, it was thought that it was bugged becuase it simply "ended" its effect....however this is a confusion since the effect was ending due to upcost not being paid, however the card text did not reflect that it had a upcost....
i seriously think we devs should consider making all ability coding required lowercase. not card names and text, but coding such as targetchoosers "thisForEach(creature[Black;White]|myBattlefield) moveto(myGraveYard) ...<---this is not uniform...and leads to people using such coding in the source ....i think i suggested this once and was instantly shot down...however, this is the 2nd instance where a bug has arose from the comparing of capitalized vs lower case..becuase we all assume that every line is going to be dropped to lower case as the game reads them.....
-- Zeth, please verify that I didn't break your mods if you have time
-- The test suite does NOT pass in this revision (see issue 711), but I verified that the problem does not come from my change, so we need to dig
-- Campaigns creators will have to update their campaigns to make them compatible with Wagic 0.16. It consists in adding "include mtg.txt" at the top of each one of their rules.txt file.
This helps a lot in the deck selection menus (duel and deck editor).
That, added to my previous fix, fixes issue 693 for me.
In general, we should try to avoid 512x512 32bits textures on the PSP. That happens with a 480x272 png image. One solution is to convert the file to a jpeg, and load it in 551 mode whenever possible. Another solution is what I did: use a 450x255 image instead. The best is of course to cumulate both, which divides the size in Ram by 4 on the PSP.
I'm ok with distributing lower res graphics on the psp, and higher res on other platforms, if that helps. Main culprits are 480x272 images (when there's too many of them)
The BIG CARD SAFARI 2011 is over: After 4 months of intensive testing, i can proudly present you this huge card package. All these cards are working 100%.
Card list --> First comment.
- Added 20 tests to save the cards whose code is not covered by already existing tests.
- Added Magic2012 (M12) with 75 completely new cards.
-- Res is the default folder in Res.txt, in case it exists, to avoid confusion when debugging
-- added sign_prx in the makefile, harmless if you have the default build.mak, but signs the app for you if you have the correct files
-- uninitialized variable warning fixed in Rules.cpp
-- The problem was that the previous fix for keybindings actually fixed dead code for the PSP version... the real call to Defaultbindings was still happening in JGE's code...so the fix made the call twice.
-- Note: shouldn't we use ResetBindings instead of JGECreateDefaultBindings? The former resets the bindings before assigning the default ones...
http://code.google.com/p/wagic/issues/detail?id=706
these types were converted into part of the "types" enum and are no longer considered a subtype in the engine.
as they appear before Subtypes::LAST_TYPE they are to return "" as their subtype search result.
i figured there was no harm in including them in the types list filtering as they were moved from subtypes becuase they were some of the most frequently used subtypes.
otherrestriction=type(creature|mybattlefield)~lessthan~type(creature|opponentbattlefield)-3
which means, if the statement above is true you can play the card....if you subtract 3 from the amount the opponent has in creatures, and you are still less then the opponent...then that means he has atleast 4 more creatures than you do.
so right after the type(blah) you can add +number or -number...and it will modify the amount to compare.
so i converted it from string comparisons and counting the battlefield..into targetchoosers with declarable operator.
simplified the code from the mess it was before into something alot easier to card code with.
example before:
mytypemin:less type(land),opponenttypemin:* type(land)
becomes
type(land|mybattlefield)~lessthan~type(land|opponentbattlefield)
the new syntax is:
type(targetchooser)~operator~number
type(targetchooser)~operator~type(targetchooser)
the operator are:
morethan
lessthan
equalto
1) prevent the textureQuad map from containing references to cards when we're returning a temp (card backdrop) image in the threaded version.
2) we had two copies of the pspicon image in the cache (ie the regular & managed). Changed the reference in the DeckMenu code to use the managed instance.
3) Fixed a problem with a default constructor param that would set RESOURCE_LOCKED on certain images. I noticed that the 'NEW' image was locking itself in the cache because no resource modes was being passed in, so the default constructor param was setting it to locked. This seems like a bad idea - if you're not explicitly locking a resource in the call, that shouldn't be the default behaviour.
Also added an assert safeguard to catch the possibility of 'overlocking' an image resource, as this probably means the image fetching routine is being abused somehow.
The problem was, the game would initialize first, reading the
keybindings from the configuration, and THEN set up the default key
bindings.
I think this affects only PSP, X, SDL and Qt. A quick scan of the
windows version code looks to me that the order is correct and the
problem should not exist, but I may be mistaken. The iPhone version
looks to me like it has no keybindings at all, though the call is
there ; I put the call in the right order so that the problem does
not happen in the future if we implement some key bindings for it.
If someone can check for windows...
this is basically one activation for the existence of the trigger, meaning if it is used on a card, and the trigger exist for inplay, it will only activate one time while that card is inplay, it will activate again if the card leaves play and is put back in play again by another effect,
this was originally added for cards such as the hidden enchantment cycle.
-- Tutorial Messages are an ability like any other, except it can only be displayed once. Subsequent calls are ignored, the ability is removed from the game as soon as it is added
-- This allows to add event triggered messages ingame. Messages are either text, or images (I don't have an image sample, but rules/classic.txt has a few examples that might help)
-- only tested on Windows, although I made sure the PSP version compiles. Hopefully I also made the necessary for it to work in the touch version (touching the screen should be enough to close the tuto message)
-- Room for improvement: possibility to choose a title in text mode, possibility to have some messages depending on others (e.g.: don't show message X until message Y has been shown), improve some of the abilities and triggers to give more flexibility, add events outside of game, to allow tuto messages in deck creator, etc...
Faceless Devourer - It should not be able to target itself
Sunscape Familiar - abilities=flying -> defender
diamond valley - Sacrifice only creatures you control
Vow of Lightning - typo in the name
Sporeback Troll - fixed mana cost
Crovax the Cursed - fixed card text
TBD: right now every up finger generates this event. We probably want to throttle it to only be an event if the velocity exceeds some arbitrary threshold; similarly, if we generate a flick event, we probably don't want to simultaneously generate a finger up action (ie JGE_BTN_OK).
ie:
Card Name:
Quick Sliver
Mana Cost:
Converted Mana Cost:2
Types:Creature — Sliver
Card Text:Flash
Any player may cast Sliver cards as though they had flash.
without an over-ride testdestroy removes the observer before it can be any use to us.
i only enabled this for the lords/this'es....
(One could argue that this ID is completely meaningless and could be entirely ripped out, as the IDs obviously never made it to their intended target...)
this update requires you to update your rules folder files!!!
2nd
added 2 new vanguard game modes.
Stone Hewer Basic - when ever a creature enters play, a random equipment with a converted mana cost less than or equal to that creature is put into play and attached to it.
this mode is unlockable, requirement = win a match where 10 or more equipment were in the battlefeild at the moment you won.
Hermit Druid basic- in this game mode, during each of the players upkeeps, a random land card from their deck is placed into the battlefield, these do not count against your 1 land per turn limit.
to unlock this, win any match with less then 10 lands.
- I think I fixed issue 664, it's funny how the problem is visible on Windows and on some HTC devices but totally absent on Linux and some Samsung devices
- The SDL fullscreen is not working that good, it would need to be improved.
first you are not allowed to mulligen the opponents hand.
second persist was using the stack on its returning effect, this is incorrect as per MTG rules for persist, the card is supposed to go from the grave directly to inplay(grave -> temp -> inplay, in our case).
third, tokens models don't have names, so i make it check now for a name size on the model before clearing and resetting in tranformer.
-- I removed the string comparison, which was expensive (the test is not necessary anymore, since it was "shielding" us from fake types (names), which are not creature subtypes, and therefore do not go through). I also moved one function call outside of the loop, just in case that wasn't optimized by the compiler.
- Removed unused Subtypes.cpp function (I don't really want people to use it, it can be quite expensive if used incorrectly)
- moved a test for issue 501 that has been fixed a while ago (we forgot to add the test to the test suite)
i also changed the logic behind wololo "ueot " instant ability creator...instead of sending it directly to genericinstantability i created a new class called AGenericInstantWrapper...which handles the adding, cloning, removel ect, exactly how we have always handled "instant abilities"...this should correct any further "odd edge case" issues with the new "ueot " code...
later i will varify if it works with every single ability we current build with a wrapper class...and see if i cant remove them all and convert "ueot " into the NEW until end of turn handling method....lets cross our fingers as it would remove ALOT of extra code if successful....
offerinterruptonphase=draw
to MTG.txt, which is included in the other modes by default...to recreate our "chance to do stuff on ais turn...
it will say you are interrupting "draw"...but i will clarify that you are intterupting the MOVE TO phase "draw"...not the action of drawing a card...
this is even better then our previous method to do stuff on ai's turn, becuase now we can play cards that prevent ais draw ect :) becuase before we were interrupting the action of drawing for the turn...
added
"offerinterruptonphase=blah"
to the parsing of the rules.txt files...the reason i want to handle it inside the rules.txt....
originally i was going to use the options variable for this, then i realized that if i use that variable, it would apply it to every game mode and peoples custom games...so instead i added the parsing in the actual rules.txt files, this way, if we want to offer interrupt on phase blah to MTG, but NOT have this interrupt offered in a mod or different mode, or if the different mod or mode should offer you a chance to interrupt ai in a different phase ...you can set each rule to interrupt in the phase you want...
now for the reason i added it in the first place...previously we were allowed an interrupt when the opponent drew a card in the draw step, this gave us a chance to do stuff on opponents turn....
recently wololo i beleave made draw actions not use the stack anymore(which was a good change, since as per MTG rules the actions of drawing is not a stack action)...but as a side-effect, we lose our chance to interrupt ai and do stuff on ais turn....
also, changed the ingame bonus thing, to start recording stuff towards bonuses on turn 2+...this solves reported issues with story mode "setting up" causing massive bonuses to be gained for doing nothing.....
2nd, found a infinate loop is created when you cast a loseabilities on a card which has loseabilities, when the 2 effect ends it readds the first one, before it is removed, making the first one remove the 2nd one and repeat forever....
this is only a half fix, it created a memleak in the place of the loop :/ so wololo please review!!!
2nd, removed a peice of code which was originally added i imagine before list mentioner was created which added cards whos names ended in "s" to the subtypes list, this is completely unrelated to the "s" charector added to targetchooser. this was actually a really nasty hack....
previous subtypes list contained 1200 variables...the new one after this removel is about 237ish....
this does not impact foreach, or any targetchoosers ability to target a card by name, targetchooser is coded to add card names to the subtypes list as it needs them, so using foreach(arbor elf) will add this to subtypes list for targeting purposes, in the future we might want to have this kind of check done and handled outside of the subtypes list, adding card names to that list for the purpose of targeting is just dirty.
this fixes a ugly lag spike introduced with the change to subtypes...for now...we need to consider a better way to sort these in the future to avoid this returning as subtypeslist gets bigger.
* pruned out unused local variables.
---- There's no need to define something if it isn't going to be referenced. It consumes extra memory temporarily and more than anything is a potential cause for confusion down the road.
- Added a way to specify "no interrupt" in modrules.xml (I need to write a doc about this file) for a given game. This does not mean the stack does not show up (the stack is interesting to see what the opponent does), but that it only offers to continue.
- Updated changeling and transforms to only get creature types (as initially intended by the code), removed hardcoded list of "types to avoid"
The test suite passes
- Fixed a Bug where AI would not correctly assign blockers if the first attacker is super strong.
- Added a hack to prevent AI from an infinite loop while choosing a target. There are edge cases where the AI gets to choose the targets for a TargetChooser that doesn't belong to it. I couldn't dig too long for the root cause, so I added a "return 0" when the case happens. Should probably open a ticket
- Added a "Hint" System in AI decks, to help the AI with its strategy. This is not really usable yet, it only works with abilities (not cards to play), and I only added some basic code for counters and tokens. This can probably be extended, but let's wait until we see it working on that other game I'm working on, before rushing into adding hints to all AI decks...
- minor cleanup of AI Code
- Added Evil Presence, as an example of the new keywords loseabilities and losesubtypes. It's quite experimental but I added 3 tests that cover the basics. Please report if you find bugs.
- moved the "lands produce mana" rules outside of the primitives, and into the external rules. This was a necessary step to create cards such as Evil Presence.
- real support for subtypes. Needs some more testing, but there are now functions in Subtypes.cpp to know if a given subtype is a creature subtype, or a land subtype, etc...
- minor refactor of MTGDeck.cpp
Notes:
- I checked that the AI can still use lands
- This change has a bad impact on primitives loading performance (thanks Wil for the loading time output). This is probably due to suboptimal algorithms and data structures for subtypes. If the impact is strong on lowend devices, I can probably optimize a bit (the map subtypesOf could be changed into a vector with some work)
- The test suite passes, added 3 tests for evil presence.
- "Manapool empties at the end of each step" becomes an ability, and was moved into the external rules file. "removemana(*) to remove all, removemana(*{G}) to remove all green, removemana(*{G}{B}{R}) to remove all green black red, removemana({G}{G}{B}{U}) (no "*") to remove a specific value.
- Added a possibility to make abilities non interruptible. With little work, this could be added to the parser if needed. Please use with care, let's discuss what is an acceptable usage of this now functionality, if needed.
Crossing fingers I didn't break anything major. The test suite passes, though I expect some edge case bugs to appear. Apologies in advance, I think this change is worth it.
Arrogant Bloodlord
Ceremonial Guard
Cinder Wall
Fog Elemental
Gemini Engine
Goblin Sappers
Rainbow Vale
Stoic Ephemera
Teferi's Veil
Thawing Glaciers
Time Elemental (only to "sacrifice", not to "damage:5 controller"! --> rules on Gatherer)
Undiscovered Paradise
Vebulid
Wall of Nets
2. Removed ", sourceinplay" from:
Wall of Tears
Following the rules, a creature blocked by Wall of Tears is indeed returned to owner's hand even if Wall of Tears has left the battlefield before the end of combat.
This is the same reason why several cards did not get ", sourceinplay":
Example case for not adding ", sourceinplay":
Tolarian Entrancer
"The control change has no duration; you’ll retain control of that creature until the game ends or until some other effect causes it to change control. It doesn’t matter if Tolarian Entrancer leaves the battlefield,
or if Tolarian Entrancer has already left the battlefield by the time the “at end of combat” ability triggers".
This is also true for all cards which have a certain effect on other creatures blocking or having been blocked by it.
3. Added "once" to:
Basalt Golem
Frostweb Spider
Joven's Ferrets
Wicker Warcrawler
- This is some Work in progress to make Wagic less "game" dependent.
This change especially is an attempt at moving away from some dangerous patents owned by some company.
It introduces "modrules.xml", a global configuration file describing dynamic settings for any given Wagic mod. It is very basic for now, but allows to customize a bit. In particular, it allows to remove the concept of shop and deck editor from the game, dynamically generate the main menu, and represent card activation with a mask rather than a rotation.
I have a sample in progress which I hope to submit in the days to come, a proof of concept (nothing fancy yet) for another type of game using these ideas, as well as a few other things I introduced recently.
In the future, I am hoping to extend modrules.xml so that it entirely describes the rules of a given card game. the other files in rules.txt will describe "extensions" to the core rules, just like they do right now, so this new file does not make them obsolete.
- Also fixed minor bugs I stumbled upon while developing
Also deleted "extraCostsIsCopy" from ManaCost - unused variable.
Overall, drops ManaCost from 148 bytes to 120 (which in turn reduces CardPrimitive's memory footprint by the same amount, since it encapsulates a ManaCost).
Blood Frenzy
Brood of Cockroaches
Celestial Sword
Goatnapper
Crazed Armodon
Dark Maze
Dragon Whelp
Farrelite Priest
Giant Caterpillar
Initiates of the Ebon Hand
Mogg Cannon
Puffer Extract
Rainbow Vale
Rukh Egg
Season of the Witch
Surprise Deployment
Transluminant
comparing counters to p instead of isAi(), and hope to close off an edge case where ai would get stuck cycling through setting the target of a may ability. caught it stuck 2 times while watching demo. i watched demo for close to an hour without seeing any adverse effect, and without getting stuck, tho this is so hard to debug, since there is no call stack loaded for this case when it happens.
first, subjecting manaproducers built unnested to the same restrictions/limits/sideffects as thier activated ability counterparts...
2nd
allowing either "," or " " to be a seperator for the variables in phaseaction so they can be used in transformer "newability"
if i recieve another bug about phaseaction, im scrapping it completely and recoding it from the ground up.
- added texture deactivate around each renderer call implemented in opengl es 1.1. It fixes a couple of artifacts but a couple are remaining
- added a compilation switch to allow simulation of opengl es 1.1 on desktop
- Coded double-click and orientation change for Android
- Clean up debug code badly introduced in opengl code in r3529
- updated Qt project to link against boost on linux
- Added boost thread files, that fixes all the threading/compiling/linking problems on Android ...
- Added opengles 1.1 code, there are still some bugs I need to tackle ... and I should realy split this file now !!!
- Added Android debug traces
- Hardcoded resources to "/sdcard/Wagic/Res" for the moment on Android
- Added a wagic SDL project for desktop, and the related SDL frontend used for Android. This frontend is currently mostly desktop based, it needs some work to be fully useable with touch and gesture on Android.
- also has a basic support for unlocks (does not yet allow people to create their own unlock rules, though...)
- Some things are still hardcoded and should progressively move to these rules files (such as Game Type, how random decks are created, etc...)
- Test suite doesn't foolishly ask you to choose a game mode (momir, etc...) anymore
- UPDATE YOUR Res/rules/ folder !!!
I also profiled this after the fact, as we have an open bug on poor drawing performance on psp when in text mode - it turns out that in the AlternateRender() function, my numbers look like this: 10.2 seconds were spent in JBLFont::DrawString(); 0.5 seconds were spent in my new helper FormatText() call, so we know where the perf hit is now.
I compared before & after on the psp with this mod, and the difference really isn't perceptible. (It's still juddery, but no worse than before.) I'll look at the DrawString() call next to see if we can make it any faster, although at first glance it looks like a pain.
class Foo
#ifdef TRACK_OBJECT_USAGE
: public InstanceCounter<Foo>
#endif
Then, use this macro somewhere in the class body:
SUPPORT_OBJECT_ANALYTICS(Foo)
Lastly, add whatever information you want to trace out to the function ObjectAnalytics::DumpStatistics().
Here's a sample of the output of what I've instrumented so far:
-----------------------------------------------------------
Object Usage Stats
CardPrimitive current count: 7899
CardPrimitive current byte usage: 2053740
CardPrimitive max count: 7908
CardPrimitive max byte usage: 2056080
MTGCard current count: 13973
MTGCard current byte usage: 670704
MTGCard max count: 13982
MTGCard max byte usage: 671136
MTGCardInstance current count: 180
MTGCardInstance current byte usage: 172080
MTGCardInstance max count: 189
MTGCardInstance max byte usage: 180684
-----------------------------------------------------------
- moved mtg_todo.dat into "unsupported.txt"...there are many parsing issues that I need to solve, but give it a try (set the grade level to "unsupported" in your advanced options, and restart the game) , it bumps the number of unique cards to almost 12000 :) (of course, these new cards don't work, that's the point of the "unsupported" grade)
Also fixed a subtle memory pooling issue in the RenderCountersBig() routine: if you're in regular card display mode, the idea is that formatted text is only fetched if you flip into alternate render mode. However, in this function, if counters are being drawn, it would fetch the formatted text in order to determine where to draw the counters, EVEN IF the counters count was zero. So it had nothing to draw, but it meanwhile pooled the formatted strings into memory anyway.
- Consolidated duplicate PSP / PSPENV defines;
- removed some ancillary file crap from the 2010 projects;
- pulled 1xx references from the makefiles;
- consolidated multiple #defines for OutputDebugString into one header (previously was split between config.h & DebugRoutines.h).
first as requested, kicker will now act like the other cost, offering a menu choice, heres the catch tho,
it was also thought up that we should maintain the "pay automatically" method of it as it feels more natural to some(even tho as per MTG rules its supposed to be a choice).
so here is what i did that i hope satisfies everyone, i added a new menu option under advanced tab..."kicker payment" with 2 setting, by defualt "always pay" but also an option to "always offer choice"...
2nd, minor tweaks to player avatar, every tme i saw it i was like "i need to do something about that", the avatar getting completely sucked into the corner just looked bad imo, so i about doubled the "inactive" size, so it looks a little more uniform with the opponents avatar. also move the library and grave icons just a thin hair to the left so they don't grossly overlap the players avatar as much when active, and increased the dark box theyre contained in my just a few pixels.
3rd, something else thats really bothered me to no end was that the title text of simple menus which display the cards name which owns the box was using small face font, which on pc was *barely* ok...but on psp(smaller devices) looks like white smears and dots. i changed it to share the font and size used inside the menubox itself, the end result is a lot nicer look...and alot easier to read on psp. now if only we can convince wololo that "spades" is alot like a lava lamp, cool at first, but *extremely* dated. the menu box should have a much slicker look, maybe rounded corners instead and lose the street light poles?
minor fix for phaseaction, becuase of the nature of this ability finding a happy safe medium without losing function is tough. hopefully this corrects it for good.
dropped cast methods menutext returns to lower case, for uniformity.
- Added a "PSP" compile-time define to clean up some compile time checks (replaced !WIN32 && !LINUX && !IOS with PSP)
-- Wil, I am aware that this is redundant with the PSPENV variable you introduced recently, I think we can clean that up easily
-- This looks like lots of changes, but most of the time I just moved some blocks here and there
-- tested on VC 2010, PSP, and a bit of NDK
-- I might have broken maemo, iOS, or Linux compilation, can you guys check?
- Fixed some warnings reported by NDK
- NDK still does not compile because recent boost additions (mutex, etc...) are apparently not supported
I've marked all the ones I found with the following TODO comment:
TODO: C6246: <blah blah>
a few in particular are the ones related to "oneShot" and "_target". These are local variables that are declared that
mask either a method parameter or a member variable.
Fixed. Had to clear the DeckManager whenever the player deck selection screen is displayed.
TODO: Need to implement a caching mechanism that caches the deck information based on deck selection and not a global one.
Currently DeckManager is effectively treating the DeckMetaData as global data.
*some minor tweaks to how deck information is managed/created
* changed how the avatar images are assigned since how they were before was incorrect. They are now assigned upon instantiation of the meta file. Not when the stats are calculated.
* Added new image for "Evil Twin". This is a horizontally flipped image of the original player avatar with a red background. Please feel free to edit the image.
* removed display of avatar image on menu items in deck selection that are not deck related. (ie "Cancel", "Back to Main Menu", etc) "New Deck" also does not have an image since no deck really exists yet so no avatar.
Issue: 622
Abduction
Corrupted Zendikon
Crusher Zendikon
False Demise
Fool's Demise
Guardian Zendikon
Shade's Form
Squee's Embrace
Vastwood Zendikon
Wind Zendikon
All cards have been tested manually.
Code example:
[card]
name=Abduction
target=creature
alias=1194
auto=untap
auto=@movedTo(mytgt|graveyard) from(battlefield):all(trigger[to]) moveTo(opponentbattlefield)
text=Enchant creature -- When Abduction enters the battlefield, untap enchanted creature. -- You control enchanted creature. -- When enchanted creature is put into a graveyard, return that card to the battlefield under its owner's control.
mana={2}{U}{U}
type=Enchantment
subtype=Aura
[/card]
doTap now only serves a single purpose, to pass Tap variable to amanaproducer class so that "tappedformana" will trigger is a manaproducer was tapped for mana.
Turned on the threaded card fetching code for win/linux. PSP runs unthreaded. There's an easy toggle for switching which mode the app runs in: check out WResourceManager's constructor.
To fully appreciate the difference, try going into the deck editor without these changes, and use the arrow keys to navigate around (esp. up/down, as it loads 7 cards at a time). Then try again with these mods, you'll see the cards flicker briefly to the back card image and then load as they scroll onto the screen.
converted {t} into a extra cost. almost all original code to handle it outside remains intact, i plan on slowly migrating to just using the cost...but even just what i changed was a massive headache...anyways as a cost you wont ever have an random bugs where cards don't tap when the ability had {t} in its cost.
while i was at it, i added {q} untap cost.
also restricted it to _target->isInPlay() i read through all the cards which use this and none of them targetted a source that was not in play, or not being moved to inplay...
2nd, found out today that certain activated abilities can use either target click or object click, find the difference between the 2 was impossible, exsample, {2}{t}:foreach(blah) add{b}
{t}:foreach(blah) add{b}
so i figured i would need to remove those foreach mana abilities from the stack and add that same code for the bottom half...after noticing that both the reactToClick and reactToTargetClick did EXACTLY the same things after the "cost" portion...i decided to create a new virtual int activateAbility the activatedAbility parent. this way incase i need to change any further code in there, both functions resolve the same. This was a nice lesson in why copy paste coding is stupid. you think you solved the bug becuase it works in one function call, but you actually didnt.
first enum'ed the variables of ADynamic class to make them easier to understand at a glance.
2nd
added stack resolves for the abilities in ADynamic, sword to Plowshare bug fixed
3rd
removing foreach mana producers from the stack, didn't realize they used the top portion of activated ability resolves, also added event sending for @tappedformana for foreach manaproducers.
4th,
in getcoreability if we're getting the core of a foreach, send the foreach->ability itself otherwise we go one layer too deep and end up throwing off the core completely.
added the following
Rushing River
Quietus Spike
Primal Growth
Phyrexian Scuta
Magma Burst
Infernal Contract
Heartless Hidetsugu
Floodgate
Eternal Flame
Ebonblade Reaper
Dwarven Landslide
Cruel Bargain
Catacomb Dragon
Blood Tribute
Banshee
Arctic Merfolk
these cards use the new naming system for other cost, and use the halfup/down subkeywords.
recoded altercost, its finally not using a dirty clean up.
this fixes the bug with it not effecting ai also and the bug where it was ineffective when combined with affinity creatures...
removed a aspect of the wolf class...
soft coded support for aspect of the wolf...using word variable subkeyword "halfup" and "halfdown"
it can go anywhere a parsable word vairable is stringing...i preffer the front of it...
these are Wparsedint subkeywords, not keywords you can use with standard abilities...
its meant to return half the varible rounds up, or down...
fixed player not losing with cantlifelose when they have 10 or more poison...the player should die.
reworked taplandformana, i send the main card as a target now, check against the cost if its affordable...anyways, i discussed this bool function a while back with devs and wololo saw the same issues i saw in it...he then removed it from being used as an if statement...i changed it back to an if statement with the new checks...we are either going to go back to a void, or go all the way bool, but not inbetween.
Bestial Fury
Chambered Nautilus
Corrupt Official
Deathcoil Wurm
Deepwood Tantiv
Deepwood Wolverine
Drelnoch
Duskworker
Dwarven Berserker
Escaped Null
Ferocity
Flint Golem
Gift of the Woods
Goblin Cadets
Goblin Swine-Rider
Groffskithur
Gustcloak Cavalier
Gustcloak Harrier
Gustcloak Runner
Gustcloak Savior
Gustcloak Sentinel
Gustcloak Skirmisher
Ignoble Soldier
Karplusan Wolverine
Laccolith Grunt
Laccolith Titan
Laccolith Warrior
Laccolith Whelp
Leery Fogbeast
Lim-Dul's Paladin
Lone Wolf
Norwood Warrior
Port Inspector
Pretender's Claim
Pride of Lions
Razorclaw Bear
Rhox
Sacred Prey
Saprazzan Heir
Saprazzan Raider
Silkenfist Fighter
Silkenfist Order
Slashing Tiger
Slith Strider
Snorting Gahr
Thorn Elemental
Tornado Elemental
Trained Cheetah
Unstoppable Ash
Vedalken Ghoul
Wolf Pack
Corrected Hidden Ancients, Nature's Will and a typo in text of True Conviction.
Changed Honden of Life's Web:
auto=@each my upkeep:token(Spirit,Creature Spirit,1/1)*type:shrine
==>
auto=@each my upkeep:foreach(shrine|mybattlefield) token(Spirit,Creature Spirit,1/1)*1
Because the )*type:shrine will make token's toughness become number of shrine in my battlefield.
For example: If I have two shrines on my battlefield, it will produce two 1/2 tokens instead of two 1/1 tokens.
All tests passed, also manually tested over twelve "@combat(blocked,turnlimited)" cards which have different trigger effects, all of them works fine.
first, tweaked some ai checks a bit.
small changes.
2nd, i removed the following classes,
APowerToughnessModifierUntilEndOfTurn
APowerToughnessModifierUntilEOT
ADragonWhelp
i replaced these with soft coded support for dragon whelps "sideffects" of using a ability more then a certain number of times...
syntax limit^the effect you want^the use it triggers on.
replaced both powertoughnessueot classes with a class which falls more along the lines of how we handle ueot abilitys...PTInstant, creates the wrapper with the ability and adds it to the game, rather then that jumbled mess that was previous version.
added support for "phaseaction[" phase words "my" and "opponent" so you can denote which players phases it will happen on. by default it automatically happens on both players turns when the phase matches.
modified a few things in phaseaction class...which correct a memory leak which could be created if the source of the phaseaction is destroyed before the phase action resolved. rather then storing an ability which is left floating in memory if phaseaction is destroy...i took a much safer route of passing the string of the ability directly to the phaseaction class...and i build the ability right when it is being used instead. makes much more sense.
angry mob is now fully supported. yay to removing nasty ugly workarounds!!!! and i mean UGLY.
dragon whelp is now fully soft coded. added the 5 or six other cards which do similar effects.
========================================
added a function to return the action element id by mtgcardinstance.
=======================================
refactored all 5 combat triggers to be handled in a single class, this change helps reduce the "bits and pieces" of trigger restrictions which some did support while others didnt, it also allows for easier editing and debugging if future code needs to be added to it.
refactored the parsing for the combat triggers also, so that a combat trigger can be built from a single object if it only contains "or"...amongst other reasons.
the new syntax is auto=@combat(blocking,attacking,turnlimited,once) source(TC) from(TC):effect...all the same words are still used, except they are now all included inside the combat(-----) this includes restrictions for the triggers. if a card still needs multiple triggers from some reason...it is still 100% allowed to have as many as you want, with whatever you want inside them...check updated primitive for examples.
the required sections are auto=@combat(atleast one trigger) source(TC):effect.
=========================================
moved the limitsperturn "limit:" from genericactivatedability up to its parent class activatedability, did this for the following reason
first rules correction, the previous method tracked uses on resolve, which is incorrect, it should count as the ability is fired and placed on the stack.
second, it keeps all the actiavted ability restrictions in the same place, this is the location we are checking summoning sickness, actived restrictions such as "myturnonly" ect. makes sense to handle it in the parent.
third, it allow any and all future activated abilities easy access to "limit:" if needed, it would only require adding a limit string to pass on construction to the child classes instead of recoding the same exact checks as genericactivated.
=======================================================
reworked "name(" so that it no longer is required to be used inside a "&&" ability, also it no longer will create a MTGAbility object with a false return. that was just dirty of me :/
enabled "name(" to replace the menutext of alternative cost.
"other={cost} name(holy cow)"
will display "holy cow" instead of "pay alternative cost", this change is nice because we ended up using "other" cost for WAY more then originally planned...now we can label it exactly what it should say when you click it.
======================================================
added a subtype keyword for powertoughnessmodifier so that you can basically switch on non-static variables for it...lifetotal/lifetotal nonstatic...PT can now except all word variables as i added reparsing of the ints, had to maintain old methods as ai needs them to decide what to do with them.
======================================================
removed the following extremely redundant classes
both ABecomes classes---atransformer has become far superior to it, i kept the "becomes(" parsing tho, and it will act exactly as it use to, except now it has access to most of the subkeywords of transforms...it also now allows word variables. and excepts "forever" as a tag. added "newcolor" subkeyword to transforms to create the "becomes(" adding a color without removing colors effect. "becomes(" now returns a constructor for ATransformer that emulates becomes( exactly as it worked before.
both forevertransformer classes, the only difference between the 2 was one subkeyword, and "forever" did not return a "destroy()"...i recreated this in less then 4 lines and a bool. that was sloppy of me :( i guess we learn and improve.
============================================================================
i removed the parsing of card casting restriction from the first pass when cards load, instead of making it a cardprimitive object, i now simply pass the string through the card and build the restrictions when theyre actually needed and checked.
this change allowed for alot of clean up, removing enum and dependancy on cardprimitive, and combining both allowedAltCast and allowedtocast functions checks through a new function "parseCastRestrictions"...this change keeps all the cast resrictions in a single place, which makes it easier to debug or add if needed, and while i was at it, i enabled it so cards can now contain as many restrictions as you want *of the available ones*
added "turn:" as a restriction to make it so "fourth turn" could actually be ANY turn you list, this allowed me to remove a dirty line of code which was checking if a card was o converted cost but had a suspend...lotus bloom...which can not be cast normally..for cards like this now you can use restriction=turn:200 or otherrestriction=turn:200....
=========================================================================
added Phyrexian Mana...svntax {p(r)} ....this will always be payable with 2 life, but if you have a red mana for this example, it will charge you the red mana instead...you can have any combination of P mana you want in any of the games manacost.
===================================================
reworked a bit of the ai logic i added, it now has true interrupting and can now correctly target for fizzles, Ai will go into full out counterspell wars with you now...
===================================================
added a ingame reward system with fancy flying text animations, they reward the player with actual credits, but are extremely hard to trigger off, theyre not meant to be something you see every 5 secs, but something that when you see them trigger you go "damn that was cool"
the triggers and effects are as follows
first the combo system:
you have to chain cast 5 or more card, without tapping or being interupted, tiny bonus for this..chain is broken as soon as you or your opponent tap something.
next combo level is
Abundant Resources - chain 10 or more spells same condition
then
killer - chain 15 or more same condition
this will include a flying text render once a chain is successfully started (5+ cast)
this bonus can be triggered multiple times in a match
the next bonus is
+ //creatures entering play consecutively will allow you a chance
+ //to gain a bonus for maintaining force sizes, it will trigger every 10th
+ //creature which enters play consecutively.
this is restarted every time a noncreature enters play.
the levels are as follows,
Deadly Force Bonus! -10 creatures enter play consecutively
Extreme Infantry Bonus! - 10 creatures enter play consecutively and you maintain a force size of 20+
Malignant Conqueror Bonus! -10 creatures enter play consecutively and you maintain a force size of 40+
this can only be triggered once per level per match.
next bonus is given for having alot of a specific type come into play under your control during a match, this bonus only triggers once per match.
the levels are:
Toy Collector!
Beast Tamer!
Vampire King!
Lord of Swarms!
Master of Elements!
Zombie Apocalypse!
Sword And Shield!
Medic!
The Promenade!
Heavenly Host!
Teeth And Scales!
its pretty easy to figure out what each requires to trigger, teeth and scales for example is dragons, wurms, drakes, and snakes.
the final bonus is deal 100 damage from a single source in a single damage event, this one triggers only once per match.
============================================================
fixed the following bugs::::
regenerate was not working for non-creature regeneration ie:welding jar
ai would sometime get stuck in a infinate loop tho extremely rarely while deciding what to do, the cause
if (clickstream.empty())
computeActions();
is NOT enough...ai should NEVER be computing actions (finding a card or ability to play) when it is NOT the active player..meaning, it does not have priority.
g->currentlyActing() is the player that has priority.
if (clickstream.empty() && g->currentlyActing() == this)...loop fixed :)
dynamicability had a couple weird results, from sources which dont have an amount to return, i now check this and if non, the amount is 0.
transformer will no longer add the same types a card already has..
removed an unneeded
if (!activated) ....oris bug seems to be corrected with this change.
wrapped limitsperturn checks in a conditional to skip it if there is no limit string.
added safer method to get the target of the combat trigger. the previous could potentially cause a crash if you interrupted the ability while the combat trigger was on the stack, it would do a call to "getnextopponent" and return a null pointer. i now send the opponent with the event.
fixed a crash that would happen when a card did not have a type= line. having a type or subtype line is now optional. and highly recommended to avoid using "type=nothing"
moved a function call in buyback isreactingtoclick so that it checks if its in the hand before parsing the restrictions for it.
removed allowedtocast function calls from the alternative payment types, they are only supposed to check allowedtocast if it is something like "buyback" and kicker...not "you may pay this instead"....
corrected an issue with type: variable where it would add the amount depending on the activeplayer. to correct i added a method to call TargetZoneChooser::targetsZone( with a mSource...so that you can set the source card for the scan.
note: all test pass.
Abyssal Nocturnus
Confessor
Geth's Grimoire
Liliana's Caress
Megrim
Nath of the Gilt-Leaf
Updated following cards:
Cloudhoof Kirin
Keening Stone
Presence of the Master
2nd, fixed a misunderstood line i added, i was aiming for the tc that triggered the event in trtargted....all tested passed, and i didn't manually test that change (SHAME ON ME!!!)...corrected it in the correct place now, where the event is sent.
3rd, trying to fix a broken alias class, this is a work in progress, i intend to fix this and then convert it to a keyword for draw replacement effects for 16.1(?) anyways, only thing ive left to figure out is telling it how to determine that the last stack ability is a "draw" ability. this class quit working ALONG time ago when the "addDraw" object was no longer used. the methods for card drawing changed and no one updated the alias class to use the new method, i imagine this is also what broke aladdins lamp originally(which the change of draw events and how card display is set up)
fixed a bug with Withering Wisps, moved the parsing of the limit string into the isreactingtoclick function, this allows word varibles such as type: to be used.
2nd, removed a varible isTempPhased, it *appear* it might not be needed, tho i didn't handle phasing the way im converting it to for a reason, so cross your fingers and hope all goes well.
BTW: do not email me about any bugs that ariase with phasing or phased out creature, im not excepting bug reports on it to my email box...instead open a ticket with a repro method and mark it as critical.
Animate Artifact
Chariot of the Sun
Pestilence
Updated following cards:
Chimeric Mass
Chimeric Staff
Svogthos, the Restless Tomb
Testament of Faith
Weight of Spires
- Moved big picture display a bit down ingame
- Temporarily Reinstantiated "back quad shows first" in deck editor, see my comments in http://code.google.com/p/wagic/source/detail?r=3008
-- This is only temporary, and pending the final Thread work, but I'm afraid this won't make it to 0.15. It is possible to get the previous behavior back with a simple define, in case we want it for windows.
the equipment is supposed to fall of as a statebased effect.
this is also true for auras, tho the fix for auras will be alot more complex, and im not reffering to the "protected against" bug which we have reason to not fix.
this is a rule that states
303.4b - If an Aura is enchanting an illegal object or player, the object it was attached to no longer exists, or the player it was attached to has left the game, the Aura is put into its owner's graveyard. (This is a state-based action. See Rule 704.) [CompRules 2009/07/08]
an aura that targets a creature that suddenly becomes a land and loses creature is supposed to fall off, an aura that targets a green creature that suddenly becomes black and loses green is supposed to fall off.
this rule is the same for both auras and equipment, but due to how we handle auras, only equipments will be fixed in this commit.
first, while hunting down easter eggs in the todo.dat i started trying to code some un-added equipment...noticed that thisforeach was exhabiting strange behavior.
what was happening was in the changed line, abilities.size() was a non-static number, so on most abilities, thisforeach was actually stopping prematurely. which explains why there was no test added for thisforeach, becuase it really wasnt working correctly.
what i did to correct the issue was set "i" as an unsigned int = abilities.size()..this way abilities being added don't stop it prematurely in the process of adding the matches.
2nd, this one is geared towards equipment only, it is a bug fix, not a "lets recode all equipment to use this"...i noticed that alot of equipment was suffering from double entries of activated abilities, the first entry was always targeted at the equipment and did nothing in most cases, the 2nd was always added during the getabilities call.
to fix, i added autoskill= ...what this line is used for it activated abilities or abilities that otherwise shouldnt exist when the card is not equipped, it is called on when getabilities function is called by equip() and for removel purposes.
auto={C(-0/-1,1)}:all(this) Add{G} limit:1
other wise it parsed as a non=activated ability, don't worry tho, i change activated manaproducers a long time ago so that they dont use the stack, so all this will do is enable using "limit:"...
Angelic Chorus
Lavaborn Muse
Pestilence
Living Artifact
Hypnotic Specter
there is test for each of these.
btw living artifact hard code was wrong, it was allowing you to remove counters at any phase, the soft code is actually correct. updated living artifact test to the correct version in next rev
also fixed a case where "thatmuch" was never set, i now also store the amount on the source of the trigger as well.
the old method was fine when wagic only supported 200 cards, this is so far from the case now. this will avoid bugs being introduced when we add support for a card in soft code.
what this was essentially doing was it would load every set but the hardcode card as soft code, and if you used the card which was originally hard coded, you get a bug where soft and hard code are both loaded.
auto=lord(*[saproling;forest]) transforms((saproling forest creature land,setpower=1,settoughness=1,newability[{t}:add{g}]))
this is close enough for me, its 99% correct in my books, you can declare either forest and saprolings as attackers, target them as thier respective new types, the only thing that is not correct about it is that they can tap for mana the turn they come into play, however they have summoning sickness and can not attack.
im am not going to change the attack/block rules or manaproducer reactToClick just to satisfy this bug in the only card in MTG that does this.
Temporary Insanity
Tower of Coireall
Tower of the Magistrate
Transguild Courier
Unified Strike
Vampiric Sliver
Verdeloth the Ancient
Veteran's Voice
Warbreak Trumpeter
Waterspout Djinn
Weight of Spires
Wild Growth
Withering Wisps
Wrap in Vigor
Yore-Tiller Nephilim
Zirilan of the Claw
Zombie Mob
added a few new cards i found along the way:
Ersatz Gnomes
Extravagant Spirit
Ghastly Demise
Ghostfire
Moonlace
color "artifact" is actually colorless, it does not add the subtype artifact to cards.
1st
had to revise the syntax for my "type:" variable it is now type:blah:location, using the pipe line created nasty returns in some combinations of abilities as the parser confused the pipeline in type: with the one in TC.
2nd
more of a correction then a bug fix, i noticed that upcost had instances where it could still trigger its effect in the draw phase becuase the condiational for the ability resolve was in the update, i left the class mostly untouched but move the resolve out of update and into a receiveEvent for upcost, which triggers only once after you declared that you are leaving the upkeep before draw step begins.
3rd
reworked the construction of multiability to only produce a single multiability with all the abilities in the string instead of nested multiabilities, it is considerabily easier to debug and creates 1/3 less objects for the engine to deal with in comparison to the old method.
also noticed issues with transforms parsing which i was able to easily correct by making it parse transforms in double brackets, transforms((effects))...updated primitive in next revision.
test suite passes, and varified that the fix doesn't effect how "&&" ability works with transforms.
[card]
name=Spore Frog
auto={S}:fog oneshot
text=Sacrifice Spore Frog: Prevent all combat damage that would be dealt this turn.
mana={G}
type=Creature
subtype=Frog
power=1
toughness=1
[/card]
as we all remember spore frog was originally a issue ticket, preventalldamage was not working in all cases, or the effect stuck permanently.
as general advice, a card is "supported" if it is atleast 99% correct. this change was un merited as they showed no issues and had no tickets open.
and i know im not to "revert" anyones changes, but it will be MY email box that gets hit with 5 new bug reports concerning these cards. and i just don't have time to mess around with things that were a nonissue.
added newability[whatever ability] to transforms classes.
this allows for transforms to also add activated or mtgabilities to cards it targets.
example Prismatic omen:
auto=lord(land|myBattlefield) transforms(plains forest mountain swamp island,newability[{t}:add{w}],newability[{t}:add{g}],newability[{t}:add{r}],newability[{t}:add{b}],newability[{t}:add{u}])
Issue: 573
lets say in the case of Isleback Spawn you want to see if ANY player has less then 20 cards.
auto=aslongas(*|library) 4/8 <21 compare
this will check if either you or your opponent has less then 20 cards. rather then adding the total cards in both libraries.
over the last weeks ive seen this cards code change atleast 3 times. this should be the final version for it and any other cards like it.
Diviner's Wand
Guiltfeeder
Leyline of the Void
Updated following cards:
Academy Researchers
Addle
Amnesia
Angel's Feather
Demon's Horn
Distress
Dragon Mage
Dragon's Claw
Encroach
Extract
Golem's Heart
Hint of Insanity
Inquisition of Kozilek
Kor Firewalker
Kraken's Eye
Mindslicer
Paradise Plume
Psychic Spear
Thornbite Staff
Thoughtseize
Unmask
Venarian Glimmer
Wheel of Fortune
Wurm's Tooth
Fixed a typo of Reassembling Skeleton in M11 _cards.dat reported in forum.
added parsing to correct this bug,
cards which state "card from target players hand" should be coded "target(*|hand)" which allows targetting of any cards which are in a hand not just your hand.
|myhand)
|opponenthand)
|hand)
self explainitory.....
while i was at it reworked the aslongas class completely, i promised myself if another bug popped up with aslongas i would rewrite it. 20 hours later, we have an aslongas which does not care about when cards come or go.
aslongas should never have used the added/removed to determine the validity of its effect. i allow update to sort it out now in the update function of aslongas...also added a new function to it called sorterfunction tho it looks as it could be reduced in code i would appreciate that it remains as it is, simply because of the nightmare i went through fixing the previous 7 bugs or more reported for aslongas. the logic was far to jumbled up. this i hope is atleast cleaner and easier to understand for the future devs that might work on it.
note: all test passed, all manual testing also passed.
new while tag is used as follows.
[card]
name=Emperor Crocodile
auto=aslongas(other creature|myBattlefield) all(this) sacrifice while <1
text=When you control no other creatures, sacrifice Emperor Crocodile.
mana={3}{G}
type=Creature
subtype=Crocodile
power=5
toughness=5
[/card]
this will denote that the ability is NOT a oneshot ability and should remain effective for the entire time the card is in the field.
Issue: 613
Updated following cards:
Body Snatcher
Greel, Mind Raker
Last Stand
Mesmeric Trance
Psychic Vortex
Spellbound Dragon
Venarian Glimmer
Added Hint of Insanity and Persecute.
this was intruduced as a workaround to force a card to be able to display muliple types of tokens, which wagic can support with this workaround but causes fails in test suite....
Sarpadian Empires, Vol. VII
this is the card that created this fail.
in the future we need to be careful about adding tokens to card.dat...there are 2 different systems for getting a token to appear for a card. lets use what we have.
Echoing Ruin
Eradicate
Extirpate
Incite Hysteria
Leave No Trace
Neurok Commando
Retraced Image
Scour
Sowing Salt
Splinter
Surge of Zeal
Wojek Siren
Updated following cards:
Cleansing Beam
Lobotomy
Rally the Righteous
Wake of Destruction
- Updating version number for upcoming revision
- Note: test Thallid.txt fails, we need to investigate when this happened and fix asap, will open a ticket.
i was not 100% successful in getting the correct cost on altercost which reduced the amounts. however altercost which increased the amounts are now clean code. so the reducers are still using a dirty method of putting the card from the hand back into the hand to get the correct amounts.
the issue i ran into is how to get the correct amount in this situation.
target cost {5}
have 3 reducers that - {2}
thats {1} of overkill reduce...
heres the issue. now remove all the reducers from play. the cost returns to {6} instead of 5.
you would think, will have it track the over kill. which leads to another. have the 3rd card which would contain the overkill removed first, i factor the overkill and increase the amount by what was reduced, but that would not be correct. since the reduce was {2} the increase of removing the overkill card should increase the targets cost by {2} not the amount it actually reduced. as you can see, it is extremely complex. so for now im leaving it dirty, but removing the resetcost code.
Archon of Redemption
Avenger en-Dal
Death Watch
Gristleback
Heal the Scars
Rashida Scalebane
Stalking Vengeance
Wave of Reckoning
Corrected text of Chronozoa.
- added 2 menus to wait for connection and wait for deck selection
- tested compilation on Qt Linux, Qt Windows and PSP
- deactivated everywhere (NETWORK_SUPPORT to activate).
exsample
[INIT]
mode=mtg
[PLAYERS]
life:2000
poisoncount:4
customphasering:untap,firstmain,firstmain,draw,firstmain,upkeep,draw
auto=shuffle
auto=draw:7
auto=@each my draw:draw:1
auto=maxPlay(land)1
by default every turn will have normal order we've always been use to
however
before begins --required added automatically
anything you want in any order
anything you want in any order
anything you want in any order
anything you want in any order
anything you want in any order
anything you want in any order
anything you want in any order
anything you want in any order
cleanup---required added automatically
after end of turn---required added automatically
svntax
customphasering:blah,blah,blah
listed in the order you want it to go. you can repeat a phase as often as you want, you can omit phases.
please note, this was not designed with MTG in mind..some of the rules require certain phases to work...this is for CUSTOM game building...i repeat NOT DESIGNED FOR MTG...tho it can be used with most(almost all, with the exception of those which require certain phases to work, exsample, ninjitsu will only work in a phasering which contains blockers and attackers)
enjoy.....
-fix for issue 604 (Land play limitation should not apply in all cases)
-- this adds a "castMehod" variable to MTGCardInstance. IF this variable is 0, the card was not "cast" (or for lands, "put into play" as part of the lands rule), but "added" to the battlefield with some other effect. On the other hand, if this variable is set, it means the card was cast
-- as we discussed, I did not touch the "alternateCostPaid" variable, as I'm still not really sure these two concepts are actually the same
Added the following cards in _cards.dat:
MIR:
Added following card:
[card]
primitive=Tombspawn
id=-3318
rarity=T
[/card]
PCY:
Added following card:
[card]
primitive=Elephant Token from Elephant Resurgence
id=-21382
rarity=T
[/card]
You also need to add two tokens pictures in All Image Set:
MIR.zip
Tombspawn (Tombstone Stairwell):
Name to 3318t
PCY.zip
Elephant Token from Elephant Resurgence (Elephant Resurgence):
Name to 21382t
case changes, "Time" != "time" aparently our parser now strings all counters as lower case...so "Charge" is no longer string "Charge" and can not be compared to "Charge"..not sure if that makes any sense :) anyways removel of time counters on exiled cards by triggers or effects now happen correctly.
added some extra checks to how Ai determines if it should cast a "all(" or other lord...it was only taking the amount of cards it had into account and not looking at what the suggestion was for the nestedability...meaning it treated "destroy all" the same way it treated "all creature +10/+10" it would only check if it had more cards effected...completely ignore the effects....
Apathy
Brainspoil
Cowardice
Cyclopean Snare
Dead-Iron Sledge
Deathrender
Dryad Arbor
Frenzied Tilling
Fugitive Druid
Funeral Pyre
Hazezon Tamar ##readd-if the "next" trigger is still activating every upkeep, this is a bug open a ticket please.
Haze of Rage
Infused Arrows
Thus, Construct thought the string length was 1 greater than it should have been causing an out of bounds runtime exception. In VS2008, the same thing
happened, however no exception was thrown since VS2008 allows access into the undefined memory space and returned a 0 (null) value when it tried to access
outside the string array. This fix targets specifically the color filters since they seem to be the ones with the error. " color:g;" and not "color:g;" was being
passed.
text=Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -- Whenever Hero of Bladehold attacks, put two 1/1 white soldier creature tokens onto the battlefield tapped and attacking.
==>
text=Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.)
fixed arbor elf, he snuck in with one of my test changes recently.
note:lovisa actual card and the massive errattas she received makes the card text make absolutely no sense at all.
Lake of the Dead
trigon of mending
lord of shatterskull pass
gorilla shaman
kumano
nightsky mimic
this one is debatable...lovisa cold eyes
what i did here was code lovisa EXACTLY as written on her card...
the erratta that was given to this card becuase it was considered "overpowered" was redicoulous....absolutely redicoulous...by the card her code is exactly as follows...
this card is FAR to basic to say there is a mistake in my understanding of it.
subtype=human lord <---this is on the card...
she is NOT a barbarian...
exact wording on the card
Warriors, Berserkers, and Barbarians creatures get +2/+2 and have haste.
this is coded
auto=lord(warrior) 2/2
auto=lord(berserker) 2/2
auto=lord(barbarian) 2/2
auto=lord(warrior) haste
auto=lord(berserker) haste
auto=lord(barbarian) haste
this is the real lovisa....
errattas are fine, but its wotc that made the mistake of creating this card in the first place :) if you hit gatherer i think you will agree...
http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=113542
following the actual card on this one...ditching the erratta.
* added Anowon, the Ruin Sage, the Ruin Sage as a borderline card since the card works as specified except that the player selects for the AI what card to sacrifice.
auto=maxplay(land)+1 opponent --- works!
[card]
name=Rites of Flourishing
auto=maxplay(land)+1 opponent
auto=maxplay(land)+1
auto=@each my draw:draw:1 controller
auto=@each opponent draw:draw:1 opponent
text=At the beginning of each player's draw step, that player draws an additional card. -- Each player may play an additional land on each of his or her turns.
mana={2}{G}
type=Enchantment
[/card]
- fixed issue 595 (MaxCast not working). Root cause was the stupidest typo ever in the code (maxCost instead of maxCast...)
- fixed an issue with Storm mentioned by zethfox (was counting only spells played by current player)
- Moved "max lands per turn" rule outside of the code (yay!) Please be sure to update your Rules folder!
but only by chance that the previous step set the current deck file. Used victory percentage
from the MetaData object rather than forcing what has already been computed.
TODO: getVictoryPercentage() needs to represent Overall VictoryPercentage for all decks, not just
player decks. AI Decks use getVictoryPercentage() to represent the VictoryPercentage against a
specific deck. There should be an additional method that says getVictoryPercentageVsDeck( deckObject )
- submit a fix for TestSuiteAI, I don't understand why it wasn't submitted with my other changes yesterday. This fixes a bug in the test suite (One storm test would fail without this)
- minor refactor to AI code
* getCardByName seemed to have a initialization error if you tried to use it before the entire game loaded. The cache would
throw an exception if you tried to use find and it was empty. I put a guard around it to avoid this issue.
* refactored Zeth's "toggledifficuly" feature to be stored in meta data. http://code.google.com/p/wagic/source/detail?r=3106
-- This is slightly modified as it forces a 1 for 1 swap of cards that are specified.
from the example given this is how it seemed to be used anyways.
-- since all the information is stored in the meta data, there's no need to alter the deck's
definition.
For some reason, the VS2008 compiler allows this illegal access and VS2010 does not. In all actuality it should never be permitted.
Please review the thread posted on the SVN thread for details as to why this needs a fix.
http://code.google.com/p/wagic/issues/detail?id=593&sort=-id
Issue: 593
- deprecated the following keywords (see list below for new usage)
-- cantcreaturecast => auto=maxCast(creature)0
-- cantspellcast => auto=maxCast(*)0
-- onlyonecast => auto=maxCast(*)1
-- bothcantcast => auto=maxCast(*)0 auto=maxCast(*)0 opponent
-- bothnocreature => auto=maxCast(creature)0 auto=maxCast(creature)0 opponent
-- oneboth => auto=maxCast(*)1 auto=maxCast(*)1 opponent
Strangely enough, I couldn't find most of these keywords in mtg.txt?
I also removed variables such as "spellCastedThisTurn" and stuff like that... now if you want to know how many spells were cast in one turn by a given player, use player->game->stack->seenThisTurn("*").
seenThisTurn can take a string representing a TargetChooser, or better, a TargetChooser.
I can't guarantee I didn't break anything, but the test suite passes and the AI seems to run ok
- added maxCast and maxPlay abilities, this deprecates the following abilities: nospells,nocreatures,onlyonespell,land
I usually don't like to deprecate abilities, but the existing ones, despite having easy to remember names, were really not flexible enough.
If you want to use these old keywords, instead use:
-- nospells => maxCast(*)0
-- onlyOneSpell => maxCast(*)1
--nocreatures => maxCast(creature)0
--land:1 => maxplay(land)+1
note maxPlay and maxCast. They follow similar rules, but maxPlay monitors the number of cards that are going on the Battlefield, while maxCast monitors the stack. In most cases, maxCast should be the one to use, but lands are a special case because they go directly to play.
I unfortunately cannot guarantee I didn't break anything, especially in the AI, but the test suite passes ,and I added a few additional tests yesterday and today, to feel more confident about the change.
next step is removing the creatures keywords that do the same kind of thing (cantcast, etc...) and replace them with maxCast
1. Fire Dragon(It has same problem as unchanged Honden Of Infinite Rage, using new code "type:" to fix it.)
auto=foreach(mountain|myBattlefield) damage:1 target(creature) oneshot
==>
auto=damage:type:mountain target(creature)
2. Burden of Greed
auto=foreach(artifact[tapped]|opponentBattlefield)damage:1
==>
auto=foreach(artifact[tapped]|opponentBattlefield) life:-1 opponent
- replaced variables canPutLandsIntoPlay and landsPlayerCanStillPlay with a PlayRestrictions class.
- Added seenThisTurn(TargetChooser * tc) in MTGGameZones, which allows to count how many cards matching a targetChooser have been in a given zone in the current turn. With minor work, this can probably be reused by the ability parser for some cards that need to count how many **** where played or put on the stack during a turn.
-- for example player->game->stack->seenThisTurn([put a TypeTargetChooser("creature") here]) would give you the number of creature spells cast by the player this turn.
- This is the first step of a refactor that aims at removing all the adhoc variables for "cant cast". I plan to get rid of the following variables in Player.h (and the associated code, which hopefully will become smaller):
int castedspellsthisturn;
bool onlyonecast;
int castcount;
bool nocreatureinstant;
bool nospellinstant;
bool onlyoneinstant;
bool castrestrictedcreature;
bool castrestrictedspell;
bool onlyoneboth;
bool bothrestrictedspell;
bool bothrestrictedcreature;
They will be replaced by the PlayRestrictions system, and hopefully I'll have time to update the parser to make this more generic as well.
My initial goal with this change was to move the limit of 1 land per turn outside of the code, and make it an external rule in Rules/mtg.txt. I have yet to do it.
draw:type:creature|opponentbattlefield
will draw a card for each creature on the opponents battlefield
this defualts to "|mybattlefield" however any target zone can be used, hand, library ect....
this will add support to some cards which werent possible with previous version of it, without having to create new word variables to do the same exact thing as can now be done with this.
moved it out of rules, it was FAR to error prone and after fixing bugs on this ability about 12 times, im done with it.
noticed yesterday that it was removing the completely wrong amounts, and not maintaining its cost AT ALL. so i got sick of adjusting it as a rule, its now a statebased effect, called through gamestatebasedeffect as a side function.
the new affinity is less then 100 lines of code, down from 300. to acomplish the effect with FAR less effort. it is also FAR easier to maintain in the future if i die or leave the scene or whatever.
added a new count tool for MTGGameZones canByCanTarget...which allows for returns of amounts based on if it can be targetted by a tc. much like how listmaintainer does it. affinitygreencreature will not be the only ability to use this function, just a heads up. its just the first to do so.
hopefully this much more accurate affinity will be the last version...considering adding the other types which old affinity couldnt handle :D
it is a feature that is for ai deck building
what it will do is as follows
#NAME:sample deck
#DESC:The forces of fire and nature unite.
#DESC:
#DESC:Can you withstand
#DESC:their combined fervor?
toggledifficulty:lotus petal|black lotus (*) * 4
grizzly bear (*) * 4
someCard (8) *4
notice the toggle dificulty?
syntax is ....toggledifficulty:easy card name or number|hard card (optional set if both belong to same set otheriwse use * ) *howmany
toggledifficulty:frying pan|machine gun
toggledifficulty:tomatoe|pumpkin (MBS) * 3
toggledifficulty:tomatoe|squash
grizzly bear (*) * 4
the above exsample as easy will have a deck with:
frying pan
4X tomatoe
4X grizzly bear
and on hard it will have:
machine gun
3x pumpkin
squash
4X grizzly bears
the entire deck can be built with toggledifficulty cards....its not limited to just a single use.
you can also mix it up, some can be toggledifficulty some can be just like normal, you are not limited to having to have a complete deck of toggled cards...
if your currently selected deck has an over all win ratio of 65% or higher...this deck will have 4 black lotuses in it...if youre overall win with the current deck you are playing is below 65% then those 4 black lotuses are replaced by 4 lotus petals instead...effectively making it an easier ai deck...
note, the 2 cards used are exsamples...its a great way to show you the potential this change can have...an ai deck with 4 black lotuses will do WAY better then the same deck with 4 lotus petal...if you catch my drift...
stats generation. No data needs to be written to the deck master files themselves.
Now the mana colors will only show if you have battled with a particular deck at least once.
This is not retroactive, so you will need to battle the ai again. This can not be edited manually
either to prevent tampering with the statistical data. Player deck mana color display is also
covered this way.
Decks will still be saved in the new layout if a disk write is necessary. So any changes via
the deck editor will result in a deck file rewrite is was always the case.:)
- minor cleanup of MTGRules.cpp based on my comments in r3084. I visually verified that I didn't break the fix in r3084. Also ran the test suite.
-- in case somebody wonders about some of the tests I deleted, most of these tests are useless because all callers make sure alternateCost is not null (in isReactingToClick) and that the manapool can afford the cost, before doing the call to reacttoclick. Proving it by adding an assert, and also making the function protected, to be sure it is only called by the authorized children.
New code for Paralyze uses "teach(...)":
[card]
name=Paralyze
target=creature
auto=tap
auto=doesnotuntap
auto=teach(creature) {4}:untap myUpkeepOnly
text=Enchant creature -- When Paralyze enters the battlefield, tap enchanted creature. -- Enchanted creature doesn't untap during its controller's untap step. -- At the beginning of the upkeep of enchanted creature's controller, that player may pay {4}. If he or she does, untap the creature.
mana={B}
type=Enchantment
subtype=Aura
[/card]
it strings exactly like normal counters did, except now after the name you can add yet another "," and a number or word varible...if you will not have a name it is still required that you add the extra comma, as it is a seperator for the parser. so clock works swarm would be counter(1/0,1,,4)...no matter what, this ability will do nothing if the amount of the target counter is already higher then the max allowed, in this case 4...other effects can give the creature more counters...however..this ability will resolve to nothing if youve exceeded the limit. until you are under the amount again.
as it removed ais ability to momir...protip in MTG youre not allowed to interrupt your own abilities...the way momir is working now, it select an action that doesnt pass priority instead it instantly searchs for a momir ability...which is wrong...
the difference between vainshing and fading is...
fading sac triggers the NEXT time you try to remove a fade counter but cant, vanishing sac triggers WHEN you remove the last counter.
- Added method to build a card collection independently of the GUI to ease my unitary test application
- Added part of some network GUI I'm working on, it's #ifdef out, I'm only committing this part to ease later merges
- Added the beginning of a serialization code of the Player and related classes used for network support
- various other minor cleanup
general tip on getting ai to use an ability on a card.
titan forge for exsample
[card]
name=Titan Forge
auto={3}{T}:counter(0/0,1,Charge)
auto={T}{C(0/0,-3,Charge)}:token(Golem,Artifact Creature Golem,9/9)
text={3},{T}: Put a charge counter on Titan Forge. -- {T}, Remove three charge counters from Titan Forge: Put a 9/9 colorless Golem artifact creature token onto the
battlefield.
mana={3}
type=Artifact
[/card]
with the counter ability above the counter cost ability, ai will rarely ever use the titan forge to make a token.
however if you change the order around, ai will see the token ability first...then if it can afford it then it will make a token.
reason for this change is that it becames WAY to hard to player decks which contained mostly artifacts to share the feild, give 9 cards half the screen to display just didnt seem like a good choice compared to the creatures horizontal stack which can display almost 200 cards in the same screen width.
- added some cache for function getCardByName. On my machine, this divides the running time of the test suite by almost 2 (now runs in 12 minutes instead of 21)
* added additional meta data for decks when saving them back to file.
- decks saved this way now are split into three regions: creatures, spells and lands. It's more for a visual sorting if a
player wanted to look at the deck outside of the game. It does not impact the deck loading negatively at all. It may
increase performance in cases where the deck was previously defined using the canonical names of the cards as the numeric ids
reduce the work done when looking up the cards by name.
* modified ManaCost toString method.
* added toString method for ManaCostHybrid ( possibly make ManaCostHybrid a subclass of ManaCost)
* added additional operator overloading for ManaCost for printing to cover ManaCost when it's a pointer as well as a copy
( TODO: might want to check if making usage of ManaCost as a copy as opposed to a ptr is really necessary in most cases. )
* added alternate version of "trim" to handle trimming temporary strings as returned by things like ostringstream.str().
- This was necessary since the PSP compiler doesn't do the necessary adjustments for those types of calls.
2 fix for token creator livingweapons...this was actually a preexisting bug, but not noticed becuase these are the first equipments that use token gen...when equipping it would readd the oneshot tok gen as an activated ability with no cost...generally we dont want to pass oneshot token generation to another card by equipping...
and 3rd...
got rid of the disgusting vanishing workaround.
it was riddled with bugs, got exsample if the creatures would gain indestructible the -99/-99 they were reciving did nothing to rid the battlefield of the creature...
new vanishing is
auto=vanishing:number
thats it, no crazy 2 trigger lines with lords ect...
Word of Seizing
Wipe Away
Take Possession
Sulfur Elemental
Sudden Shock
Sudden Death
Stonewood Invocation
Krosan Grip
Extirpate
Celestial Crusader
Kaijin of the Vanishing Touch
Crushing Pain
Fatal Blow
Final-Sting Faerie
Opportunist
Witch's Mist
Reciprocate
Retaliation
Giltspire Avenger
doc might find more uses for it then i, just thought i would code some cards to go in with it.
note:pregamebooster failing again...whoever keeps adding new tokens to the card.dat please refrain from doing so as it is breaking a test in test suite...
this(damaged)
added
targetchooser [damaged] status
added
targetchooser [controllerdamager]
targetchooser [opponentdamager]
basically checks for whos doing damage to who in a match per turn.
text=First strike. -- Deathtouch. -- Whenever a creature an opponent controls is put into a graveyard from the battlefield, you may return target artifact card from your graveyard to your hand.
==>
text=Flying, haste -- {1}{R}: Hellkite Igniter gets +X/+0 until end of turn, where X is the number of
artifacts you control.
2nd change is a bug fix, i noticed that cards which were mana producers which contained a cost but did not contain a {t}: would still tap at first i thought this was graphical, however after further reveiw i noticed that the card was indeed truely tapping...this was happening becuase amaproducer had a defualt of 1 for doTap/tap...and since genericactived ability does not go through the motions of setting the true manaproducers "doTap" which can be witnessed by stepping through the processes...it was defualting to a tap, even tho the cost might have just be {1}:add{ ....
This btw points out another circular dependancy between the texture and the JQuad - a texture owns a bunch of JQuads, yet the renderer uses JQuads and always assumes that the texture is valid. We're going to need to add more defensiveness to JGE to protect against this.
Other changes in this check-in: WResourceManager doesn't derive from JResourceManager anymore. It actually didn't require anything from the base, so I killed the dependency. Also cleaned up the notion of a WTrackedQuad in the WCachedResource - it didn't need a separate class, just a better container.
I've build this & tested against PSP, win, linux, QT (linux). I haven't tried against iOS and QT Win, or Maemo. If these other platforms are broken, I apologize in advance! - I'm hoping it should be fairly simple to put them back into play.
* since I rescaled the images down to 50%, I moved the display to the upper right
info box on the last line to the right of the "# of games played" information.
Things look like it will fit as long as the number of games is under 1000
1. Black Sun's Zenith
2. Blightwidow
3. Spiraling Duelist
4. Sword of the Meek
5. Vedalken Anatomist
6. White Sun's Zenith
7. Fixed Battle cry of following cards:
Accorder Paladin
Goblin Wardriver
Kuldotha Ringleader
Loxodon Partisan
Signal Pest
Hero of Bladehold
Hero of Oxida Ridge
Victory's Herald
deck files in long format. This is not configurable from the game. It must be set manually
inside options.txt.
ie. saveDetailedDeckInfo=1
* added extra debug information (line number inside text file) when card parser fails to recognize a line.
- modified return value from "processConfLine()" to return 0 only when a true error occurs and print out
"MTGDeck: Bad Line:
[<line no>]: <line with error>"
- processConfLine will now return 1 for lines starting with "#". Previously it returned 0 which is incorrect
as comments should not be considered as errors.
* removed DeckMetaDataList class from code. This was duplicating the DeckMetaData storage in DeckManager
* new feature for deck selection screens.
- player decks will now have an indication of what mana color it consists of.
- Ai decks will show symbols once the player has played against the AI deck at least once.
-- This is made possible with a new meta data inside each deck file.
MANA:<string representing color switches - 0/1 >
This still could be improved - DeckMetaData's constructor loads an MTGDeck object to parse out the name of a deck from its file. This means that we crack open 106 files on the first attempt to show the list of opponent decks. I started optimizing this, but reverted, as the list itself is sorted alphabetically. Currently, with these mods, it's still taking 4 1/2 seconds on my psp to load the opponent list on the first go around.
While at it, did some cleanup - removed the need for passing around a player pointer in some of the DeckStat functions, etc.
name=Contested Warzone
==>
name=Contested War Zone
text={T}: Add {1} to your mana pool. -- {1}: Inkmoth Nexus becomes a 1/1 Blinkmoth artifact creature with flying and infect until end of turn. It's still a land.
==>
text=Whenever a creature deals combat damage to you, that creature's controller gains control of Contested War Zone. -- {T}: Add {1} to your mana pool. -- {1}, {T}: Attacking creatures get +1/+0 until end of turn.
In MBS cards:
primitive=Contested Warzone
==>
primitive=Contested War Zone
[card]
primitive=Spine of Ish Sah
id=214069
rarity=R
[/card]
==>
[card]
primitive=Spine of Ish Sah
id=214076
rarity=R
[/card]
reworked the handling of new target...auras and equipments can not be treated the same...doing so allowed the player to then use the equip function of the card and gain a double bonus. now i call directly on the equip function to do the equiping so that it works with its own function to add the effects. keeping a person from gaining double bonus.
auto={1}:aslongas(Sword of Kaldra|mybattlefield) aslongas(Shield of Kaldra|mybattlefield):token(-47449)
==>
auto=aslongas(Sword of Kaldra|mybattlefield)aslongas(Shield of Kaldra|mybattlefield)aslongas(Helm of
Kaldra|mybattlefield) {1}:token(-47449)
Deleted id=-47449 of Kaldra token to make its card image show up.
text=@attacking(creature|myBattlefield):sacrifice
==>
auto=@attacking(creature|myBattlefield):sacrifice
text=Creatures and lands you control have shroud. (They can't be the targets of spells or abilities.) -- When a creature you control attacks, sacrifice Spiritual Asylum.
[card]
name=Maelstrom Pulse
target=*[-land]
auto=all(*[share!name!]) destroy
text=Destroy target nonland permanent and all other permanents with the same name as that permanent.
mana={1}{B}{G}
type=Sorcery
[/card]
Card list --> First comment
for "this card cant be the target of green spells or abilities" style cards.
added poisoned status trigger for attacking, so far its the only place this is checked. we will see what the next set does with this keyword
encapsulated as a player function rather than loose code inside the state transitions of GameStateDuel
Note: Inside of the mulligan code I assigned game to currentPlayerZones for clarification rather than
something functionally required. "game" seems ambiguous as "game" is also referenced throughout the code for the GameObserver
keeping this change localized to this method until more analysis can be done. The pattern that was here before was
game->currentPlayer->game
where the first "game" represented the GameObserver and the second the collection of zones (MTPPlayerCards) to the current player.
I would suggest changing the Player instance of game to something that represents its data, the game zones associated to the current player.
"game" seems too generic, as it can be interpreted to encompass many things rather than just dealing with the different zones (library, exile, discard, etc )
I'll also note that the mods I did to getDeckMetaDataById() are completely unnecessary - pragmatically speaking, it's doing the same thing. The only difference is that I'm using std::find_if instead of brute iterator manipulation, and I'm using a predicate function. For a simple check like this, it's kind of pointless, but if you need to do more complex comparisons, predicate operators can become quite powerful.
This change makes use of caching the DeckStats and DeckStatsWrappers into singleton caches that
get flushed when you quit the game. The initial load time will be significant as lazy loading has not
been coded yet for the ai decks.
TODO: lazy load the player and ai decks as they appear on the screen. Currently, each screen loads
all decks.
- removing the daily build folder. They take too much space in the repository. If you do daily builds, please use the "download" section of the google code page, or update the build to some server (megaupload or your own server), and post it on the forum. Thanks
saprolings conflict i have not fixed -1924 is saproling, tho i explictly remember replacing all these with token(Saproling,creature saproling,1/1,green) not sure who changed them back, the others are indeed due to incoding.
2nd, started laying some ground work for planeswalkers.
added the planeswalker rule, as per mtg rules, if you have a type=planeswalker subtype=jace already on the battlefield, both are sent to the graveyard. so you can not have a jace mind scuptor and a jace beleren out at the same time. i choose to use subtype= and type= rather then adding another variable to MTGCard...
also, added GuiPlay positioning for planeswalker,
i think theres been a HUGE misunderstanding about planeswalkers which has most going "battlefield is too crowded where would be put them...easy...slap them at the end of the lands ..done...theyre not creatures or artifacts/enchantments..so i moved them to the colum with the lands and have guiplay slap them at the end of that colum...btw this is in no means final...if someone can think of a better solution be my guest, but looking at the planeswalker (workaround) thread, its pretty obvious that no one will care where we slap the planeswalkers, as long as theyre supported. planeswalkers have alot more ground to cover...
Add Skeleton token for Drudge Spell in HML. _cards.dat:
[card]
primitive=Skeleton
id=-2915
rarity=T
[/card]
2. Fixed the Liege of the Pit according MTG rules.
3. Removed "丒" in following cards' text:
Eternity Vessel
Grizzly Fate
Ior Ruin Expedition
Sunspring Expedition
Ulasht, the Hate Seed
Umezawa's Jitte
4. Removed "?" in following cards' text:
Argent Sphinx
Kuldotha Phoenix
Playable Highlights are:
Psychatog
Grim Lavamancer
Anurid Brushhopper
Flameblast
Thwart
Baron Sengir
Sengir Vampire
Stuffy Doll
Undiscovered Paradise
Gush
Heritage Druid
Mageta the Lion
Faceless Butcher
Mesmeric Fiend
Oblivion Ring
Parallax Wave
Knight of the White Orchid
Contagion
80 creatures with Morph (Exalted Angel,etc.)
Added 27 tests.
Card list -> see comments. The list is separated into the single card groups.
tho no ticket was open for it using such combinations actually ADDED counters to a card instead of removing them.
this is because in the clone of the cost, the counters original nb was never set into the clones...so it was set to the defualt nb which was 1.
added new card discriptor [share!variable!]
the variables for this so far are
name <---eradicate effect targetting
color <--radiance effect targetting
types <--the plague cycles
it is important to note that a target IS REQUIRED before this, meaning it has to be used below a target= or after the targetting of an && ability...otherwise it will simply default to the source cards variables.
this solution provides a much more generic version without sacrificing the effectiveness of the eradicate set which was limited only to eradicate style cards(which ALSO required a target)
coding exsample
[card]
name=Eradicate
target=creature[-black]
auto=all(*[share!name!]|targetcontrollerhand) moveto(exile)
auto=all(*[share!name!]|targetcontrollerlibrary) moveto(exile)
auto=all(*[share!name!]|targetcontrollergraveyard)moveto(exile)
auto=all(*[share!name!]|targetcontrollerbattlefield) moveto(exile)
mana={2}{b}{b}
type=sorcery
[/card]
you will notice something strange above, for this change to work i had to fix the bug with "targetcontrollerBLAH" zone targetting...tho my fix was a patchwork fix, it does indeed provide the targets controller...we need to find the root cause of why initToZone is not returning the correct "target" variable to this function.
if the source does not have a target it defaults to source.
before it there was no target, which there never is a correct target returned as noted by the fact that 0 cards exist with targetcontroller zone targetting in WAGIC however theres a considerably large card pool for this.
enjoy :)
docs going to kill me for this lol.
- changed "putInPlay" to return "NULL" if the card cannot be found in the "from" zone. The behavior of the function before that prevented to see that we broke the "alternate" cost feature (see test Vine Dryad)
- Fixed some memory leaks introduced in r2922
also forgot to mention in my big patch
i added a new test suite tool, its a goto command
if you start on draw and want to get to second main,
goto secondmain
instead of
next
next
next
next
next
"next" is still valid and still needed
you can not for exsample
goto attackers
if you are ALREADY currently in "attackers" so if you wanted to go from YOUR attackers to opponents attackers
from draw step
goto attackers
next
goto attackers
this replaces about 12 "next" commands which would have been needed in preivous test suite.
ok i WAS going to write a full change log with code exsamples ect, but since im rushed you will get the short version of this log.
first bug fixes, and there were many,
indestructible creature bug fixed
halimar execavator *embearessing youtube video" bug is fixed
token text now displays source name and tokens abilities
fixed a card view null pointer in an iterator when code used combinations of foreach and aslongas with CD.
epic struggle bug fixed, aslongas was only parsing one space to the right of the operator.
extra cost containing targetting fixed, cards can now have multiple extra cost in all mana...this includes giving a card 2 targeted sacrifices as its main cost.
angelic chorus bug fixed, the card will be soft coded now.
and many other minor bugs fixed, hard to remember all which were fixed.
now, new abilities = words
"legendarylandwalk",
"desertlandwalk",
"snowforestlandwalk",
"snowplainslandwalk",
"snowmountainlandwalk",
"snowislandlandwalk",
"snowswamplandwalk",
"snowlandwalk",
"nonbasiclandwalk",
"strong",//cant be blocked by creature with less power
"weak",//cant block creatures with more power
"phasing",
all true landwalks will now be supported.
new cost types:
morph which is coded as follows
[card]
name=Bloodstoke Howler
facedown={3}
autofacedown={6}{R}:morph
autofaceup=3/0 all(beast|mybattlefield))
text=Morph {6}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -- When Bloodstoke Howler is turned
face up, Beast creatures you control get +3/+0 until end of turn.
mana={5}{R}
type=Creature
subtype=Beast
power=3
toughness=4
[/card]
you will notice new auto lines autofaceup and autofacedown
these are abilities the cards will have when theyre in that state.
the cost is coded as
facedown={cost}
when a card is faced up it gains auto= lines also.
tho is played normally it will NOT gain autofaceup=lines
card restrictions:
cards can now have restrictions placed on them the restrictions are.
all previous restrictions usable in activated abilities
with the follow additions
control two or more vampires
control less creatures
control snow land
casted a spell
one of a kind
fourth turn
before battle damage
after battle
during battle
[card]
name=Blood Frenzy
target=creature[attacking;blocking]
restriction=before battle damage
auto=4/0
auto=treason
text=Cast Blood Frenzy only before the combat damage step. -- Target attacking or blocking creature gets +4/+0 until end of turn. Destroy that creature
at the beginning of the next end step.
mana={1}{R}
type=Instant
[/card]
other cost now can have specail restrictions also:
otherrestriction=mytypemin:1 type(swamp),opponenttypemin:1 opponenttype(plains)
these are minimums required inplay of a type
it can be just you, or you and opponent or just opponent
you can also use the words "more" and "less" and * to compare the 2 players fields.
[card]
name=Cho-Arrim Legate
abilities=protection from black
other={0}
otherrestriction=mytypemin:1 type(swamp) , opponenttypemin:1 opponenttype(plains)
text=Protection from black -- If an opponent controls a Swamp and you control a Plains, you may cast Cho-Arrim Legate without paying its mana cost.
mana={2}{W}
type=Creature
subtype=Human Soldier
power=1
toughness=2
[/card]
activated ability gained a new restriction "opponentturnonly"
variables will now be recalculated during the resolve of the major abilities to produce the most current number.
{x}:draw:x <----
new number variables words:
using draw as an exsample
draw:auras <--auras on a creature
draw:type:ally <---counts the allys in your field. self explanitory
draw:thatmuch <--mostly a triggered effects number.
when you take damage draw that much
draw:lifelost
draw:oplifelost
these return the value of the life lost that turn.
new TRIGGER restricitions
sourcenottap
sourceTap
foelostthree<--card cycle uses opponent lost life
foelosttwo<--same as above
once<--this trigger will only ever trigger one time and never again.
new card discriptor words
[multicolor]
[leveler]
[enchanted]
[blackandgreen]
[blackandwhite]
[redandblue]
[blueandgreen]
[redandwhite]
CD will now recalculate the number again on resolve
meaning {x}:target(CreatureTargetChooser[manacost <=x]) will work, with an added bonus {x}:target(CreatureTargetChooser[manacost <=any word variable])
new this(:
this(tapped)<--for strange case cards.
this(untapped)
this(auras)
new MTGAbility keywords
(blink)
(blink)forsrc <--stay blinked while source inplay
hand(blink <---adding hand to the front makes it target hand.
livingweapon
this is an extension of token, simple attach the words "livingweapon" to the front of token( and it will autoamtically token that and attach the card to it.
token( gained:
"targetcontroller" targetting.
"battleready" if put in the tokens abilities it will be a attacker and tapped as it is entering play.
phaseout <--self explanitory
spiritlink <--stacking lifelink style effect that benifits the OWNER of the card.
combatspiritlink same as above.
stacking flanking, requires 2 abilities unfortunately
[card]
name=Agility
target=creature
auto=teach(creature) flanker
auto=teach(creature) flanking
text=Enchant creature -- Enchanted creature gets +1/+1 and has flanking. (Whenever a creature without flanking blocks this creature, the blocking
creature gets -1/-1 until end of turn.)
mana={1}{R}
type=Enchantment
subtype=Aura
[/card]
removeallcounters(number/number,name)
removes all counters of the type from a card, can all be
"all"
vampire hexmage effect.
added new tools for transforms
,setpower=number
,settoughness=number
removetypes
morph
autofacedown={0}:morph
eradicate <---same as the card name.
cumulativeupcost[ <--self explanitory
upcostmulti[ <--an upcost that will resolve with a && ability
phaseaction[ phase name ] ability
an ability that will trigger on the stated phase name.
also support for phaseactionmulti[
new triggers added:
@vampired( <--sengir vampire effect
@targeted(
@lifeloss(
@lifed(
add a special ability builder called dynamicability
it acts alot like a choose your own adventure book
dynamicability<! variable 1, variable 2, variable 3,variable 4!> optional ability targetting the original target.
variable list 1:
this is the primary amount source
source
mytgt
myself
myfoe
variable list 2:
this is the variable we're after, or the amount
power
toughness
manacost
colors
age
charge
oneonecounters
thatmuch
variable list 3:
this is the main effect
strike
draw
lifeloss
lifegain
pumppow
pumptough
pumpboth
deplete
countersoneone
variable list 4:
how it will do this effect to.
itself
eachother
targetcontroller
targetopponent
tosrc
srccontroller
srcopponent
the best way to explain its usage is to look at cards coded with this ability. or experiment with combinations.
new gameoption
First turn player:player, opponent, random
who takes the first turn
added poisoned status, tho not complete since MBS hasnt spoiled enough cards to see where this variable will be used.
taught ai how to counter spell
improved ai, it will now cast instants during interupts and during your turn.
previously ai treated instant cards the same as it treated sorceries, which was not fair to the ai.
im sure there is some messed items, but the rev directly before this one had formatting in the code that created hundreds of conflicts with this one, so i had to dig this info out of red and green sections.
cards and test are coming soon, i ask PLEASE do not alter these new additions until the test are commited.
im commiting without the test because instead of allowing me to proceed with my beta test period, there are some that wish to rush me into a commit. if you do not like this commit revert it, i absolutely on no grounds give permission to recommit afterwards. and i will not recommit if a revert is called.
finishing up my reformatting of the source from November/December following the guidelines that were posted.
some extra things I added:
* Any empty virtual declarations were kept to one line.
* Enums were split up into separate lines to promote uniformity across all headers. ( each header file had a different style for enums)
- refactor of MTGRules.cpp (buyback/flashback/retrace/alternative).
This change has been reviewed by myself, Wil, and Mike. The test suite passes.
More cleanup can be done, I will work on that later on.
(Erwan, pls give this a sanity check for me).
Nice side effect: running the signed version seems to clear up a crash I'd get when putting my psp into sleep mode in the middle of a match.
- Adds code to support TapAndHold gesture, it does not seem to work with
the N900, but it works fine on Linux.
- Removed code checking opengl version as it's no more needed.
I also tweaked slightly the psp icons to center the symbols, as they were too much to the right. (Be sure to copy the updated graphics/iconspsp.png to your Res folder.)
1. Fodder Launch
2. Knight Token from Waylay
3. Sword of Kaldra
4. Thelon of Havenwood
Changed following cards which can produce multiple kinds of tokens to make them display token images correctly:
1. Bestial Menace(WWK)
2. Decree of Justice(SCG)
3. Fable of Wolf and Owl(EVE)
4. One Dozen Eyes(MRD)
5. Sarpadian Empires, Vol. VII(TSP)
6. Wand of the Elements(DST)
7. Wurmcoil Engine(SOM)
Added the following token in their _cards.dat:
1. DST (Wand of the Elements):
Blue Elemental Token(id=-4977511)
Red Elemental Token(id=-4977512)
2. EVE (Fable of Wolf and Owl):
Green Wolf Token(id=-15208711)
Blue Bird Token(id=-15208712)
3. MRD (One Dozen Eyes):
Beast Token(id=-4838511)
Insect Token(id=-4838512)
4. SCG (Decree of Justice):
Angel Token(id=-4514111)
Soldier Token(id=-4514112)
5. SOM (Wurmcoil Engine):
Wurm Token with Deathtouch(id=-20787511)
Wurm Token with Lifelink(id=-20787512)
6. TSP (Sarpadian Empires, Vol. VII):
Citizen Token(id=-11492111)
Camarid Token(id=-11492112)
Thrull Token(id=-11492113)
Goblin Token(id=-11492114)
Saproling Token(id=-11492115)
7. WWK (Bestial Menace):
Snake Token(id=-19784311)
Wolf Token(id=-19784312)
Elephant Token(id=-19784313)
You also need abrasax's image set and rename or add following tokens' pictures:
1. DST (Wand of the Elements):
Blue Elemental Token: Rename to 4977511t
Red Elemental Token: Rename to 4977512t
2. EVE (Fable of Wolf and Owl):
Green Wolf Token: Rename to 15208711t
Blue Bird Token: Rename to 15208712t
3. MRD (One Dozen Eyes):
Beast Token: Rename to 4838511t
Insect Token: Rename to 4838512t
4. SCG (Decree of Justice):
Angel Token: Rename to 4514111t
Soldier Token: Rename to 4514112t
5. SOM (Wurmcoil Engine):
Wurm Token with Deathtouch: Rename to 20787511t
Wurm Token with Lifelink: Rename to 20787512t
6. TSP (Sarpadian Empires, Vol. VII):
Citizen Token: Rename to 11492111t
Camarid Token: Rename to 11492112t
Thrull Token: Rename to 11492113t
Goblin Token: Rename to 11492114t
Saproling Token: Rename to 11492115t
7. WWK (Bestial Menace):
Snake Token: Rename to 19784311t
Wolf Token: Rename to 19784312t
Elephant Token: Rename to 19784313t
This was a bug reported by a guy in the forum: Dakr Depths produced a token every time it hit the graveyard, even it it had a counter on it. ^^
[card]
name=Dark Depths
auto=counter(0/0,10,Ice)
auto={3}:(counter(0/0,-1,Ice) all(this) && bury all(dark depths[-counter{0/0.1.Ice}])
auto=@movedTo(mygraveyard) from(dark depths[-counter{0/0.1.Ice}]|myBattlefield):token(Marit Lage,legendary creature avatar, 20/20,flying,indestructible,black)
text=Dark Depths enters the battlefield with ten ice counters on it. -- {3}: Remove an ice counter from Dark Depths. -- When Dark Depths has no ice counters on it, sacrifice it. If you do, put a legendary 20/20 black Avatar creature token with flying and "This creature is indestructible" named Marit Lage onto the battlefield.
type=Legendary Snow Land
[/card]
1. General's Kabuto
2. Lightning Greaves
3. Neurok Stealthsuit
4. Whispersilk Cloak
5. Darksteel Garrison
6. Shield of Kaldra
Fixed following cards according MTG rules:
1. Lord of the Pit
2. That Which Was Taken
3. Vigor
4. Worldslayer
5. Yomiji, Who Bars the Way
Other fixed cards:
1. Magebane Armor
2. Talon of Pain
While at it, moved the string arrays to be global const declarations - there were two duplicate sets of keywords for lords, and they were being created/destroyed on each call to parseMagicLine. No point in constantly reallocating these strings, we know we're going to contantly reuse them.
2nd, added a block out for optimizedhand in demo mode, ie any time its cpu player vs cpu player, noticed demo was starting matches with no cards.
3rd, added a hackish workaround to allow Ai to get eff returns on abilities using the all(this) lord workaround to target the source. Ai was not getting any returns on these abilities. now basically if the ability is a lord && !target...lets calculate this as tho source == target....
This is a classic example of why naked pointers suck! The right way to fix an interdependency would be to have these objects hold onto weak references to each other. But that's way too big a change at this point in time, so I've added this ugly hack instead.
This will fix an intermittent crash when either accessing the library or exiting a match.
changed conditional for lord and thises evaluation from hardcoded value to length of the array being evaluated. This doesn't change current functionality, but minimizes code change if these arrays were ever to change in size.
The core problem I fixed was in CardView's (missing) destructor - on construction, a CardView will set itself as a member of its parent CardInstance, so it stands to reason that when it's about to be destroyed, it should do the inverse and remove itself in the same fashion from its parent. This explains why weird graphic glitches were seen when casting Animate Dead on cards in a graveyard - the position data it was trying to use was already deleted from memory (a cardview is deleted on cleanup at the end of a turn if it's gone to the graveyard), but no one nulled out the deleted card view reference from the instance, so we'd access invalid data.
Some peripheral changes in this checkin: two helper functions in CardGui (GetCenterX, GetCenterY) that are part of my navigation patch are included. They're unused in the current code base, so this has zero impact. (I'm only checking them in as it's more work than it's worth to refactor them into a separate changelist. The core of the nav patch requires my mods to Closest.cpp / CardSelector.cpp to have any effect.) I also included a helper function in the debug routines to spit out hex pointer addresses in trace outputs, which I used to chase down this bug.
Note this particular aspect of the "becomes" ability was not broken prior to the fix for 559. This is a sanity check as it has nothing to do with color change. but tests ability changes due to "becomes" ability.
Issue: 559
i hope to have a polished cleric Ai deck for release 14.1 within the next day or so. trying to include a couple decks that take adventage of all this great training.
hopefully i can get prevent working as good as equip does...the Ai deck i constructed called
"the kor" is almost an unbeatable white weenie deck.
ok here goes, first, fixed a crash that would happen when ever a player would gain more then 2000 life or take more then 2000 damage...the buffer was becoming corrupted i imagine because it was too small, increasing it to 10 slots allowed players to successfully take massive amounts of damage, highest i bothered checking was about 35k gained/lost, no crash...
2nd, removed the and refactored cantcaster rule, moved it to stateEffects() and renamed stateeffects to better reflect what it will be handling,
removed sneak attack rule and moved it into stateeffects
the following ints have been converted into bool,
all the cantcasters, canputlandsintoplay is becoming a bool, the amount of lands you can play is now handled by a new varible int landsPlayerCanStillPlay (this is for my ability additional lands increase in support on perminents coming after the release)
the changes to bools were for an obvious reason, they were all ints pretending to be bools, my varibles were confusing as you would often see code like this if(cantblahblah > 0)
which to another coder might not make any sense.
these varible ints were returning 0 as false and 1 as true...changed them all to bools, same goes for putlandsinplay int, in half the places it was being used as a bool, AND it was tracking the amount, when i was coding additional land ability, this made it impossible to maintain correct amounts without damaging the rest of the code.
as a bool, controlled by stateeffects, it can now be used correctly as a bool in all cases, and the stateEffects manages the switch on it to false if you no longer have any landsPlayerCanStillPlay left.
the refactor on cantcaster was also a bug fix, it was reported to me that cantcasters were not correctly working, sometimes ai or player would still be allowed to play a card with one in play, because of the old way i had it setup somecases of bothcantcaster were reseting the cantcast to 0, basically making the check do nothing.
it is now handled in stateeffects if you have one in play, then its true, if not then false...this returns very accurate tracking of the cards instantly instead of checking as cards enter or left play.
the "both" versions now have their own bools to avoid future conflicts with the single player cantcast...
added a case for the fancy moving text, some move to library effects were incorrectly returing fetch.
- computeActions would leak a ManaCost. This was fairly minor.
- AIPlayer::SelectAbility had a major leak. Basically, there's some code that pulls a random number for an efficiency check - if the action's efficiency value was below that random number, the action pointer was cleared, and none of the actions that were to be discarded would be deleted out of the rankings map. I've switched out the rankings container to not contain action pointers, but real action objects, so regardless what kind of logic is implemented, the map will properly clear out its objects upon destruction.
someone just forgot that both cases need to check if the interupt decision is 2 before changing it back to 0 (interupt) btw, once a stack is ready any NEW stack actions added, such as Ai interrupting your choice to not interrupt you will see the new stack actions to either cancel manuelly or "no to all"
sorry its not a bug fix for crashes! im really not skilled enough yet to fix the kinds of crashes were having.
-Attempt at fixing issue 538. This is a wild guess, but basically 1 000 000 bytes is NOT enough to decompress a 512*512*4 texture (32bits png). We need at least 1MB (1024*1024) AND some additional space for the decompression process. Based on that, bumped the 1 000 000 (minimum contiguous ram necessary to start decompressing a picture) to 1 500 000. I've had pretty good results so far but this needs confirmation
- GameObserver <- changes from Win to *nix carriage returns.
another issue i fixed, when last trigger would be resolving in "trigger" substep, the game was moving to next combatstep before you could finish it, NOW the game correctly finishes resolving any triggers that might have fired off in "Triggers" substep, THEN it adds combatdamage step to the stack. this also fixes an issue where if you were multiblocked and combattriggers fired off, then your trigger would be UNDER the "ordering window" and unresolvable.
added waitingforanwsers return to userRequestNextGamePhase
when youre "waiting for anwsers" that means you have a menu box open and the game is waiting for you to decide....this was one of the causes of the rush to combat damage while youre still selecting something on a menu.
moved Trigger step call to requestnextgamephase into stateEffects() and out of updates, works MUCH better this way. i wonder why this isnt handling more of the automated functions, i suggest we consider moving the autopassphase into stateEffects() also as it will most likely be handled much better in there then in the update function.
also,
adjust Ailessons on Adrawer, it was still getting a little too excited about drawing cards.
moved around the eff setting on grantingability lessons.
having it set to 0 BEFORE actually giving it a value was conter productive.
added a peice of commented out code in "isintop" function that if you uncomment will allow you to have Ai ALWAYS multiblock you.
im pushing this in as i feel comfortable with the positives and havent really come across an adverse effect yet.
however i am just one person and testing something like this is much easier with alot more then 1 person on it.
exsample, 3 unresolved stack actions. with interrupt set to 5 secs, will allot you 15 secs to decide the first action, then 10 secs to decide the 2nd action, then 5 secs to decide the last action.
note: its multiplicative, this does not make each stack action into 15 sec interrupt.
as they resolve "extraTime" gets recalculated.
This one was a bit of a doozy to fix correctly, but the actual fix ended up being fairly simple - the upshot is that TargetAbility never checked for whether an extra cost needed setting prior doing a target selection. While at it, I discovered and fixed another bug: if you're in the middle of an extra cost choice (like sacrifice, for instance) and hit the next phase button, the game would let you proceed, and then hang in an endless loop.
While at it, did a little cleanup/refactoring around GameObserver's waitForExtraPayment - any time a bool has something that sounds like a verb, it probably deserves to be a function. Now it is. (I needed to refactor it anyway, as I reused that code for the next phase hang.)
Note that after this fix, I had to patch two test cases (siege_gang_commander.txt & seismic_assault.txt) - since I've change the selection order (ie a target ability with a sacrifice cost requires the cost to be paid up front before picking the target), this means that tests involving targeting & sacrifices need to switch the order of the cards to pass.
fixed the bug where the ai "attacks/blocks" its own attackers during the combat phase.
Strangely, creatures only die in this bug when there are two or more suffering from
summoning sickness.
If somebody can double check this code change to make sure that it is appropriate.
My playtesting indicates a success but I don't have the variety of player decks others have.
with this change, currentmana is now what it could make and if anything is in the pool then add whats in the pool as potential mana., if it could potentially make mana then THIS is its currentpool. as getpotentialMana already handles the rest.
i originally added the manapool at the end of potential as my first attempt to stop this behavior, but this either/or if statement really got in the way of producing the result i wanted, which is, if
Ai has a 3 swamps, and a dark ritual, and it cast darkritual.
in hand Ai has a 5 black drop.
in OLD set up Ai would see it has 3 mana, then it would see it had 2 mana from the untapped swamps. it would pass the phase thinking that it could not cast the creature.
NOW ai looks for how much it has in mana, it see 3 swamps, it cast dark ritual, it now see what it can create on the next call to findcards, it see 2 swamps + 3 mana in pool, it cast the 5 drop creature.
mind you that this does not fix Ai mindlessly casting dark ritual as we have no current system to tell AI "hey dont cast that card now its useless to do so" like the fancy system to tell it what abilities it should use on cards :) *maybe someday*
2nd bug fix,
commented out a peice of code that compared if power and toughness would be cancelled out by a new counter. exsample:
1/1 is cancelled by -1/-1...this is actually extremely incorrect,
if you "put a 1/1 on a creature"
then you "put a -1/-1" on the same one. it does NOT remove the 1/1 as per MTG rules. the counters all all treated as NEW objects on a card. so a creature that had both those abilities used on it should have BOTH a 1/1 and a -1/-1 counter.
commenting out the section of code corrected this probelm.
modular creature, phantom creatures,sunburst and many many more will now correctly be able to use their counters even if they recieved "cancelling" Counters
last was just an improvement, as i got overly frustraited tonight while fighting with a deck that slaps many different types of counters on cards, i was having a very hard time telling what exactly i was about to put on a creature.
so what i did to correct this is create a much better menuText return on aacounter class.
PLEASE let me know if i missed a case where a counter is not showing correct text.
The check to give the award was lost in some of Jeck's reorg work (R1825), as ShopItem was deprecated & folded into GameStateShop. While at it, I took the liberty to delete ShopItem.h/cpp since they're not used.
The problem I found was specific to ManaProducer. I added an additional check when calling isReactingToClick(), if the cost has an extra cost, check if it can be paid. For this to work though, I had to change things around a little - there was a hack in the parsing code for ManaProducer abilities, where the cost wasn't being passed into the constructor. To compensate, the extra cost was being set during reactToClick, but this is too late, as isReactingToClick is called first. Now, where the hack occurs, after we construct the ManaProducer, if there's a cost, make sure we set the extra cost action immediately.
This seems to work well for the Vivid Creek card case: once the counters are tapped out, the menu system doesn't add the extra card abilities anymore, and you simply get the land tap without the menu popping up. I'm not seeing any adverse effects so far with other mana producer cards, but I'd appreciate a sanity check from other people here in case there's some other fallout I'm not seeing from this change.
I've patched the problem so that ActionLayer checks for a valid ID before doing anything, and does a no-op for IDs it doesn't know how to handle. However, this only fixes the problem during gameplay. It's quite possible that hitting the triangle button in other places in the app might equally cause a crash.
Issue: 544
fixed a Ai related bug, taught Ai not to mill itself to death basically. played a few matches which Ai was just destroying himself with a creature that allowed him to draw cards for each(whatever) in play. Ai will be a little more careful not to kill himself by Mill, also not to draw 30 cards in a turn when it clearly cant play them.
the tag "other " vs tag " other"
using "other " in target choosers will always work, however more often then not using " other" at the end of a line would produce weird effects, this was brought to my attention in a bug report by KF1, i moved all the " other" from outside target chooser into the actual target lines, as this always produces correct results in code, i imagine the tag at end of line was added before "other " was intruduced into targetchooser.
i will leave support for using " other" in code, however, i ask that we try not to use this code unless for some strange reason the targetchooser "other" doesnt take to the code.
stranger was that i noticed alot of mixed code, as in lord(other blahblah) 1/1 and this version with other tag at end, it was very inconsistent aside from causing weird weird results in game which i was actually able to confirm.
please update your primitive!!! this was ALOT of work.
correct syntax for "other "
lord(other blah)
all(other blah,blah,blah)
damage:1 target(other blah)
target(other *|somewhere)
notice its always first followed by a space. you only need one instence "other " in a targetchooser.
this also fixes the spamming of Abilities like Ai atempting to untap something more then once, or Ai uses regenerate ability multiple times on the same creature.
there will be no noticible difference in Ai game play except now it actually doesnt do the above mentioned bugs.
since the creature is going to die anyways, might as well send it in and see if it can kill something.
and yes i consider ai being THAT stupid a bug :P
- Fix a bug where AI would not check for the NULL status of some variables before calling functions on them. This would cause crashes that could seem random ingame. Possibly fixes issue 541
- fix for issue 539 . It is now possible to provide several possible paths in Res.txt, the game will use the first one that matches. If none of them works, it reverts to the oldschool "Res" folder
While debugging this, I noticed a separate issue: when changing profiles, we'd actually call refresh twice. Removed the spurious call, as reloading profiles doesn't need to concern itself with the image cache - that's already covered by the game options menu.
Also did some minor formatting / cleanup in the JGfx code for PSP - stubbed out a bunch of JLOG calls I had put in while debugging the PNG loading code.
Functionally, this has no impact to the current build - all I've done is effectively the texture loading to happen in JQuad's constructor instead of inside the LoadTexture() function.
Side note - I probably broke the IOS build with this change. Sorry, but I can only build so many targets at a time - I'm simply not set up to build this platform. As it's not a shipping target, I have to consider it a 2nd class citizen...
The conditions on which to "updateStats" during the rebuilding of filters needed to be updated. stw is NULL
when rebuilding the filters due to a "UNLOCK CARDS" action. Thus the call to stw->updateStats throws a NPE.
stw is not null only when a deck has been selected to edit. Otherwise, it makes no sense to actually update the
stats of a non-selected deck.
added new mana display option "No Glitter" acciddently(?) lost "both" options somehow.
the new "no glitter mana display is basically "eye candy without particle effects" on PC created 2000 mana...no FPS drop...on PSP created an EXTREMELY large amount of mana before i noticed an FPS drop of any kind, this is dramatically better then
what was in previous rev, create 20 mana and crash.
if someone could figure out how i manage to lose the "Both" option, please explain to me why it wasnt showing up, i spent 2 hours trying to get it back.
both "optimize starting hand" and "Unlock all Ai Decks" appear in options under the option to "enable cheats"
optimize gives you decent starting hands, and Unlock all Ai decks is basically just a bypass options for the unlock deck mode varible wololo added.
tweaked abilitygranting Eff in Ai lessons to be divided by the number of cards in hand, this will mean Ai will tend to focus on using mana to cast spells instead of using them to grant abilities, until theres only 1 or less cards in hand, at this point it will go all out. there is a splash of randomness in Ai so it will still often do whatever it freaking wants lol, you should notice a proformence increase from Ai in this aspect. no more giving unblockable to a creature in 2nd main.
please note, one of the recent previous revs broke cheat mode "unlock cards" in deck editor, i filed a bug report. its a probelm i was not able to fix myself so there is no fix included in this rev....i came across the bug while testing cheat mode stuff.
- Added AI Decks unlock system. Please update your graphics folder, and crossing fingers that Ilya B. is still around as I don't have the correct fonts.
with this change please try playing a few matchs against vanguards chosen and wraith feast, my 2 most favorate decks to fight now. youre in for a treat :)
keep in mind that even tho ive taught Ai Foreach in a somewhat crude manner it still does not understand how much mana it can gain from a foreach manaproducer, and this does not make it suddenly use dark ritual correctly. however this change was dramatic enough that i wanted it in for 14.1
this is also still under massive play testing, however no issues were found so far with it as it is presented here.
created new class VerticalTextScroller to handle task display in deck selection screens
modified detailed popup placement on deck selection screen to compensate for lack of border
* created three new utility functions that return a vector of matching abilities, colors and types
* migrated all activated ability impl into AllAbilities.cpp. Perhaps we could break AllAbilities up into separate impl files for manageability?
One for Activated abilities, another for triggers,etc
fixed some layout issues with detailed info popup
changed requirements for detailed info popup button to be determined by the number of wins aginst AI deck instead of just the number of games.
synced stats info for mana curve on detailed display on deck selection screen so only up to
Constants::STATS_MAX_MANA_COST+1 is used instead of the currently hard coded 15.
- had some problems compiling for the PSP. I assume I was the only one, please let me know if the "include JLogger" lines are not needed (they were needed for me)
- Fix a memory leak when playing in "random deck" mode
- Prevent the AI from playing cards with a cost it cannot understand (ExtraCosts with a target).
Blitz Hellion
Deathcoil Wurm
Laccolith Grunt
Laccolith Titan
Laccolith Warrior
Laccolith Whelp
Line Wolf
Pride of Lions
Righteous Fury
Rhox
Thorn Elemental
Tornado Elemental
Wolf Pack
Removed Foosteps of the Goryo. It cannot work right now for the same reason as Miraculous Recovery cannot work.
* Add multilingual support for utf-8.
* Use japanese as a test case (removing the old tentative support).
* A number of shortcomings affect this code.
+ Bugs :
- This splits algorithms used to determine the length of a string
and to render it in two: either the string starts with an ascii
char and the monobyte, variable-space algorithm is used, or it
does not and a multibyte but fixed-space algorithm is used.
This shortcoming also exists in the code to support chinese.
- From the above comes the biggest limitation: any string that
starts with an ascii character but include non-ascii characters
will not be rendered correctly.
- This does not and cannot support chars outside the BMP. This
probably won't matter, ever.
+ Todos, fixmes, wishlist :
- Single-width characters with diacritics are reported as
double-space chars. It doesn't matter too much at the moment, but
should be fixed in the future.
- Font support currently only includes japanese.
+ Performance and compatibility notes :
- Chinese code has not been switched to utf-8, to maintain backward
compatibility. We should switch it at some point in the future,
but ponder the right way to do it first.
- Retaining the support for chinese with a non-international
charset hurts performance (by making some methods uselessly
virtual).
* Still, this generally works and is extensible (it can be used to
implement korean, traditional chinese, etc, without any more code).
Implementing languages with diacritics needs an improvement of the
bool doubleWidthChar() method.
In this change, I made the CardGui's RenderBig() and AlternateRender() functions protected; anyone wanting to render a card simply calls RenderCard(), and the card drawing mode is passed along as a param.
This is the main fix for the situation where we try to load PNGs after the image cache has been saturated - instead of requiring 1 Meg as a temporary buffer to perform the swizzle operation on a full image (ie 512 * 512 texture size), these mods allow the swizzle to work in line with a temp buffer of 512 * 8 lines (ie 16K of memory). I also fixed a case where the swizzle didn't operate correctly on PNGs that weren't an even multiplier height of 8 - we'd drop the remaining lines on the floor, creating garbage lines at the bottom of those images.
Maybe 30 of those cards have been found during a scan of every Magic set, they could have been in for quiet some time... .
Card list -->> First comment
what this change does is this. if i have 20 enchantments on the battlefield Ai's creatures and lands no longer slide to the right. and vice versa. made no sense that if the other player had no artifacts/enchantments that HIS lands and creatures would slide simply because the OTHER player had artifacts/enchantments.
1) Consolidated the Loggers so that we only have one in JGE. Added a helper constructor/destructor to the JLogger class so that you can instantiate one at the top of a function, it'll trace out a 'start' and 'end' message when it goes in & out of scope.
2) Fixed the crash part of a bug I've been chasing down where, on the psp, after saturating the cache, the game dies when trying to reload the background PNG image of the deck menu. We still need to fix the root cause of the failure (not enough memory to allocate a temporary buffer for the swizzle operation), but at least the psp doesn't lock up anymore. I've also left behind all the log traces I inserted into the LoadPNG code, since we'll probably need them again.
It was only handled at the end of the game or when somebody quit in the middle of a game.
Nothing was done if somebody wanted to choose a differnet Player deck.
2) making clean up of objects a little more explicit in the mtggamezone and GameStateDuel objects
- fixed the debug framerate calculation / drawing code (consolidated duplicated functions & variables mDelta vs a win-only mDeltaTime, no reason to have two), repositioned it to draw on the bottom left (it was colliding with other debug text for the cache info).
- for debug testing purposes, added a #define override to force the image cache to work with less memory (I've picked 8 megs, which is what the psp seems to use - the normal default on win/linux is 20 megs).
Two things: 1) there was an extremely inefficient implementation in the particle system of a queue where, when particles expired, each expired element would be copied over(replaced) by one at the rear of the container. Depending on the performance of the update, this could range anywhere from 100 to 500 (the max particle count) memcpy operations per update loop. I replaced the flat array with a std::list, and simply pop the unneeded elements when they expire now. This seems to shave ~30% off the time spent in the Update() call.
2) Hardcoded the number of emitters for the mana particles to 60 (the default in the psi file seems to be around 114). This reduces the amount of iterations per tapped mana by just over half, which also helps the performance, and it's not really noticeable - the glow effect is a *tiny* bit more muted, but chances are, if you didn't read this comment, you probably wouldn't have noticed.
I've gone from having my psp start lagging noticeably at 8 tapped mana to about 12 - at this point, I think the bigger remaining lag is the fact that when there's a cache miss for a card image, we're doing synchronous i/o on the main thread - the framerate drop this causes is far more noticable than the mana particle lag.
- Added a possibility to put a file "Res.txt" instead of the folder "Res". The file Res.txt is a simple 1 line text file, telling where to find the Res folder, terminated by "/". For example: "../../wagic_res".
This addresses issue 428 . This could also help us in the future, to develop mods.
- fixed memory leak in AEquip/ATeach
- Test suite now trims strings correctly (allows to have space between comma-separated card names)
- Added Paradise Mantle (for ATeach test)
- removed a missing wallpaper from wallpapers list
new ability lord...teach(whatever[whatever]) ability.
teach is a targeted lord, it takes the cards current target and lords it the ability. im aware of a tiny memleak it contains, but the leak is happening on parser lvl, so i need more eyes to look at it. teach is ideally used for equipment, and was designed to fix issue 244 taught abilities are not given to the source cards.
forced Ai to pay for sunburst correctly. it was choosing to pay with all of one type of mana. now it pays either max or 1 from max sunburst.
added a tiny double check for Ai to try and find something to use if it suddenly has mana in its pool. it is only a single check in a turn, but i notice it actually does slightly improve the usages of dark ritual and foreach mana producers. ideally i wanted it to check EVERYTIME. but i could not achieve it without putting the game in danger of looping. so once is better then none :/
fixed a bug with affinity where it was not counting duel lands, this is becuase of not setting it up correctly for lands with multiple types SORRY!
** Sun Titan: missing exclusion of instants and sorceries for special ability
** Primeval titan: fixed token placement so that tokens went into exile and not the graveyard
following up on wrenczes cleanup,
changing ints to floats
fixing calculations such as ( 16.0 / <some float>) to ( 16.0f / <some float>) to remove compiler warnings.
Minor note to others: if you're writing drawing code, the coordinate system in JGE uses floats, so don't bother with ints for x/y coords & the like. You're forcing the processor to do float to long conversions for nothing.
please copy "DeckEditorMenuBackdrop.png" into your PSP folder. Otherwise you will have a crash when you start up!
ChangesLog:
minor refactoring of DeckMenu
added a new DeckEditorMenu which is derived from DeckMenu. This customizes the deck editor menus with the exception of the confirmation screens (yes/no)
Still more work to be done to round out some font issues.
TODO:
put more information text in bottom row of menu.
reorganize statistical data to allow more info to be shown.
installed a horizontal text scroller for the deck selection screens in normal play
TODO:-> Need to make it smoother transition. It currently just replaces the text with the new text.
TODO:
change literals to use constants,
refactor the rendering code for the menu to have be leaner.
add text scroller to list all the tasks.
* 1st implementation will list all the tasks.dat
* 2nd round will try to get the scroller to only display relevant tasks to ai
Special thanks to wololo and MootPoint for helping me hammer this out. To abrasax, for the initial design of the layout.
this fixes a bug(?) that had high priority and maintains same effect as before. removed all traces of the "bugged(?) hint" from CardPrimitive.
Issue: 498
Chainer, Dementia Master, Corpsehatch, Golem Artisan, Imps' Taunt, Samurai of the Pale Curtain, Summoning Station
Add missing text of following duel land:
Blackcleave Cliffs, Copperline Gorge, Darkslick Shores, Razorverge Thicket, Seachrome Coast
I've also added my current work on the zone navigation system (class Navigator) - it's currently turned off for now (the override for this is inside of CardSelectorSingleton's Instance() call, simply comment out the NEW CardSelector and uncomment out the NEW Navigator line.) It's functional, but I want to do more testing before considering wiring it into the game options or something similar. (Also, note that it currently doesn't support the mouse functionality added by DJardin.)
Lastly, there's a bug crash fix in ActionStack that I tripped across while testing - basically, an illegal index value would have us walk off the bounds of a vector.
Also fixed the project includes so that we don't need to always use the indirect include path, ie:
#include "../include/foo.h" -> #include "foo.h"
I'm don't know much about make files - if I busted the linux build, mea culpa, but I think we're okay on that front too. For future reference, here's the most straightforward link on the topic of adding pch support to make files:
http://www.mercs-eng.com/~hulud/index.php?2008/06/13/6-writing-a-good-makefile-for-a-c-project
this is by no means absolutely perfect, i like it tho, and makes for some real good times with level up deck built with equips.
you will notice i added a level=number...to the level up creatures, this has no effect on players, this is just a small hint to the Ai as to when it should stop investing mana in that creature. the chances are a little over half that ai will want to level a creature, increased ever so slightly with each level up.
for equipment, the Ai will now want to equip its best Creature(determined by power+toughness+convertedcost+how many abilities it has) and will want to equip these "better" cards atleast 2 times before it is reduced. same system for prevent damage, it will want to save its "better creature" more then a 1/1 token.
for both tho i added slight bonuses...
to equip, there is a higher chance that the ai will want to target a white creature, with an extra bonus if the creature is a 1/1 and nontoken. this is to encourage Ai to equip in white weenie decks
in prevent, there is a slight bonus if the creature is a 1/1 and the blocker/blockee has a power of 1.
currently prevent damage treated this way is not coded for direct damage spell, sorry ! but for combat you will notice ai taking a stand and fighting back hard.
No option to delete or edit the AI deck once it has been created.
The deck gets saved as the canonical form of the deck to match other AI deck formats.
- Optimized 163 cards (Card list --> First comment).
Most of them profit from the much more detailed combat trigger system and the new types of damage prevention.
- Added 17 tests to save Zethfox's additions for the future.
- Fixed issue182.
(I did a cursory check to make sure chinese still displays correctly - at a glance, I'm seeing what looks correct to someone who doesn't read the language :) )
I'm also noticing that the GetQuad(int) variant never seems to get hit, so I suspect that the ID lookup map is redundant. I left it alone as the JResourceManager base class forces the need for the function; I need to spend more time looking at just how much of JResourceManager we actually use at this point.
- adding tests for issue 489 and issue 491
- check for null pointers in Credits.cpp
- Test suite can now select tokens by their name
- Fixed Dragon Broodmothere's token name
- fixing buggy test for kicker introduced in r2414
- removed old translation tool scripts (not needed anymore)
- simplified "borderline.txt" using the global "borderline" grade.
Also moved some static value definitions used in the drawing code from the class header to a private namespace in the cpp file, as they don't need to be seen by any clients of the class.
Also renamed WindowRect to windowRect & PixelFormat to pixelFormat for consistency with other locally declared variables. (Uppercase should be reserved for class names, ie WindowRect is the class/struct, windowRect is an local object in your code.)
( ie task list was being updated, set information being evaluated, etc )
put a guard around the endgame stat update process to only update when non-testsuite games are played.
Issue: 488
Some of the things refactored to the base class:
- isPaymentSet()
- canPay()
- Render()
- setSource()
- setPayment()
- the target instance
- duplicated constructor initialization crap
I'm not interested in pointing fingers as to how the code got this way, but I'll ask that everyone who's altered this code in one fashion or another to carefully diff this change and understand what I refactored. This code is a poster child for neglect & what happens when people start blindly copy & pasting code instead of paying attention to the commonality between code paths. If you see the same lines of code happening over & over, and you're about to make yet another copy, please stop yourself & think about how you can refactor the code to be in a single shared function (or, more explicitly, a shared base member function when possible).
If you don't understand what I mean by a shared base member function, then I would suggest at the very least reading up on this topic:
http://www.cplusplus.com/doc/tutorial/inheritance/
(And, after all that, if you're still unsure how to proceed, ping someone else for advice!)
"It's currently unclear for me why several instances of the same hgeparticlesystem with the same .psi file are created..."
The GameApp::Create() call was initializing an array of particles, but it wasn't actually stashing them in the psi cache. The MenuItems also create the particles, but these are stashed correctly in the cache at that point. So, I simply removed the unused particle array loading code since it wasn't actually caching anything correctly & therefore simply adding redundant reading of the same particle files.
http://www.wololo.net/forum/viewtopic.php?f=21&t=1430&start=40#p13465
Seems to work from my testing so far. If this is the preferred route, we should probably sweep through & track down all the other cards that use the token counter hack, as that method used to work in 0.12.1 and broke some time after that.
(Somebody please sanity check this for me, as this is my first foray in messing with card rules.)
previously:
[card name] ([set name]) *d
would fail because when the parser when looking for the card name, it would use
[[card name] ]
and not
[[card name]]
since the card lookup is case insensitive but not whitespace insensitive the lookup would fail.
CODE: SELECT ALL
#if defined (WIN32) || defined (LINUX)
char buf[4096], *p = buf;
sprintf(buf, "Some debug message showing variables %i and %i\n", variableA, variableB);
OutputDebugString(buf);
#endif
new paradigm:
CODE: SELECT ALL
DebugTrace("Some debug message showing variables " << variableA <<" and " << variableB);
No more dealing with formatting sprintf crap, just stream out variables. Also, DebugTrace washes out in release automatically. (TODO, need to sweep through the rest of the app to apply the changes to all the cases where OutputDebugString() is being called)
2) added two traces to follow adding/resolving things on the stack;
3) changed the uninformative "stack object" string that was the default for base class interrupts to use typeinfo(*this).name() so that you can actually see the derived class in the trace output. Here's a sample of what my trace output looks like now:
Action added to stack: Devoted Hero
Resolving Action on stack: Devoted Hero
Action added to stack: class NextGamePhase
Resolving Action on stack: class NextGamePhase
Action added to stack: class NextGamePhase
Resolving Action on stack: class NextGamePhase
Action added to stack: class StackAbility
Resolving Action on stack: class StackAbility
Action added to stack: class DrawAction
Resolving Action on stack: class DrawAction
4) replaced some hardcoded 0 / -1 values with their proper enums.
modified player status to recognize that test suite has been activated. This is to allow deactivation of "phase skip automation" game setting during test suite.
TODO: fix "Phase Skip Automation" such that if turned on the test suite does not break. This fix should be considered temporary
modified player status to recognize that test suite has been activated. This is to allow deactivation of "phase skip automation" game setting during test suite.
TODO: fix "Phase Skip Automation" such that if turned on the test suite does not break. This fix should be considered temporary
- downsized mp3 quality (people who want the best quality can still get it from jamendo) to reduce size of the final package
- removed unnecessary Jade them (Jeck already removed it a while ago, it was reintroduced by mistake). Jade is now part of "Gemstones"
- fix for issue 467 (simultaneous triggers + "trigger" keyword)
- MootPoint's patch for some string parsing
- some random int/float compilation warning fixes
the auto line had "Crature" inplace of "Creature", this caused tokens generated by those cards to be treated as "workaround" tokens instead of real playable tokens.
- Attempt at solving issue 247 (missing background image for trophy room). I think I attempted that a while ago and it caused some crashes, so let's revert this change if this happens
- Partial fix for issue 335. This fixes the general problem of triggers not working in the case @movedTo(Battlefield) from(anywhere), but not the specific case of River kelpie not getting to draw a card after being "persisted"
- {z} cost becomes l2e (Library To Exile)
- {q} cost becomes s2l (Send to Library) <- from any place to Library
- subtypes leyline, controllsershroud, playershroud become ability keywords
- support for tinyCrops see http://wololo.net/forum/viewtopic.php?f=15&t=2197
- card images can now be named after the card's name (ex: sets/10E/Ancestor's Chosen.jpg , or sets/10E/10E.zip:Ancestor's Chosen.jpg)
- yet another attempt at fixing tokens in the shop
Example code:
[card]
name=Serra Avatar
auto=thisforeach(controllerlife) 1/1
autograveyard=moveTo(ownerlibrary) && shuffle
text=Serra Avatar's power and toughness are each equal to your life total. -- When Serra Avatar is put into a graveyard from anywhere, shuffle it into its owner's library.
mana={4}{W}{W}{W}
type=Creature
subtype=Avatar
power=*
toughness=*
[/card]
[card]
name=Divinity of Pride
abilities=flying,lifelink
auto=this(controllerlife > 24) 4/4
text=Flying, lifelink -- Divinity of Pride gets +4/+4 as long as you have 25 or more life.
mana={WB}{WB}{WB}{WB}{WB}
type=Creature
subtype=Spirit Avatar
power=4
toughness=4
[/card]
- swapped StyleManager.h and .StyleManager.cpp files in VC++ project
- attempt at fixing issue 451 (tokens in momir), please verify. Also attempt at fixing tokens in shop.
Example code:
[card]
name=Arc-Slogger
auto={R}{z}{z}{z}{z}{z}{z}{z}{z}{z}{z}:damage:2 target(creature,player)
text={R}, Exile the top ten cards of your library: Arc-Slogger deals 2 damage to target creature or player.
mana={3}{R}{R}
type=Creature
subtype=Beast
power=4
toughness=5
[/card]
[card]
name=Deep Spawn
abilities=trample
auto=upcost[{M}{M}] moveTo(mygraveyard)
auto={U}:shroud && tap && frozen
text=Trample -- At the beginning of your upkeep, sacrifice Deep Spawn unless you put the top two cards of your library into your graveyard. -- {U}: Deep Spawn gains shroud until end of turn and doesn't untap during your next untap step. Tap Deep Spawn. (A permanent with shroud can't be the target of spells or abilities.)
mana={5}{U}{U}{U}
type=Creature
subtype=Homarid
power=6
toughness=6
[/card]
[card]
name=Leashling
auto={q(*|myhand)}:moveTo(myhand)
text=Put a card in your hand on top of your library: Return Leashling to its owner's hand.
mana={6}
type=Artifact Creature
subtype=Hound
power=3
toughness=3
[/card]
Optimized the code for all cards with RETRACE.
Fixed issue411.
Fixed some cards.
2 example cards:
[card]
name=Decree of Justice
auto=token(Angel,Creature Angel,4/4,flying,white)*XX
autohand={2}{W}:cycling
autohand={X}{W}:name(cycle and soldier tokens) && cycling && thisforeach(X) token(Soldier,Creature Soldier,1/1,white)*X
text=Put X 4/4 white Angel creature tokens with flying onto the battlefield. -- Cycling {2}{W} ({2}{W}, Discard this card: Draw a card.) -- When you cycle Decree of Justice, you may pay {X}. If you do, put X 1/1 white Soldier creature tokens onto the battlefield.
mana={X}{X}{2}{W}{W}
type=Sorcery
[/card]
[card]
name=Stormbind
auto={2}{D}:damage:2 target(creature,player)
text={2}, Discard a card at random: Stormbind deals 2 damage to target creature or player.
mana={1}{R}{G}
type=Enchantment
[/card]
Added 2 tests for the keywords introduced in rev2272.
Corrected several card bugs.
Cards with FLASHBACK are finally 100%. Here is one example to see the changes:
OLD:
[card]
name=Lava Dart
auto=damage:1 target(creature,player)
autograveyard={S(mountain|mybattlefield)}:copy(this) && moveTo(mystack)
text=Lava Dart deals 1 damage to target creature. -- Flashback - Sacrifice a Mountain. (You may cast this card from your graveyard for its flashback cost. Then exile it.)
mana={R}
type=Instant
[/card]
NEW:
[card]
name=Lava Dart
target=creature,player
auto=damage:1
flashback={S(mountain|mybattlefield)}
text=Lava Dart deals 1 damage to target creature. -- Flashback - Sacrifice a Mountain. (You may cast this card from your graveyard for its flashback cost. Then exile it.)
mana={R}
type=Instant
[/card]
2)Added 21 successfully tested cards based on rev2262. Most of these cards have BUYBACK.
Tests for both keywords will follow in one of the next revisions.
[card]
name=Frogmite
abilities=affinityartifacts
text=Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)
mana={4}
type=Artifact Creature
subtype=Frog
power=2
toughness=2
[/card]
Added tests for that.
Have fun!
This addition includes
- cards with STORM (Dragonstorm,Tendrils of Agony,etc.) --> IT'S FINALLY THERE!
- cards which restrict the casting of spells (Arcane Laboratory,Silence)
- PLATINUM ANGEL (keyword: CANTLOSE)
Added tests for STORM;LAND:number,Sneak Attack
Removed Rhox Meditant and its tests.
- Phantom creatures (Phantom Centaur, etc.)
- Soratami
- Cards with alternative casting cost (Force of Will) including almost all cards with EVOKE.
- Creatures which let you look at target players hand.
Added tests for several card groups.
Fixed issue148. Bloodhall Ooze works now as it should.
Added 1 test for creatures with Bloodthirst.
Removed 1 test (Tolsimir Wolfblood: This was related to a Voja workaround, which does not exist anymore!).
Two example codes:
[card]
name=Alabaster Leech
auto=lord(*[white]|myhand) white:+1
autoexile=all(*|myhand) resetcost
autograveyard=all(*|myhand) resetcost
autohand=all(*|myhand) resetcost
autolibrary=all(*|myhand) resetcost
text=White spells you cast cost {W} more to cast.
mana={W}
type=Creature
subtype=Leech
power=1
toughness=3
[/card]
[card]
name=Helm of Awakening
auto=lord(*|myhand) colorless:-1
auto=lord(*|opponenthand) colorless:-1
autoexile=all(*|myhand) resetcost
autograveyard=all(*|myhand) resetcost
autohand=all(*|myhand) resetcost
autolibrary=all(*|myhand) resetcost
text=Spells cost {1} less to cast.
mana={2}
type=Artifact
[/card]
autoexile=all(*|myhand) resetcost
autograveyard=all(*|myhand) resetcost
autohand=all(*|myhand) resetcost
autolibrary=all(*|myhand) resetcost
----> This code section is necessary, because manacost altering cards will keep their effect even when they have left the battlefield. RESETCOST erases all alterations which have no existing source on the battlefield anymore.
2) Added the new keyword TRANSFORM, which is similar to BECOMES. The main difference is that you can change single parameters of a permanent (color,type,...).
Example codes:
[card]
name=Memnarch
auto={1}{U}{U}:target(*) transforms(artifact)
auto={3}{U}:moveTo(myBattlefield) target(arifact)
text={1}{U}{U}: Target permanent becomes an artifact in addition to its other types. (This effect lasts indefinitely.) -- {3}{U}: Gain control of target artifact. (This effect lasts indefinitely.)
mana={7}
type=Legendary Artifact Creature
subtype=Wizard
power=4
toughness=5
[/card]
[card]
name=Dralnu's Crusade
auto=lord(goblin) 1/1
auto=lord(goblin) transforms(zombie,black)
text=Goblin creatures get +1/+1. -- All Goblins are black and are Zombies in addition to their other creature types.
mana={1}{B}{R}
type=Enchantment
[/card]
Important notes concerning TRANSFORM:
- IF YOU TARGET A CREATURE THE EFFECT IS PERMINENT.
- IF YOU TARGET THE SOURCE THE EFFECT IS UNTIL END OF TURN.
- IF YOU USE LORD THE EFFECT LAST TIL PERMINENT SOURCE LEAVES PLAY.
These restrictions will probably be changed in the near future!
3) Added 57 successfully tested cards.
Card list ---> first comment
4) Changed the name of several tokens: "()" used to cuase crashes when used in the name-line.
5) Added the new keyword NONBATTLEZONE for leaves play trigger optimizing. It can be used to replace the phrase "EXILE,GRAVEYARD,HAND,LIBRARY".
I will add tests for test suite in one of the next revisions!!
####### TEST SUITE PROVEN ########
All these cards are creatures which have a certain effect when being cast ("played" from owners hand).
Their code profits from the fact that KICKER is not optional in Wagic: This means that whenever you are able to pay Myojin's kicker cost for example (in this case it is {0} --> rate: 100%), it will enter the battlefield with a Divinity counter on it.
- Myojin won't get the Divinity counter
----> when brought into play from the hand with cards like Elvish Piper.
----> when brought into play from any other zone.
Zethfox: "Opponenthand gui access, cards that target(*|opponenthand) can now be coded as such, target chooser will activate allowing you to click the new icon under the avatar of the opponent and open the opponents hand Gui so you may select the target card."
Cards in opponents hand are only viewable when target choosing would allow you to enter that zone! ;)
- Added the new keyword "NAME". (by Zethfox).
When used in an autoline it replaces an autoline's "ability" text with a custom ability name.
The basic phrase is: "auto=name(whatever you want) &&".
Example card:
[card]
name=Order of the Stars
abilities=defender
auto=choice name(white) && counter(0/0,1,White) all(this)
auto=choice name(blue) && counter(0/0,1,Blue) all(this)
auto=choice name(black) && counter(0/0,1,Black) all(this)
auto=choice name(red) && counter(0/0,1,Red) all(this)
auto=choice name(green) && counter(0/0,1,Green) all(this)
auto=this(counter{0/0.1.White}) protection from white
auto=this(counter{0/0.1.Blue}) protection from blue
auto=this(counter{0/0.1.Black}) protection from black
auto=this(counter{0/0.1.Red}) protection from red
auto=this(counter{0/0.1.Green}) protection from green
text=Defender (This creature can't attack.) -- As Order of the Stars enters the battlefield, choose a color. -- Order of the Stars has protection from the chosen color.
mana={W}
type=Creature
subtype=Human Cleric
power=0
toughness=1
[/card]
The popup window for this card will now contain a list with
"white,"blue","black","red" and "green"
instead of
"ability","ability","ability","ability","ability".
This will make a lot of cards much easier to handle!
- Added 42 successfully test using one (or both) new keywords.
Card list --> First comment
Note that we did not add tests for both new keywords:
It is simply not possible to write them yet! They will follow as soon as they are possible. We guarantee that everything we submitted in this revision has been tested excessively!
Added ARC (although the set does not have official abbreviation. I putted the scheme in a separate todo.dat, mainly because I'm lazy of adding all the scheme alphabetically ordered into the todo.dat. Some cards do not have official ID now I've used ID from the numbering sequence of ARC that were unusued, will provide a full list later for tracking purpose.
modified the m11 cards.dat name, otherwise it does not load correctly.
moved some cards from mtg.txt into a "borderline.txt", probably some others should be added...
Daily build
The engine always handled it as "REGENERATE" and thus had to be renamed. Its new name is "CANTREGEN". It has been tested excessively by me and Zethfox. Now all cards with the former "cantregenerate" work as they should.
- I also added a test for "CANTREGEN" (Incinerate).
- Added the new keyword "FOG" (by Zethfox).
This is an equivalent for "PREVENTALLCOMBATDAMAGE", which only worked for instants and sorceries. "Fog" works only for permanents and is used in combination with the newly introduced parameter "ONESHOT"!
- I also added 2 tests for "FOG" (Maze of Ith, Spore Frog).
Both additions lead to several issue fixes:
Fixed issue286.
Fixed issue328.
Fixed issue332.
Fixed issue416.
- Removed Demonic Torment, Gaseous Form, General's Kabuto, Sandskin. Those cards never worked and could even not be fixed with "FOG".
- Optimized the code of the dragon-lair land-cycle from PLS and added 2 tests for them.
- Added 8 successfully tested cards. Card list -> first comment.
Card list -> first comment
- Added tests for "lifeset" (Biorhythm,Blessed Wind)
- Removed test for Hope Charm.
- Optimized all cards with life payment as activation cost or mana cost.
- Optimized all spells with a must choice.
- new features by Zethfox:
-- "oneshot" optional parameters for lords (helps fixing issues with bouncelands)
-- Life as a cost (avoids using a dirty trick of paying life as an effect)
-- set life total abilitiy (lifeset
-- new auto lines: autostack, autoexile
The test suite passes with these changes, also no test using these abilities has been added yet
- minor fix in Zethfox cards addon (Bad lines error from parser)
- Zethfox's patch for {t(target)} as an extra Cost. Works the same way as sacrifice, check Azami, Lady of Scrolls for an example
- fixed compilation on the PSP (sorry!)
Zethfox found out that a single sacrifice cost as an addition to a normal manacost can be added to the manacost-line of a card!
Here is a code example from the famous card Natural Order (VIS):
[card]
name=Natural Order
auto=moveTo(myBattlefield) target(creature[green]|myLibrary)
text=As an additional cost to cast Natural Order, sacrifice a green creature. -- Search your library for a green creature card and put it onto the battlefield. Then shuffle your library.
mana={2}{G}{G}{s;notatarget(creature[green]|mybattlefield)}
type=Sorcery
[/card]
I tested this excessively and I have to say: This kind of code leads to absolute 100%ers.
- Added 2 tests for this to save it from being broken by future code changes.
- Removed the land cycle from Visions (Coral Atoll, everglades, etc.).
- Removed some none working cards from mtg.txt
- Added the "unofficial" grade
- Added a system to give a grade to an entire file, avoids reading the file any further if not necessary
- Added Zeth's addons to the primitives folder, with a grade of "Unofficial"
- bug fix in JGE++ audio (improve HBL compatibility)
- Added new rewards in story mode: random card, card (either by "name" or id), specific set
- Story mode: added possibility to choose music, and bg for duel.
-- See "01. Where it all begins" for examples of new features
- JGE updates : main accepts argv/argc. Compilation variables for MP3 and Network support
- Minor fix in Wagic (potentially fixes crashes when using activated abilities several times in onr turn. Couldn't reproduce the issue)
- Added abrasax's game manual to the campaigns list
- Added a duel in the tutorial campaign, so that it becomes a bit meaningful (and therefore it's now not so easy to unlock the set)
Card list -> first comment.
2) Fixed issue422.
3) Optimized 3 cards:
Covetous Dragon
Emperor Crocodile
Tethered Griffin
All additions and changes don't cause test suite to crash.
Will also add some tests in the next few days.
* Improve loading performance by about 25%.
- This is certainly not the kind of change I was aiming at, but it
just happened to get done, so why not commit it.
- Little point for users in this change actually, since the loading
times get down from 15 to 11 secs or so, it's not even that
obvious.
- I get about 25% on my PSP. Valgrind reports 36% improvement on PC.
I wish it was the opposite ;_;
- Feedback welcome
Example code:
[card]
name=Dregscape Zombie
autograveyard={B}:moveto(exile) && token(17483511) asSorcery
text=Unearth {B} ({B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.)
mana={1}{B}
type=Creature
subtype=Zombie
power=2
toughness=1
[/card]
[card]
name=Dregscape Zombie Unearthed
type=Creature
subtype=Zombie
abilities=haste
auto=@next end:moveTo(exile)
power=2
toughness=1
mana={1}{B}
[/card]
Added a test script for this card as an example for cards with Unearth.
Card list -> First comment
More cards with Unearth will follow tomorrow.
- Reward system in Story mode (currently, either credits or random set)
- Rules now accept for player 2 to start (see story mode "block" stage)
- Story mode now has an autosave/autoload mechanism. This is for convenience but also to prevent people from abusing the reward mechanism too easily.
- possibility to choose an avatar for both players through the rules (see example in story mode)
Altered the code of Countersquall, Punish Ignorance and Undermine by changing "targetController" to "opponent".
This is a workaround for issue408, not a fix. I think we can live with that because no one wants to counter his own spells with Undermine, I think...
--> http://wololo.net/forum/viewtopic.php?f=21&t=1430
!!!!Many thanks to Kaioshin!!!!
One example card code:
[card]
name=Arc Lightning
target=creature,player
auto=damage:1
auto=damage:1 target(creature,player)
auto=token(-1111112)
text=Arc Lightning deals 3 damage divided as you choose among one, two, or three target creatures and/or players.
mana={2}{R}
type=Sorcery
[/card]
[card]
name=Arc Lightning's 3rd Damage
auto=counter(0/0,1,Arc Lightning)
auto=@damaged(creature,player):thisforeach(counter{0/0.1.Arc Lightning}>0) damage:1 target(creature,player) && counter(0/0,-1,Arc Lightning) && counter(0/0,1,Bury)
auto=thisforeach(counter{0/0.1.Bury}>0) bury
type=Nothing
id=-1111112
[/card]
This new introduced use for fullcoded tokens seems more borderline than it in fact is:
- The tokens cannot be targeted or destroyed except for their own sac-effect.
- They don't cause any effects on the board to trigger.
- The interactions with their "mothercard" cannot be interrupted.
- They are invisible (this is true for most of the cards), because they exist as short as a permanent can exist, vanishing immediately after entering the board.
I couldn't believe it when I saw this way of coding the first time, but it just works wonderfully! Very few people will recognize any difference between this and the usually coded cards.
THIS ADDITION DOES NOT CAUSE TEST SUITE TO CRASH!! ;)
Card List -> First Comment
- fixed bugs introduced in revision 2034 (Giant Growth)
- Extended Story mode xml: much easier to write basic thing, font selection, possibility to position answers, answers now in correct order
- moved story in the menu because it is not major for now
* Fix the last pending bug of issue 380.
* This avoids calling the translator before it is initialized.
- Removing the call is harmless because it is done later anyway,
late enough that we know the translator is initialized, but soon
enough for the data gathered by the call hasn't been used yet.
* This doesn't protect against future early uses of the translator.
- This is quite hard to fix. The translator is initialized really
early, pretty much as soon as we know what language is in
use. However, there is a little interval and it is possible to call
upon it inside (this is what caused this bug). It might also be
called before we know the language at all, with obvious problems.
* Partial fix for issue 380.
* This remove a bug where a variable was not initialized in profiles.
* The impact on this could have ranged all the way to a full trashing
of the user configuration files (though it requires some bad luck)
* Add a suppressions file for valgrind for those errors we can't
do anything about.
* Please be *extremely* careful before adding anything in this file,
and please document well any additions with the reasons why it
should indeed be in here and pointers to web pages explaining why
this is happening.
Added SHM,EVE,ALA,ARB and CFX
Was a pain, some sets were added "partially" so I had to review them completly + there was some english text !!!
I also added some subtypes, for the set I added.
Fixed issue398.
Removed Silent Arbiter: This card does not work. Opponent can always attack or block with more then one creature although Silent Arbiter is on the battlefield. Closing issue400.
- updated pt translation (thanks to almosthumane)
- Added/updated some Themes by Ilya B
- Added a random wallpaper loading at loading screen (see wallpapers.txt in Res/graphics)
- Saving decks and collection should now be a bit more secure (attempt at minimizing issue 393)
Optimized all cards with Graft.
Removed Merrow Reejerey: Permanents with two or more "may"-lines never worked because all these lines will always trigger, so you could use them all. Closing issue362.
This card cannot work for now: The engine always tries to let the "+1/+1 counter"-effect trigger first, so it tries to give a creature in a graveyard a +1/+1 counter, and this is not possible in wagic for the moment.
Closing issue306.
(winGame keyword).
Added 2 interesting draw spells (they work 100% as they should!)
Added 6 other yet undiscovered, but perfectly working cards.
Card list -> First post
- fix issue 392 (broken tests)
- Fix a bunch of memory leaks (guys please be careful!)
- Added Logging facility in JGE
- HBL Compatibility (cleaned up some code with MP3 in JGE)
- Added "winGame" ability. Currently used mostly by the story mode, but some cards could probably need it too
- Improved story mode and uncommented it from the source.
-- The current campaign is of course very basic, anybody who wants to improve it or create other ones feel free to do so
-- TODO (short term): save progress, rewards system, improve tutorial campaign
-- I'll talk a bit more about this on the forums/email after a night of sleep
- Several creatures with upkeep costs.
- Almost all creatures with Echo.
- Force of Nature and Lord o f the Pit are softcoded now.
Card list -> First comment
Fixed issue389.
upcost[cost[,phase]] effect
cost is any cost that you might use for an auto line, including sacrifice and counters, phase is optional and defaults to upkeep, phase can have an optional prefix next which will make it so you only need to pay the cost once.
Effect is any effect that can go in an auto line and only goes off if cost is not paid during phase. For example, force of nature would be: auto=upcost[{G}{G}{G}{G}] damage:4 controller.
goblin patrol would have: auto=upcost[{R},next upkeep] moveto(mygraveyard)
Activated abilities with {X}-costs that have a target don't work yet.
Card list -> First comment
Fixed issue386. It was just a little typo in Nekrataals autoline.
Most of the cards are based on the last adds by salmelo, while some few cards could have been added for half a year or more.
2 weeks of intensive testing are over, and I think all cards will do what they should but if you still find something discussable after testing them by yourself, plz post it here!
Card list -> First post.
use "trigger" inside target code of triggered ability.
does not work with @each and @next.
@damaged can use trigger[to] and trigger[from] to specify the target or source of the damage, respectively.
Adds cards:
Aether Flash
Bramblewood Paragon
In the Web of War
Juniper Order Ranger
Mortuary
Primal Forcemage
Fungus Sliver
Simic Initiate
as well as a test file for feral hydra, missing from my last commit.
and daily build.
It fixes several problems with the newly introduced improvements concerning Counters.
Added 8 successfully tested cards, 1 of them is DARK DEPTHS!
Daily_Build update
Complete list in the first comment.
Salmelo:"Here is another patch, this time adding counters to target specifications, so now you should be able to target things with counters on them as well as use counters for criterion for Lord, aslongas, foreach, etc.
I had to muddle the syntax a little bit though, so heres an example, taken from gwafa hazid, whom I added to the primitives to test with.
lord(creature[counter{0/0.1.Bribe}]|opponentbattlefield) cantattack
obviously the part we are worried about is the counter part, note that those are curly braces { } and periods . instead of parentheses ( ) and commas , this is so that it does not conflict with how targets are normally parsed, which it did before I changed those. Counters still work the same way everywhere else though, you only need to use { } and periods in target code.
Also, you can use counter{any} to specify that it should look for things with any kind of counter on them, not just specific ones, this is used by Kulrath Knight, for example.
I also consolidated most of the code used to parse counter specifications, as it seemed unnecessary duplicating it three times.
Anyway, aside from this major addition, I also added Gwafa Hazid, Profiteer; and Kulrath Knight to the primitives, as well as a test file for each to make sure it worked.
Hopefully y'all will find this patch useful.
Oh, and I should point out that it only works with one Counter in the target specification, i imagine if you put two in the same one then it would either overwrite the first with the second or merge them into some sort of hybrid counter monstrosity, either way, I wouldn't suggest it. "
Cards with vanishing are also codable now. Have a look at the comments for explanation.
daily_build.
"@movedTo" in combination with "autograveyard" WORKS!" Thanks to Abrasax!
Fixed 18 cards, 1 of them is Rancor. Now works 100%, so issue311 is fixed.
You find a list of all added and fixed cards in the first comment.
- Added remove/add counters as a cost, patch by Salmelo, thanks man!. See primitives/mtg.txt -> Thallid to see how it works
- added test for i286 by salmelo
- added basic display for counters (this needs improvement) by salmelo
* Fix issue 378, where the particles would not appear upon the second
opening of an existing menu.
* Fix for one of the issues of issue 380, where the selectionY
attribute would be used uninitialized - reported by valgrind as
an access to an uninitialized value in sinf and cosf.
* Fix issue 357, where the hand loses focus when the opponent declares
attackers while the hand is open.
* Harmonize the code for CardSelector.cpp to the coding style.
- fix for issue 348
- Fix a bug when going out of the deck editor then back to it again would show an incorrect color icon instead of nothing
- Fix a bug where the AI tries to play a spell with a target instead of just checking if it can play it. (visually, this showed as the AI tapping mana, then "freezing" for a few seconds with some cards grayed out on the battlefield)
* Add the confirmation screen for bindings.
- Add support for asking confirmations before exiting the menu.
- Add support for cancelling saving of options.
- Add support for requesting focus when the parent allows to yield.
* Recenter most options' text.
* Change the background color of the selected options (else, there is
no way of knowing where is the cursor when both option text and
option value are icons).
* Change symbol names to their equivalent PSP icon use in wagic.
* Make the FULLSCREEN function bindable on platforms that support it.
* Linux has F as default binding.
* Windows support is not implemented, but is there ; applications will
just not suggest it under windows for the moment.
* Display pictures for buttons on PSP in the keybinding screen.
* Fix a bug where the New Binding... button would disappear when
creating a new binding.
* Fix a bug where the menu to choose the bound symbol was not modal.
* Fix issue 340 for good.
* On X systems this still depends on a working X detectable repeat,
which is not the case in stable releases of some popular linux
distributons at this time. This is expected to be fixed soon.
I haven't chosen yet whether I wait for the fix on X side or if
I work around the bug.
* Mostly fix issue 340.
* There are still detail problems :
- There are still problems when two keys are pressed at the same time.
This is not a release blocker ; what happens exactly is :
while maintaining two keys, when one is released, the enqueued
autorepeat keypresses for the others are flushed too. I don't
think anyone will notice but for the sake of correctness I'll fix
it.
- A bug in xorg prevents the linux version to work correctly at the
moment. The bug is current as of 2009/08 and fixed as of 2010/01,
but major releases still include the bug at this time, so I'll
have to work around it somehow.
- I expect the windows version to work, but I can't test it.
- I'll test on mac later today.
* Some cosmetic cleanup.
* Have the unix version report analog control the same way the
windows version does.
* Move back Run() into JGE::Run(). The code for ::Run() is still
inside main.cpp.
- This fixes the "blinking screen problem", issue 341. I think.
- I have no idea WHY it does, but it's better than not fixing it.
- Run() would be better in ::Run() in main.cpp than in JGE, should
be moved back when we know more about the problem.
* This finalizes the functionality for key bindings.
* Key bindings are saved in the user's configuration file and read
back the next time.
* Still got to do : display, instead of a number, an icon on PSP and a
string on windows (linux/mac already done).
- Adding (dead) code for Story mode. This is FAR from being ready so it's deactivated in the code. I just don't want to create a branch (I'm lazy) and I'm fed up with synching. My Goal is to have a tutorial ready with this for the release after this one. If you want to test it (Note: the sample story is not interesting at ALL), just look for "Story mode" and uncomment (3 occurrences). PSP Or Linux need additions to the Makefile...
* The key bindings now display (semi-)correctly.
- Here, "semi-" means the local keys display as a string under X and
a number everywhere else. The number is all but helpful and will
have to be replaced before it is usable, but at the moment, the
code is stable afaik.
Note: I replaced paragraphs (which Wagic can't display at the moment) with the sequence " -- ". If that's not desired, they can be easily replaced, but I think they improve readability. Previously, paragraphs where transcribed into slightly larger spaces, and I found that slightly confusing when reading the texts in-game.
Note: I checked all changes manually, so in the cases where the value *has* to be different for the card to work (e.g.Covetous Dragon), I left the values as they were. In these cases I added a comment to the card code which notes why the values need to be different, so that no one else breaks the card by "correcting" them.
Note 2: You may have noticed that I used a fixed sequence of lines for all cards. That was a byproduct of the file unification process, but I think it's also rather useful. Above the "text=" line are the lines that we need to code (abilities=, target=, auto= etc.). Below the "text=" line are the fixed values (mana=, type=, power= etc.) which we only need to touch if either the card gets errata'd, or we need to do some tricky coding (e.g. Covetous Dragon). So, in other words, everything below the "text=" line should be okay now in both files, and doesn't need to be checked when implementing or debugging a card.
- matched card names of flip cards and split cards in _cards.dat and mtg:todo.dat
- removed the now superfluous todo.dat files, the file mtg_todo.dat replaces these.
Also re-enabled the cards which had their names changed to make them work. (Example: the card code for "Vorosh, the Hunter" only works if thecomma is removed from the card's name.) These cards are a maintenance hazard since they a) require changes to _cards.dat if their names are corrected later, b) disrupt translation, and c) cause problems for external tools like MTG Studio which have the correct names in their database. However, only a few cards are affected by this, and I didn't want to remove them because Dr. Solomat has invested quite some effort top make them work. I added comments to these cards in mtg.txt as well as in the respective _cards.dat files to reduce the risk of further maintenance problems for these cards. In any case changing a card's name to make it work should be considered as a makeshift solution at best, please try to prevent it when possible.
* Fix linux32 compilation.
* Wagic+JGE are now expected to compile on any unix that
has an X and an OpenGL library. If fmod is correctly
installed it will use it, else there won't be any sound.
* This update has Wagic compile and work under Darwin 64-bits.
- Linux 64-bits is expected to compile and work from now on, but
was not tested. As with before, Linux 64 bits can still run
the 32 bits version.
- Darwin version is not using Carbon but X emulation.
- 64-bits versions have no sound because there is no 64-bits
version of fmod.
- Windows 64-bits probably does not compile. Windows 64-bits can
still run the 32 bits version.
- Darwin 32-bits probably does not work at the moment because the
libfmod requires another name to work on Macs, but as 64-bits
disables it it works.
- Other unix flavors are expected to work as long as they have
a working OpenGL library, X11, and *either* 64-bits *or* a
working fmod. Thus in the practice Tru64, Irix and the like
probably work, as should FreeBSD and other BSDs in 64 bits
versions, but 32 bits versions will search for a non-existing
fmod. All of this is pure conjecture and none was tested.
- All 64-bits versions have no sound.
- The mac version does not display the particles at the moment.
This is not critical, but the cause is unknown yet. I would
like to know if other 64 bits unices share the same bug or if
it is mac-specific.
* Test is needed in particular to see whether the program still
compiles and works in Linux and PSP. Windows is probably all
right, but compiling PSP in windows may be broken by this
update.
Added basic transition system that works with GameApp's phases. Currently does a fade-out between elements, which works well in some places and not-so-well in others. We'll definitely want to think about where and where not to use it... they'd work a lot better if we could spawn a thread to handle loading the next state while transitioning.
Also cleaned up the shop a bit, so it uses ReadButton() instead of GetButtonClick()-- hence the slight change to JGE. Added a tiled image for the task board, which loads conservatively (I tried 128x128, but it didn't look as good).
I'll upload the changes for the OptionItem code in a bit-- I'm a little concerned with that side of things, as I think I recall the reason for using GetButtonClick had something to do with what point in the process the game "eats" the button press... OptionItem stuff relies a lot on button presses falling through to other UI items.
All cards have been tested successfully.
This update contains 2 card groups:
1) Creatures which get a certain power- and or toughness bonus when blocking and/or being blocked. This includes
2) Creatures with "bushido". Works 100%!
This update contents:
1. Creatures which get a certain power- and/or toughness-bonus when attacking or blocking.
2. Creatures which leave the battlefield at end of combat after having attacked or blocked.
3. Clockwork-"family" from Mirrodin.
* Fix another set of 64-bits related problems.
* The code is now expected to compile on linux-64bits, but as I
can't test, I can't be positive about it really compiling,
much less working.
The 3rd auto-line is necessary because without it Mox Diamond will give you the chance to add mana without discarding a land when the "action-choice-window" opens.
* Fixes for compilation on 64-bit architectures :
string position-returning functions return size_t, not uint.
Fix that.
* Fixes warnings with new gcc about non-fixed string AND no arguments.
NOTE : 64-bit architectures still do not compile. There are 2 different places
where printf is used with a specifier that is not large enough on 64-bit because
size_t is now a ulong and not a uint. The solution on GNU systems is the %zu
specifier, but as I'm not sure it is supported on windows I don't want to
introduce a huge hard-to-notice bug, so I'll do it at a time when I got a
windowser to back me up.
After weeks of hard work, I can proudly present you this huge package of cards, based only on already existing card code elements.
Some examples and important notes:
- Cards that get buried if you don't fulfill a condition
1. when they enter the battlefield (Hidden Horror[WEL]; Mercenary Knight, Thundering Wurm [both POR])
2. during your upkeep (Endless Wurm[USG]).
- Cards that allow to draw a card, then discard a card when entering the battlefield or damaging an opponent (Owl Familiar[POR], Looter il-Kor[TSP]).
IMPORTANT NOTE: Those cards work only correctly because the draw effect resolves before the discard effect.
Instants and Sorceries with such effects or permanents that have an activation cost for drawing, then discarding a card won't work because the two effects don't trigger in the correct order.
- Land cycle from Visions and Planeshift (both very puzzling, but working perfectly!)
I also updated World enchantments (tested & working, see rules for them in Gatherer!)
Several card fixes.
If you have any questions, post them! ;)
- fix for issue 301 (creatures go to graveyard)
- This adds an important change to "movedTo", which now accepts a "full" target description in both "from" and "movedTo". The point is that a card does not move to "creature|graveyard" from "battlefield" but moves from "creature|battlefield" to "graveyard".
* Fix a bug where the closest card to the old coordinates of a no more
inplay card would be chosen regardless of whether it complies with the
user's request.
* updated daily build
* Card spoiler now sorts by collector's number.
* Metadata looks for "[m" (for speed reasons), I've been using "[meta]" in files. No sets currently use metadata.
Eventually, the WDataSource stuff will need to be analyzed more in depth. WSrcMTGSet is very similar (though simplified) in functionality to the deck data wrapper stuff.
- fix issue 153 (Tokens should go to graveyard)
- "token" keyword can now be used in the parser with things such as Creature[-token] for "noncreature token"
- Let's stop using "token" as a type
- IMPORTANT: Legendary is not an ability anymore, creating cards with super types should be much more natural. You can now say "type=Snow Land", and stuff like that. No backward compatibility!!!
Crosswinds (USG) - wrong manacost, also copy/pasted to the wrong position in the file
Akroma's Blessing (ONS) - cycling was in an auto= rule instead of an autohand= rule
Riptide Crab (INV) - was missing vigilance
Thanks to Raphael_Carlo for the bug reports
Important: I just realized that the fix to Reiver Demon will probably lead to problems later on. The problem is this: Reiver Demon has an ability "When yu play this from your hand ...". This was coded as @moveto(this|mybattlefield) from(mayhand). Which doesn't work, because the card doesn't actually enter the battlefield from the hand, it enters from the stack. So, "@moveto(this|mybattlefield) from(maystack)" has the desired effect. However, IIUC, spells played from anywhere else (e.g. from the graveyard, if they allow that) should be placed on the stack to. Hence, the "fixed" trigger will also fire in this case, which is wrong.
This means that we can't actually code "played from ..." entirely correct at the moment. Is there a solution for this?
According to the rules, only a copy of a spell enters the stack (never the spell itself), so could the "from()" part access where the card actually came from?
Do we need an @played trigger to differentiate between moving a card and actually playing it?
Notes to programmers:
1. This feature uses an awful lot of copy-pasta, using "protetcion from()" as a base. While I'm learning the architecture, it's easier for me to have a dedicated single-purpose piece of code to work with, than trying to create multi-purpose code. I'm aware that this isn't a very elegant approach though, and I hope to be able to refactor additions like this into multi-purpose code once I have a better understanding of the architecture as a whole.
2. Please check the questions I'll add in my next code comments, specifically about AI integration and activated abilities / instants / sorceries.
3. I did have a crash (with the debugger complaining about stack corruption around the cd variable) during testing. I wasn't able to reproduce it though. I did have to clean the solution in-between when I updated to the primitives system, so perhaps there was this cleaning solved whatever corruption was in my files. I'm mentioning the issue in case someone has an idea on where my code might be risky (I'm still probne to making beginners mistakes).
Thanks to TheDark for the bug report on Urza's lands.
Note that the lands still don't work entirely correct, they give you the option to tap them for one mana even when they shouldn't anymore. This can be fixed when aslongas(cards) <1 is working.
- Card Primitives system. Check Royal Assassin in RV, 10E, M10
- Please review, is sets/primitives a good directory? Should we rename MTGCard into "CardPrint"?
- Unfortunately for now it is not possible to "override" a Primitive. A card that links to a primitive but also defines new "values" will create its own data and ignore the data in the "linked" primitive for the time being. I hope to solve that at some point...
Limitations:
- Operators for "greater than", "less than", "unequal" have not been implemented, but if a card actually needs them, you can use a preceding minus sign to negate a comparison. Example: -power=3 means "power not equal to 3", -toughness<=3 means "toughness>3".
- You can't use spaces when specifying such restrictions. Write "power<=3" instead of "power <= 3"
- You now need to use a space before the "<" and ">" commands that count the matches for lord(), foreach(), all() and aslongas(). So far we always did use spaces in front of them without actually needing to, now we need to.
- manacost restrictions don't take "X" costs into account. Example: Mistmeadow Skulkin (FUT) has protection from manacost>=3. Blaze has a converted manacost of 1, but when you cast it with an X of 2, then it actually has a converted manacost of 3 while on the stack, and Mistmeadow Skulkin would be protected from it, but currently it isn't.
Please review the code, I'll add a few remarks/questions of my own.
Now: auto=@movedTo(this|graveyard,library,hand,exile) from(battlefield) ...
Alternatives:
auto=@movedFrom(this|battlefield) ...
auto=@movedTo(this|*) from(battlefield) ...
auto=@movedTo(this|-battlefield) from(battlefield) ...
Suggestions? How many cards would benefit from such an addition?
There is one important thing about coding such cards in direct combination with "limit:x". You have to put "limit:x" always before "myUpkeepOnly", see Firemane Angel as an example.
An auto line with "...myUpkeepOnly limit:x" does not work! So, the only working combination is "...limit:x myUpkeepOnly".
* Fix a bug where valid directories would be ignored and invalid ones
would be accepted for profiles and themes.
* Fix a compilation fault when compiling in debug mode.
- Loading the "awardback.jpg" file in 16bits instead of 32. This should extremely reduce the probability of crashes (issue 247)
- Added some error debug message for the test suite when a card cannot be found
Note: If you design the layout of a screen, please keep in mind that translators usually need more space than the English terms do, English is a very space-efficient language. I found that I sometimes have to resort to suboptimal translations because the better ones don't fit into the space reserved for them.
Note 2: I've heard about problems with characters taking up a different amount of screen space on Windows and the PSP, so could someone check whether the German texts are inside their boundaries on the PSP? I can only test on Windows.
Gives the user the opportunity to earn some credits for performing various tasks.
Known bugs removed, tested stability-wise, not so much game-wise.
Lots of to-dos and ideas still remaining, better balance between task difficulty and their rewards needed - please comment.
Usage:
Enter shop, open menu, select 'See available tasks'.
All tasks in the list are active, until they expire ('Days left'; day passes after each duel (won, lost or quited)).
You can finish any of the tasks and get bonus. For particular task, the bonus gets a bit smaller every day (until expiration).
EXAMPLE: The older code of Death Pulse was:
autohand={1}{B}{B}:cycling && may -1/-1 target(creature)
I tested this ingame and the following happened:
1. I pay the cycling cost.
2. The engine gives me the option to target a creature.
3. I choose a creature.
4. The cycling effect resolves: Death Pulse goes to the graveyard and I draw a card, but the targeted creature does not get the p/t malus.
This is seems to be because the cycling effect is coded as option ("may") and the cycle process (dicard this:Draw:1) is coded as a "must".
I found a new, successfully tested way to code such cards by giving them 2 autohand-lines instead of only one:
The first one is without optional effect and the second one is with optional effect.
Ingame, if you cycle Death Pulse f.e., a window will appear to choose between those two auto-lines. WORKS GREAT AND DOES NOT BREAK THE CARD!! :)
-fix issue 161 (brass man can untap outside of upkeep). Use "myUpkeepOnly" keyword. Other keywords such as "myDrawOnly" of course work. Haven't implemented "opponent" yet, is it needed ?
- fix issue 168 (kudzu)
- Fix issue 162 (copy VS shroud). This fix introduces a new keyword: NotATarget() instead of Target(). (Which was the best way for me to keep some kind of backward compatibility/ not alter the code too much / fix the bug)
- fixed divergent growth (issue 243). Unfortunately the underlying issue is quite complex, and Wagic doesn't handle it very well. Basically, all "until end of turn" effects run the risk of being partially deleted before the end of the turn, leading to segfaults or memory leaks. This is because some abilities' "clone" method doesn't actually clone them entirely... The fix for divergent growth is a hack that works only for lords+mana producer combination, but I need a more "generic fix" in the long run...
- fix a memory leak with "Prevent All combat damages" ability
- Fix issue 242 (Equip can be used outside of the main phases)
- introducing "attach" keyword. Same as equip but can be used anytime. Untested
- introducing "asSorcery" keyword. Can be used the same way as "myTurnOnly" on activated abilities to restrict their usage. Untested. Other similar keywords will follow, please let me know which ones would be useful
- added Warren Instigator (ZEN) and test script. Thanks to Niegen for finding it.
- temporarily removed angry_mob6.txt from the test suite and added it to the "bugs" section, since the script occasionally fails and we haven't found the reason yet. See issue 240.
- added test script for Fog Bank
- added recently uploaded equipment scripts to test suite (not sure why the weren't added upon uploading them, looks like an oversight)
- fixed another bug in recently uploaded MRD file, it contained Vulshok Morningstar (a DST card with a wrong 9ED id and was inserted at the wrong position in the alphabetical order).
- Fix issue 144 (Sound is either 0 or 100%), for PSP ONLY. The methods are now here for linux/windows, but only the music volume method will work currently, and it sets the volume globally. Patch by Yeshua with some cleanup by myself.
- Adding cycling. Check Akroma's vengeance in ONS for an example. Note that this uses autohand instead of auto, this is important! You can also use autograveyard.
- All "auto" activated abilities should work with autohand, so this is not only for cycling, but could be used for other abilities as well. For example autohand={3}:cycling can also be written autohand={3}{S}:Draw:1
Was a pain(bis) because of the duplicated card.
Note that 6 cards in this set could be added by implementing @blocked trigger : Folk of An-Havva (*2), Ghost Hound, Rashka the Slayer, Root Spider, Serra Inquisitors.
See Todo.dat
- Adding equipments. They work like auras, except you have to add an "auto={cost}:equip" line. See Behemoth sledge in ARB for an example. Please test a lot before committing, thanks :)
This is an atempt to code instant/sorcery with multiple effect.
It work fine, the only borderline effect is that you can "cancel" the card (which in this case does nothing).
+ The AI may be totally unable to use such cards.
My personal feeling is that such card could and should be added.
What do you think about it ?
Additions:
- Added Avarice Totem. Code works, but uses a trick to circumvent a parser limitation. Feedback welcome.
- Added Fangren Pathcutter. Code works, but will fail if Fangren Pathcutter gets removed during the combatattackers phase (currently unlikely though). Feedback welcome.
- Added Goblin Cannon (spectacularly useless card, but codeable)
- Added Silent Arbiter (code works pretty well imho)
- Added Skullcage (doesn't work correctly yet due to bug; issue will be opened shortly)
- Added Thought Courier (has wrong sequence of actions, but is acceptable imho)
Bugfixes:
- Arachnoid didn't have Reach
- Battered Golem was missing a "may"
- softcoded Beacon of Creation
- Beacon of Destruction was missing an alias
- Beacon of Immortality was missing an alias
- Cackling Imp couldn't use its ability
- removed Crucible of Worlds (didn't work on several accounts)
- Krark-Clan Ironworks had an incorrect {T} cost
- Krark-Clan Ogre had an incorrect cost
- Screaming Fury was missing a target
- Skyhunter Skirmisher had double strike spelled wrong
Other:
- experimented with several more cards but couldn't implement them correctly, check the comments in todo.dat for details.
Question: I also tried to code Root Sliver (LGN) with the line "auto=lord(sliver|stack) nofizzle", but this didn't work, Slivers could still be countered. Did I choose a wrong approach, or is there a limitation of the lord ability with regard to spells on thee stack?
- [PSP] pressing START + TRIANGLE on the PSP will attempt to reset the GU. If/when you get the purple screen, try to press start+triangle in the main menu and let me know if it changes something
- Lords are now taken into account in AI statistics. (To display information, uncomment RENDER_AI_STATS in config.h)
- fixed a potential segfault with NoFizzle
-added WParsedInt (X, p, t, manacost) for "Draw" effects. See prosperity
- Fixed denizen of the deep (P02), it had broken the test suite, sorry for that!
I'm fairly certain this works as intended, cards with nofizzle "can be targeted by spells that try to counter it (such as Cancel). Those spells will resolve, but the part of their effect that would counter [it] won't do anything. Any other effects those spells have will work as normal."
Still, I don't work much with card logic, so it's possible this has some kind of unintended side effect.
- Initial Portuguese translation provided by Shinobi. The file unfortunately contains characters beyond the first 128 ascii ones, that will need to be updated
- Code cleanup
- fix issue 142 . This will lead to other issues for some cards. These issues can be fixed by using targetcontroller/controller...etc
- Added a few cards
- removed some unused code. Please review!
- Added protection from() auto keyword. It is still possible to use protection from [color] in abilities, but when it is not possible, please use protection from([target]) in auto=
The thing complicating a "100% functionality" fix for this is that all translation changes are destructive- they overwrite the original text. We want this behavior, as it prevents having two sets of strings in memory (the untranslated and translated sets) when card text currently takes hundreds of kb... however, to switch languages we'd want the original text available, which means reloading all the set files. That's not optimal either...
As it is, the player must reset their PSP for translated card text. Again, not optimal. I'm submitting an issue on this topic.
-fixed a memory leak
- Added P02 and PTK
- New way to create tokens in the parser, much more flexible, see the Hive in RV. Tokens can now be written as other cards, with a rarity of "T". I suggest their id to be the negative value of the card that generates them when possible. Naming convention for images is the same as before: a negative id such as -1138 will need a [id]t.jpg image (1138t.jpg). Positive ids work as "normal" pictures
* Metadata is currently only used in exactly one place: the set's "Pretty Name" is displayed when the set is first unlocked.
* WGuiImage now has a function to set scaling.
- Adding most missing sets. _cards.dat only contain 1 card so that the file is not submitted empty, but other than that...hundreds of cards to add... feel free to copy/paste existing files from the forum if you trust their content
There were a couple of scripts in _tests.txt which were commented out for this reason, I moved them to the new wontfix folder too. I think it's cleaner and easier mto maintain to only have tests in the "tests" folder which actually work and are meant to succeed.
- Added "PreventAllCombatDamage" [from(...)] [to(...)] keyword. Please test it on a few cards before we "mass" use it. As a side effect, fixed issue 155 (ebony horse target).
- Language is now an option at startup
- "text" line translation for cards made easier, check Res/lang/xx_cards.txt
- TODO: test on PSP/Linux, performance issues ? Allow possibility to change language in options menu
-reduced SFX Quality. This seems to fix the Bug with samples getting silent on the PSP (issue 112), and improves loading times. If you think this is unacceptable, let's discuss it
- AI now should play fetchlands' ability, although still not "efficiently"
- Fix a bug where the game would crash if a card has a valid alias to a hardcoded card that is in no _cards.dat (starwars mod cards aliasing a MTG card)
Two new screens (5,6):
5.) Counts of manasources per color and type.
- Basic lands
- Non basic lands
- Other source
6.) Focusing on mana produced by lands only, displaying amounts of each mana potentialy produced graphically, along with percentages - to be easily compared with following screen (detailing mana cost per colors)
I'm back from my break :). I've been using these files over the past few weeks to no ill effect, so have uploaded them here. This is what I've been doing with the other gemstones, as well. I'll look into more elegant solutions later.
(I actually spent half an hour fiddling with my first interruption script, because the tutorial on the blog doesn't mention the any command to end interrupt sequences. Then I checked the "Counterspell" script, was happy to find the "endinterrupt" keyword, and fiddled for another 30 minutes with it before I found out that this keyword is actually wrong and the parser doesn't understand it at all, it just so happens that the Counterspell script (and two others) work nevertheless because in these scripts the interruption doesn't need to end. I wholeheartedly agree with the passage in wololo's mail in which he says that we could use a "real" test suite tutorial / reference.
Also added two scripts that don't demonstrate bugs (apparently the bug reports that I used to write the scripts were either false or outdated). nevertheless it doesn't hurt to have these scripts in the test suite, it prevents us from breaking something for the respective cards in the future and not noticing it.
The script fear_i147.txt has been moved into the "generic" folder and added to the regular test sequence for the same reason.
Also fixed the script generic/tokens.txt. It was referencing The Hive once via name and once via ID. This caused problems when (unofficial) Beta edition _cards.dat was installed.
- Displaying title for each page
- In screen showing games against AI, displaying actual number of games won/played in addition to percentage
- Added two new screens (3,4) - mana cost/color breakdown for creatures (3) and non-creature spells (4)
More to come...
Please note that I don't plan to update this file for future Wagic versions, so if anybody wants to take over, please do. :)
Some files were updated in the process:
- CardGui.cpp - exposed the card rarity info on the alternate render cards to the translation engine. Also switched the color of said info to white on green and blue cards, imho they are much easier to read now.
- GameStateDeckViewer.cpp - exposed the term "Collection" (shown under the scrollbar) to the translation engine.
- GuiPhaseBar.cpp - exposed the strings denoting "your turn", "opponent's turn", "you play", "opponent plays", to the translation engine.
- SimplePad.cpp - exposed the special keys ("Spacebar", "Confirm" etc.) to the translation engine. Had to increase the keypad width to make room for "Abbrechen" (Cancel). I couldn't translate it differently because there's also a *spell* called cancel, and to have a different translation in SimplePad, I would have had to change the official German name of the Cancel spell, which wasn't an option.
- MTGAbility.cpp - exposed the words from which the text of mana-producing abilities is constructed to the translation engine. Please review this one and suggest a better solution - the one I chose is somewhat awkward. The translation works, but when the whole translated sentence is constructed and gets returned, the calling procedure tries to translate it again (all other ability descriptions work this way, translation takes place *after* the string has been returned). However, for mana producing abilities this doesn't work, since the costructed string can take an infinite number of diffeent forms, depending on the mana produced, and we can't translate that. Hence I chose to translate the individual words during construction, with the described side effect that the engine now tries to translate them again later in the process (and the sentence ends up in missing.txt).
- Also, cheat mode menu items now aren't denoted by the ugly "(cheat)" appended to them, instead they are enclosed by asterisks. Uses less space.
- "Fix" issue 152. Please review. There is an extra cost when loading the shop...could probably be improved...the image is huge, and it's a png (so no 5551 improvement here...should we switch to a jpeg ?)
http://wololo.net/forum/viewtopic.php?f=15&t=730
Although the feature is named "cheat mode", its main purpose is to provide a toolbox for content creators. Currently this means to help AI deck creators, but the cheat mode is easily extensible.
Features:
- To enable cheat mode, create a new profile with the super secret cheat name (shouldn't be hard to find - or just mail me if you don't want to look). Then, leave and re-enter the Options menu. You can now enable cheat mode on the first tab. Note: The secret profile name is *not* my original suggestion from the forum, I went with Jeck's alternative suggestion so that he won't have to cringe over bad puns everytime he's using it. ;)
- Complete collection: In cheat mode, there's a new option in the deck viewer, which makes sure that you have at least 4 of any card available.
- Deck integrity: When in cheat mode, and you load a deck with cards that are not present in your collection, then these cards won't be stripped from your deck any more. Instead, they are added to your collection.
- Money cheat: In cheat mode, when you click on an item in the shop, you get the option to steal 1,000 credits from the shopkeeper.
Please review my code - I just started with C++, I may make very obvious mistakes or use inelegant style. The sooner you point this out, the sooner I'll improve.
thanks to wololo and jeck for comments and suggestions.
Jeck: Do the setVisible and setHidden methods currently work? I tried to use them to hide a menu item, but they all seem to lead to empty methods - Perhaps placeholders for a not yet implemented functionality?
* The horsemanship ability literally required only one line of code, and could add an additional ~36 cards to Dr. Solomat's PT3 set. It seems functional, but someone please double check it anyways, as I've not worked with much of the actual game code yet.
- Added -O2 option in the PSP Makefile. In my tests, this highly increases the probability of getting a purple screen. Fixing this bug is THE priority :)
Yes, the card still does not for 100% do what the original card should do, but as long as no one will enchant a land of its own everything will be alright.
This needs some impact testing, to be certain it doesn't noticeably slow anything down. In a future version I'd like to memoize checking for zip file existence in each "Res/sets/XXX/" directory once during boot, and in the themed directory whenever switching themes.
-Load shop and backdrop in 5551. @Jeck feel free to implement the "default as 5551" for jpegs as well if you think it's worth it. I think this change is the safest for the time being, but that's mostly because I'm too lazy to touch JGE
* Restored quad locking to textures, but ignore quad locks when Release(JTexture*) is explicitly called. (I just copied and modified the code from the template, rather than do anything elegant).
* Some minor fiddling with cache error states.
* Removed all calls to Release(JQuad*).
* Updated flatten(). Prior flatten was buggy beyond belief.
* Done some extensive testing, but if this causes more trouble than it fixes, we'll have to revert. It's too close to release time.
Without this quick and dirty fix if you have 2 thieving magpie in play you get twice the bonus if only 1 deals damage (also you draw 2 cards instead of 1).
Disconcertingly enough, this seems to resolve issue 109. Ran demo mode for 1 hour (w00t no crashes!), played five manual games, shop appeared fine... but why would an mObject ever be null? I'm not so sure about this commit. It "fixes" the issue, but doesn't do anything for the underlying cause. For all I know, I might just not have re-encountered issue 109 yet... still, it's not a /bad/ commit. In the worst case, it does some unnecessary sanity checking. There's potential for a a hang if item is NULL in Update(), if input doesn't get passed along in a way that allows the player to exit... But I think that's what the call to JGuiController::Update is for.
Thoughts?
Note: I used Google to match our deck descriptions with existing card flavor texts, and then used Google again to check whether the text was in the public domain (the fact that a verse from the Rime of the Ancient Mariner appears on the Scathe Zombies card, does obviously not preclude us from using Coleridge's work ourselves). I may have missed something in wither process, please report if I did.
For the time being, this is unfortunately a loss in quality, since the official flavor texts were obviously better than the replacement texts I thought up in a few minutes. Feel free to replace my texts with something better. This could be original work of yours, or something that's clearly in the public domain. The latter includes classical literature and poetry btw. We already have Milton, Browning, and Coleridge in the flavor texts, and we could certainly use more of that. Unfortunately I've read about 100 SciFi/Fantasy books for every book of classical poetry I even touched, so I'm in a bad position to provide such material, but perhaps someone else can.
I discussed this change with wololo beforehand, because it required changes to decks that weren't made by me.
Please review / criticize.
* In GuiBackground, we now load and use all of backdrop.jpg. This is for effects like that in Jade. It's an extremely minor change, so shouldn't effect stability.
-fix issue mentioned at http://wololo.net/forum/viewtopic.php?f=4&t=371&p=6296#p6296 . I touched a very sensitive area of the code so please let me know if something goes wrong with this revision with spells or abilities that involve targets and/or sacrifice
* I've tried to keep the same kind of luminosity as the old backdrop.jpg, and matched the psuedo-jade to the colors of the phase icons. I'm still not certain what to do with wood/gold/goldglow, as they clash terribly.
* The whole "recessed playarea" thing was inspired by the recent forum posts of Kaioshin.
Thoughts, comments, suggestions, etc?
- Updated credits, please let me know if I misspelled your name, or if I forgot someone you think is important (don't feel offended if I did, I have bad memory)
Change list:
Taiga: Power Surge not available any more, replaced with a third Orcish Oriflamme
Taiga: removed a stray "a" in the deck description
Savannah: 2x Benalish Hero not available any more, removed (deck has still >60 cards)
Savannah: 2x Mesa Pegasus not available any more, removed (deck has still >60 cards)
Plateau: only 59 cards, added a third Bull Cerodon
Plateau: corrected an (arguable) spelling mistake (goblin -> goblins)
Badlands: only 59 cards, added another Swamp (still only 19 lands in this deck)
Yavimaya: Timber Wolves not available any more, replaced with Scryb Sprites
Shatter: corrected a spelling mistake (you -> your)
Howlins: (supposedly) corrected deckname spelling to "Howlings"
Howlings: only 56 cards, added 2 Mountains, 1 Black Vise, 1 Howling Mine (would've been better to add creatures, but all creatures in the deck were already at 4 pieces)
Alliance: Corrected a spelling mistake in the deck description (castel -> castle)
Djungle: Corrected deckname spelling to "Jungle"
Jungle: Only 56 cards, added 1x Tundra Wolves, 1x Scryb Sprites, 1x Forest, 1x Mountain
Deep Blue: Only 56 cards, added 3 Islands (the comment read "24 Islands" but only 21 were present) and 1 Merfolk
Soldiers (deck24): 4x Balefire Liege not available any more, replaced with 4x Thistledown Liege. This card was not originally present in the deck, but all present cards already had 4 pieces in the deck. The replacement is also pretty weak, please change it if you find a better one.
Kithkin: Added a missing "#" sign
Soldiers (deck29): Renamed deck to "Vigilant Watch" to prevent confusion with deck24.
Vigilant Watch: Corrected a spelling mistake in the deck description (held -> hold)
Depletion: 52 cards, added 2x Swamp, 2x Island, 1x Psychic Drain, 1x Forced Fruition, 1x Tome Scour, 1x Traumatize
Spectral Rack: Corrected "Volrath's Stronghold (TMP)" to "Volrath's Stronghold (STH)"
Kinsbaile Cavalier: Sortened name so that it fits into the menu
Bad Dreams: Corrected "Font of Mythos (ALA)" to "Font of Mythos (CFX)"
Viashino Warrior: Viashino Bladescout not available any more, replaced with Viashino Sandscout
Ashenmoor Cohort: Corrected "Smoldering Butcher (CFX)" to "Smoldering Butcher (EVE)"
Treefolk: Corrected "Mirri, Cat Warrior (M10)" to "Mirri, Cat Warrior (10E)"
Treefolk: Corrected a spelling mistake in the deck description (hidding -> hiding)
Dragon: Changed filename to lowercase
Dragon: 2x Ashenmoor Liege not available, removed (deck still at 61 cards)
Dragon: corrected some spelling mistakes in the deck description (Dragon -> Dragons, wil -> will). Changed deck name to "Dragons" since it's evident from the deck description that plural was intended.
several of my decks: Corrected comments that weren't recognized as such (the "#" sign has to be the in the first column)
Notes:
Three decks have more than 60 cards: Savannah 62, Giants 64, Dragons 61. It's unusual, but no illegal, so I didn't change it. But I didn't see any particular reason for having additional cards in these decks either, so I'm bringing the matter to your attention.
Also, "Howlings" uses 2x Wheel of Fortune (erroneausly listed as "Wheel of Fate", which is a different card that's not yet implemented). Wheel of Fortune is restricted in Vintage. AFAIK we there's no official standing on whether or not AI decks should be Vintage legal, so again I'm leaving this as it is, but bring it to your attention.
1. temporarily removed my "Pyromancer" and "Terravore Turmoil" decks. Both performed very badly in my AI comparison done here: http://wololo.net/forum/viewtopic.php?f=3&t=736
While having low-performing decks is not a bad thing per se (actually we *need* some low-performers, as stepping stones for beginners), these two decks currently throw AI deficiencies into the face of the players (targeting problems / fetchlands), and we don't want to do that. Players should feel that they beat the low-perfoming decks because of their own improving skills, not because the AI can't play its own deck.
I'll re-add both decks after the next release, hoping that we can improve the AI until the release after that.
2. Added "Millage" and "Bad Dreams" decks by Niegen. I see that we are in "bug fixes only" mode since yesterday, but I had announced these additions to Niegen two days ago, and he liked the prospect, so I didn't want to cancel the additions.
3. Updated "Kobold Overlord" deck with two flyers, this is actually a week-old change that I just hadn't submitted so far because it was so minor.
I'll also do a general deck audit to prepare for the next release (respective task will be added to Googlecode tracker). Since we're in "bug fixes only" mode, I'll just fix some obvious mistakes - it's always tempting to do last-minute tweaks and improvements, but I wouldn't want a card or deck that was added late, and hardly tested, to cause problems after the release.
This means we can release the next version with 50 AI decks, more than double than the previous version (which had 24). :)
* We only want to record misses when the file doesn't exist. Item can be null if we're out of memory for whatever reason, resulting in an invalid miss.
* mError status was being reset properly. What I'm thinking happened is that somewhere along the line, a file would miss and return CACHE_ERROR_404. Then, cache.find() would fail because the file was not in the cache, but because mError wasn't reset it would still report CACHE_ERROR_404. In some cases, this would be overwritten (causing the flickering single frame wrong image), and in others this would erroneously report a miss.
* Tested through three demo games and three player games. Shop screen still shows, didn't notice any missing sounds.
* Confirmable options used to only check for confirmation when selecting another option. They now autoconfirm when saving & exiting. This bug could possibly result in loading the wrong theme. Fixed.
* Changing profiles, canceling, then changing to the profile again could also result in improper theme loading. Fixed.
* The alternate theme is just useful for testing themes, but please comment on the changes to the main theme.
* Options reading and initializing separated from UI.
* Options UI abstracted a bit, made more easily extensible.
* With some extension, the options UI could be used as the basis for more complicated themes, if we load a file and use it to do stuff like GameStateOptions::Start()
- fix for issue 108 (mana icon disappears)
- potential fix for issue 110 (victory bonus texts). Need to check
- Fix for issue 100. A better solution would be to "stretch" the cards in hand the way it is done for the rest of the game, but this will do for now as it is a border case
- Fix for issue 55. We'll remove 2 players mode for now, and put it back when/if we get network play
* Some cleaning after r1062 code review.
- Remove code that was never reached.
- Remove a useless function.
- Make GuiPlay treat cards that are both spells and creatures as
creatures and not spells.
DIS additions:cards with Hellbent and some cards with @damaged. Note that "opponent" is not a valid target and "player|opponentinplay" will not work. So for some addition we assume that the creature will never deal damage to its owner (e.g trygon in DIS). Hellbent works fine in the situation described.
- Added @damaged works fine (tested with thieving magpie), please test your additions if you plan to add some cards with this keyword and report if buggy. As the other trigger, you cannot have a target unless there is a may ability.
- Added 2 cards to 10E - Reminisce and Thieving Magpie both tested and working.
- Added 2 cards to LEG - Jovial Evil and Spiritual Sanctuary (not tested yet) but should work.
- fix issue 65 (quads when no image load slowly in shop/deck editor)
- Possibly fix issue 92, please let me know if it reproduces
- Fix issue 97 (Deck editor: weird behavior of deck display)
- Fix issue 39 - please verify
- Issue 56 can probably be closed as well
- Fix issue 86
- wording update
- bug fixes
- Added some cards: Earnest Fellowship, Confessor, Diligent Farmhand & Pardic Firecat.
Diligent Farmhand and Pardic Firecat were easier to add than you would expect (look at Flame Burst & Muscle Burst!). They work 100%!
* Change inplay balance.
- Spells now stack three by three.
- Spells try to space a little more.
- Creatures and land stack to the left until they hit the big card,
at which point they start displaying more compactly. At some point,
they start using all the screen even if it's under the hand.
- some performance improvements
- "daily build". The daily build was compiled in "profile" mode. If you have problems running the exe, or problems with Visual Studio please let me know
- Wording update
- Bug fixes
- Added a few cards. One of them is Progenitus, and this is discussable, because "shuffle" has not been tested successfully yet!
The improvised ability line will always make Progenitus work as it should.
Wanted to add a bunch of cards that use "shuffle" as a keyword.. after the remedy from Herr Doktor in R1050 and the removal of oblation from ONS it gave me the idea that this could be implemented... I wanted to add some cards like darksteel collosus (M10) with something like auto=@movedto(this|graveyard) from(battlefield):moveto(mylibrary) && shuffle well the above does not work ...
Anyway... i'm not sure the shuffle keyword is working... I don't really have a way to test it. Also if some willing soul could have a quick look would be great..
some cards could be added like Boggart Forager (LRW), Oblation (ONS)...
-Issue 26: added an option for Mana Display. This needs a bit testing, but it should also lower the priority of "manapool slowness" as this mode probably fixes performance issue as well.
-I can't seem to be able to "save" some options (hand position, mana display) ion the windows version, does this change break something ?
-more JGE cleanup
-removed calls to BindTexture that were made out of the Render methods. Please let me know if this has side effects (and let's discuss it in that case)
-Still no luck with the purple screen bug :(
- fix issue 69 (Shadow.png load issue) - I put it back to a black 16x16 image. If you need more alpha, use the facilities provided by JGE rather than touching the file, thanks ;)
- fix issue 89 and issue 90 - In the future, we will probably want cardSelector to handle CardDisplay somehow (although carddisplay is used in the Shop as well...)
* Moved shop text ("press square for other cards") etc, to ShopItems, so they rendered properly (all in one place, after AA)
* The AA is really more a proof of concept than anything else. To do it properly I'd need a double-resolution copy of shop.jpg.
* The real multicolored card has a greenish tint, and is darker. What do you think of gold.jpg? Should we tint it more that way?
- opponentshroud small bug fix
- added "kicker=" line and "kicker" auto keyword. See Vines of Vastwood (ZEN) for an example. WARNING: kicker= line has to be AFTER "mana=" line
- daily build
-new trigger: @tapped(...
-Parser now supports X for P/T. WARNING: this does not work for activated abilities. And currently this works only for P/T but will be added progressively to other things
* Displays card set and rarity where artist info would go on a real card. This makes the shop a little more user friendly, and also helps prevent "Card X, possibly from MRQ" confusion.
* Land.jpg contrast in lower left corner modified to work better with white text in that space. I might also modify the green card a bit if others feel it's necessary.
- fixed a bug with Flagstones of Trokair. There was no easy fix (cloned objects deleting stuff from their parents...) and I ended up using a "garbage collect at end of turn" technique the way I did with the ActionStack. As a result, the memory print of a turn will become bigger, and even more bugs might occur at the end of a turn... I'm ready to discuss this, although I think it's the best solution (in terms of result/amount of work) given the way abilities work right now
- Test suite now gives the number of failed/success at the end of the tests
-check athat act of treason works correctly
-Fixed emblem of warmind
-removed incorrect cards ("When this enters the battlefield, target..." please see http://wololo.net/forum/viewtopic.php?f=6&t=669
- fix armadillo cloak test + fix damage assignation step. A side effect is that when clicking on "Go", the game goes to the Damage step instead of going to the combat step. I believe this is acceptable but let me know if this feels weird when playing
- daily build
- fix issue 52 (valid target notification problem) and issue 21 (duplicate)
- fix issue 28 (P/T Position)
- put back shadow for currently selected Card
- Armadillo cloak test is failing, I assume this is related to the Trample fix earlier, and I'll try to fix the test later on
- fix issue 20 (triangle button usage inplay)
- close issue 27 (gold effect on the gold bar). Please feel free to change the gold glow if you come up with something better, but I consider this perfectly releasable now
- code cleanup
* This is a little dirty, as it's loading the profile multiple times. The proper way to do it would be to add any line starting with "unlocked_" to an array for deferred loading. This would also allow us to write those lines back even without the associated set being loaded. The clean solution is on my todo-list now :)
* Affect overflowing damage.
* Reinstate Armadillo cloak test.
. Note that this test does not work at the moment : my understanding
is the TEST is wrong and not the implementation, but I'd like a
double check before changing the test.
* Fixed a call to profileFile() in deck editor that was using the wrong form.
* Spacebar works, keypad now does smart capitalization (switches to lower case on second letter)
text=Destroy target creature. It can't be regenerated. That creature's controller puts a 3/3 green Ape creature token onto the battlefield.
auto=bury && token(Ape,creature,3/3,green) targetcontroller"
Doesn't work, if cast on creature the player is controlling, it works, but when cast on opponent's creature, token ends up on player's side.
-print phase name on the screen. In the middle-term I'd like this zone to be some scrolling text: it will usually show the phase name, but after some inactivity from the player, it would start scrolling and show help messages
CAREFUL : this update REVERSES the triggers default actions.
* Make the right trigger opens the hand and the left trigger skips to
next phase.
* Add an option to reverse triggers (and thus revert to old style).
-Issue 31 fixed. Land and tokens don't use the stack anymore. Taking control of a card in opponent's battlefield doesn't trigger "spell cast" triggers either
- Fix issue #16 (testsuite segfaults if file does not exist)
- Fix issue #37 (Normal Combat Damage is not dealt to creatures when the AI attacks)
- TestSuite now has an "AI" mode (see test/manual/p2_attacks.txt)
* Decks now support naming and renaming. Also added a "Switch decks without saving" option.
* Removed unused static const char * menuTexts, from old 6-deck limited system
* Keypad didn't display correctly when not given a title, and was never destructed. Fixed.
* profileFile() default behavior was to fall back to RESPATH/player. Fixed.
* New iconspsp.png, updated look to seem like PSP buttons, added some extra (unused) button icons.
* Yeah, it's kinda gratuitous. I was playing with various overlays, and this is really the only thing I could think of, given the limited space. Blood and rust just look wrong, fading in like that... and the area for text is really limited the card, from the Wagic logo down. Feature notes like "Single and multiplayer! Over 3000 cards!" just look cramped there, and detract from the overall image.
Exception handling in the cache means that Wagic runs slightly, but noticeably slower. However, it also means that the cache works the way it was intended to, and should prevent all sorts of awkward errors I introduced because things were half-allocated or worse.
I've learned my lesson from tonight, and once I get this stuff put back together without exception handling I think I'll self-impose a manditory 24 hours debugging time before any commits. Sorry for the inconvenience.
If for some reason you can't compile with exceptions, r862 should be completely without them. Again, wow, this was stupid-- I hadn't even realized exceptions were off for like 24 hours, as the compiler wasn't producing warnings.
Apologies,
—Jeck
* Restored OptionItem saving fix.
* Booster duplicate replacement was picking random cards from the wrong set. My fault, but I've fixed it :)
* The problem with cache had nothing to do with memory fragmentation, but I've switched to an array rather than map<> just in case. The actual issue was that in GameStateDeckViewer, I'd given the cache unlimited space, thinking that AttemptNew would recover from any bad_allocs. Unfortunately, the image loading routines and similar stuff called by various implementations of WResource::Attempt() could fail halfway through, leaking memory.
The temporary solution is to set a proper limit (8000000 px, more or less) and (in case we still run out of memory) test to make certain CACHE_SPACE_RESERVED can be malloc'd/free'd. The proper solution would be to keep byte-perfect records of memory used (right now we're kinda fuzzy-- we track pixels per image and bytes per sound, but not the space for jquads or other incidentals) instead of testing a malloc, and potentially cleaning up all calls inside of Attempt() so they fail without leaks. That's what I'm working on now.
Still, it's nice to have identified the problem. This version of the cache should be fully functional, it's just a bit inelegant.
* mtgid now defaults to 0.
* TextScroller will not update when empty.
* Cache now moves WCachedResources we're finished with to a garbage pool for later use (to reduce memory fragmentation).
* Demo still crashes... but I'm thinking that has to do with fragmentation, not a leak?
* Numerous cache fixes, reduced filesystem access.
* Cache fails very gracefully.
* Cache is now a templated class, with individual caches per data-type.
* Much easier to extend.
* Extensively debugged. Try compiling with -DDEBUG_CACHE.
* Caches limits can be set on a per-item basis.
* hgeParticleSystemInfo are now cached, mana particles now fall back to defaults.
* Samples are not cached, but track filesystem misses using the cache backbone.
* Avatars are cached. Default baka avatar is now baka.jpg, to prevent collision with player.
A note on the retrieval types:
RETRIEVE_MANAGE puts a resource into a seperate, managed resource list.
Managed resources are guarenteed valid for the lifetime of the program.
Retrieving a managed quad promotes the associated texture to managed. Don't do that by mistake.
Calls to Resources.Refresh() will attempt to reload managed resources in place.
RETRIVE_LOCK (and by extension, RETRIEVE_VRAM), returns a resource after locking it.
A resource may have many locks, and remains in cache until they are all released.
If the resource is managed, it returns it unmodified.
A note on quads:
Unlike all other RetrieveWhatever() functions, the default behavior for RetrieveQuad is RETRIEVE_LOCK. Worse, Release(JQuad*) is slow, and will /always/ release one lock from the associated texture.
There's a long and complicated explanation for this, involving support for live relinking of textures to existing quads, but basically what it means is that we only use RetrieveQuad for quads we intend to store and later Release(). If a temporary quad is needed, the preferred method is to use NEW JQuad* and SAFE_DELETE with RetrieveTexture(). RetrieveTempQuad is also provided, but is only guaranteed until the next call to the cache.
Note that RetrieveCard has none of these problems.
- Fixed empty ActionStack "interrupt" messages
- If no attackers are declared, go straight to Combat end phase
- Once First strike damage is declared, attacking player needs to "actively" request a next phase event to go to the next damage step
- Second Damage step is called "Combat Damage (2)"
- UserRequestNextPhase is to be used knowing that it might not succeed
- Step change for GuiCombat is now computed at GameObserver::nextGamePhase
Note: Combat damage to creatures is not assigned when AI attacks. As this seems to be a problem with the previous SVN version, I4m still committing this change
-fixed problem with lifelink+wither, although combat damages are not entirely correct. Once combat damages actually deal the correct amount of damage, let's put test "armadillo_cloak" back in the suite
Example: all creature gets +1/+1
auto=lord(creature) 1/1
Example2: pay {2} all other creatures get +2/+2 and flying until end of turn.
auto={2}:lord(creature) 2/2 other ueot && lord(creature) flying other ueot.
Example3: Whenever a player put a creature onto the battlefield, all creature that player controllers attack this turn if able.
auto=@movedTo(creature|battlefield):lord(creature|XYZ player) mustattack ueot
* Cache now tracks missing textures for RetrieveQuad, not just RetrieveCard/RetrieveTexture.
* Profile options are no longer overwritten when switching profiles.
* Main menu notifies of alternate profile- "Database: X" becomes "Profile: Y of X cards."
* Boosters iterates through cards, replacing duplicates. Stops after 15 tries to prevent infinite loops on small sets.
* Very simplistic theme switcher, only displays when alternate themes are present.
* F3 font had an issue where the j and y dangled into the characters below them. I fixed this by shifting all characters one pixel up, but this does change the way f3 fits when rendered. The alternative would be just to clip the dangling pixels off entirely.
* Add the Trash facility and use it for CardViews.
* Fix a graphical bug with card shadows.
* Fix a graphical bug with limitors.
* Enhance the graphical appearance of cards going to graveyard.
* Locked resources are now guaranteed, though they currently share memory limits with the cache, so be certain to release them when you're done.
* RetrieveQuad now returns different quads for different resource names, regardless of if they share size and position.
This is pretty major, so there'll probably be something wrong with it... even though I did spend a few hours looking.
NOTES:
* If you've Retrieved it, don't delete it--- Use resources.Release(Whatever).
Textures automatically release subordinate quads.
* Most of the time, use resources.RetrieveQuad to grab a quad. Should handle everything for you.
RetrieveQuad will load the required texture, if needed.
Only managed resources have a resource name ("back", "simon", etc).
Managed resources can be retrieved with GetTexture/GetQuad/GetWhatever.
Non managed quads lookup by position/dimensions, defaulting to the whole texture.
* Use resources.RetrieveTexture only when you need to do something special to it.
Calling retrieve texture with RETRIEVE_MANAGE will permanently add a texture to the manager
RETRIEVE_LOCK and RETRIEVE_VRAM will lock a texture. It will not leave the cache until
Release(JTexture*) is called, or as a last resort during cache overflow.
* Try to only store (as a class member) pointers to textures retrieved with RETRIEVE_MANAGE.
All others may become invalid, although locked textures do have a high degree of stability. It's
pretty safe to store a locked texture if you're not going to load much between uses.
There's a lot going on here, so I might have missed something... but it runs through the test suite alright.
TODO:
* When called without any arguments, RetrieveQuad sometimes leaves a thin border around the image.
This can be bypassed by specifying a quad one or two pixels less than the image size. Why?
* I've had a crash while runing the Demo mode, something to do with receiveEventMinus?
This hasn't exactly reproduced on a clean SVN copy, (being a hang, rather than a crash) so
I've probably done something to worsen the problem somehow? I'll look into it tomorrow.
* Clean up lock/unlock system, memory usage. Streamline interface, consider phasing out calls using GetWhatever() format.
- removed useless "color=" lines
- Added color override for cards such as crimson kobolds (note: color should be after the "mana" line to avoid side effects)
* New interface.
* This breaks a lot of things. It is not feature-equivalent. It
probably doesn't compile under windows and doesn't work on PSP.
* Damage is not resolved any more. This will have to be fixed.
* Blockers can't be ordered any more. This will have to be fixed.
* A lot of new art is included.
- InGame Text display is now an option
- Fixed *Duos in SHM, benalish knight, beeligerent hatchling, removed demigod of revenge (needs extensive testing)
- added "ueot" for p/t and abilities gaining in the parser, as part as the fix for safehold duo
Also you can see in the todo.dat I tried Sift, Stampeding Wildbeast and Denizen of the Deep, all not working...
Also the following cards can probably be parsed: 1205: //Lifetap; 1625: //Lifeblood; 2593: //Thoughtleech and removed from both MTGAbility.cpp and Allabilities.h (for AGiveLifeforTapped***)
Grü
L.
Removed Reclusive Wight + Imaginary Pet, they don't work.
(10E) Stronghold Discipline is doing double the amount of life lost.
Going to test on more aslongas cards, appears some pharse doesnt go with aslongas at the moment.
- fixed a bug with bottle gnomes (would give life to opponent even if you steal control)
- huge update for abilities life,draw,damage,deplete,discard in the parser. This breaks some cards (so we need to fix them) but allows more flexibility in the future. See my post on the forum
- added counters to parser. They can be used as an effect, not a cost!!! counter(p/t,n) where n is the number of counters. if n is ommitted, it is 1, if it is negative, it means "remove" counter
- fixed a bug (crash if a card that had an ability until end of turn would be put into the graveyard before the end of the turn)
- Added a new game Mode : Random 1 or 2 color.
- no more 5 decks limitation for Player
- Player decks can be given a name/description the same way we do for the AI. No PSP Gui for that yet though, has to be done outside of Wagic (PSPWrite ?)
- fix PSP Compilation issue
- Stillmoon cavalier (and other "until end of turn" activated abilities) bug fix
- attempt at fixing multi abilities that work "only from time to time"
-added telkinetic sliver. This confirms that All lords that give a "complex" ability can now be added in cards.dat, as long as we can write the ability.
For example: lord(sliver) {T}:tap target(*) for telkinetic sliver. Please test and let me know
- Updated Parser mechanism. Right now this doesn't change functionalities much, but should be more readable, and make it easier to code some new abilities in the future
- Fixed regenerate, broken with r532
- Death Ward now works
- I think "&&" now works with all abilities, needs to be tested...
- Added onslaught, future sight, exodus, champions of kamigawa, Fallen empires, Time Spiral
- NOT TESTED, I just made sure the files where not crashing Wagic on the PC version. Have fun updating these files, guys :)
- Moved "extraPayment" cancel verification into ActionLayer (was in GuiLayers)
- added "HUDDisplay" MTGAbility (displays damage/graveyard info)
- Added option to NOT interrupt own's spells and abilities. Allows smoother gameplay. We should add a "quick options" menu ingame to change those options on the fly
ALifeModifierPutinplay is now with TargetChooser, means it can probably be used for a wider range of cards (need to test megrim...).
Also updated MoveAll (should now be able to target graveyard and hand).
Last update is on the "countcards" means all foreach should now take graveyard and hand as legal target... .
I did not test these additions yet...but test suite runs fine (it includes ankh of mishra so it means the first modification should go fine...).
If everything work fine it means also some hardcoded cards could be removed and softcoded like spoil of war, spoil of evil, ancestor choosen.. etc...
Grü.
L.
NOTE that all these additions to the foreach parser are only available for the "inplay" area... "countcards" will need to be updated in order to have thing such as graveyard or hand to be taken into consideration (but when it will be done cards such as Spontaneous Generation - MRQ, could be added)
Also updated (tentatively) the "cantbeblockedby" in the parser it still does not work...ARG... but I can feel that I'm not far away from the solution...
We need also to go through some of the cards.dat to be sure we are not missing any possible addition ...
I tryed everything for weeks, adding lines of codes with no success...Finally the answer was so simple as 2 lines of code...
Also added/removed from code Spitting earth and corrupt... Need to chase and remove all the lookalike/alias in the rest of the code. And also as usual will require further testing...
Grü.
L.
Test suite passed with exception of Hymn of rebirth ?? also at least dingus egg is also OK.
Ideally the whenever thing should be coupled with a kind of targetchooser thing to be put in the parser (would also allow colored cards...) ..
Todo: add a may ability option since lot of cards with this function use "may" (e.g. Deathgreeter - ALA and Leonin Elder - MRD)
I did not remove the now obsolete code dingus egg and ankh of mishra...will wait until new portion of code is tested more..
Grü
- Replaced the BasicAbilities Array with a map. This reduces the size of MTGCard from >500 bytes to 392. Should be cool for people who have memory issues
PLEASE REVIEW this one.
I removed all unusued portion of code, some other cleaning work could be performed (will discuss in forum).
Also just added "@each" as triggered ability in order to have it work properly with most cards "currentplayer" should be added to the TargetChooser.
- Magic 2010: Combat Damages don't go on the stack anymore
- Comp rules: "goes to graveyard" effects don't go on the stack anymore
- Regenerate "fixed" (untested)
- Basic "ReplacementEffect" mechanism for damage prevention. Can be extended to other replacement effects with some limits.
- TODO: Damages don't go on the stack, the abilities that create them do.
Few comments:
I spent quite some time to make it work... made some test all working but experienced some random crash in windows version (debugging did not help much) don't know if i broke something or if it is due to other SVN addition.
Some other cards are similar and could be hardcoded/aliased (Overtake - MRQ, Ray of Command - ICE,MIR, Slave of Bolas - ARB, Spinal Embrace INV, Unwilling Recruit EVE) we could discuss about them...
I think it is the last card that was missing for the red premade 10E deck. Now 10E has 255 cards and is the set with the most cards...
Grü.
L.
* Add the rolling phasebar.
* This is a preview version. It shares most of the code with the definitive
version, but when the real code is checked in, this will be deleted.
Added Graveborn Muse (just missing one muse now, too complicated for me).
Added Beacon of destruction,unrest and immortality.
Added Traumatize
Added Verdant Force
All tested (except beacon of unrest) and working.
Added "untap all" to the parser (not tested but should work since it is the same as tap all)
Modified "cantbeblockedby" also still don't function properly, atm it cause the creature to be "unblockable"... Should work, I don't get it !!! (Why ???)
Also added Seedborn Muse (like all the Muse a very Powerfull card), especially as combo with cards that "DOESNOTUNTAP" during your untap phase...
I tested Elven Riders successfully, but not juggernaut yet... Also if this new keyword function correctly we remove abilities like FEAR and UNBLOCKABLE... Needs to be further tested...
Feedback and extensive test are welcome on this one...
Added ability DOESNOTUNTAP , see _cards.dat from 10E (Colossus of sardia, dehydratation). Test suite OK. The ability does not work with enchant creature (as for protection from...) So Dehydratation is hardcoded (can be aliased if necessary) Small bug with dehydratation, will untap creature when cast... WHY ? Any Idea/Solution welcome...
- Magic 2010 - inplay becomes Battlefield. Wagic is still compatible with both, but try to use "battlefield" from now on. For example moveTo(battlefield) instead of moveTo(inPlay)
- Magic 2010 - "Removed from game" becomes "Exile". Wagic is still compatible with both, but try to use "exile" from now on. For example moveTo(exile) instead of moveTo(removedFromGame)
- Magic 2010 - "End of turn" step becomes "end" step. Wagic is still compatible with both, but try to use "end" from now on. for example: "@next end" rather than "@next endofturn" (not sure this is more clear than before, but at least it's consistent with the rules)
* Replace french special characters by closest approximation.
* Note : if you're not removing them, at least save the file in a
safe character set, like UTF-8, NOT latin-1 or what Notepad
calls "ANSI".
- Fix: cards in graveyard had shroud
- Fix :shop item "quantity" increased if bought in a booster
- Test for Recover -> no problem found, but there's a GUI issue, which will be fixed later
POR - Removed Man'O'War + Added Hulking Cyclops, Hulking Goblin, Nature's Cloak, Gravedigger, Fire tempest, Dry Spell,Craven Knight, Craven Giant (sorry for this addition could not refrain after seeing them, were probably forgotten)
TMP - removed Cloudchaser eagle
LEG - Corrected Concordant Crossroad
USG - Removed Dark Hatchling, Monk realist
RAV - REmoved Keening Banshee, also tentative to fix Tolsimir Wolfblood (legendary is not working)
EVE - REmoved Noggle Bridgebreaker
Also made an update and added silly name for AI deck + note that deck 22 is using cards from morningtide and deck 23 cards that the AI do not use correctly (activated abilities) but is not the only one, AI decks needs update/amelioration.
- Ashen firebeast bug fix
- Small cards bug fixes
- Bloodfire colossus bug fix
- Graphical glitch in Opponent deck's choice when Deck name is too long... attempt to fix, let's be careful, no more than 9 letters in Deck names, please
- Updated Tranquil domain test. It was using cards that have been removed from the DB
- replaced /n/ with (n) in shop
Please use ":" in auto lines correctly (only for power/toughness changes (examples: "auto=:1/1"), not for others ("auto=:trample" is wrong, won't give the ability to the creature; "auto=trample" is correct)!
- fixed card id collisions in Legends, Ravnica, Portal
- Changed Deck and Database structures with better design (a bit faster, hopefully a lot cleaner)
- updated Windows project file
* Performance improvement for the deck editor when scrolling cards
(transform 2*N*log(N)<Cmp1> + N*<read> into log(N)<Cmp1> +
N*<read>). I expect this improvement to be much more significant,
performance-wise, than last night's one.
RAV - Removed Empty the catacombs & Galvanic arc, tested and does not work. Note that the moveto all function is only for "inplay" you cannot target anything else at the moment (evacuation 10E works fine). Also cards like galvanic arc ("when put in play then") are not working 100%, e.g. "Sparkmage Apprentice" has a very strange behaviour, could anyone look at this one and confirm ?
LEG - Removed Abomination, make the game crash, need to look at this one, in the meantime I've removed it. Corrected Chromium
ARB - Added Intimidation Bolt
ALA - Added Rockcaster Platoon
Also note that flanking has never been added to the source, although I had planned to do so, nobody will ever notice since nobody use this stupid ability but nevertheless some cards may need to be removed...I've removed together with the old rampage ability at REV 347:
http://code.google.com/p/wagic/source/detail?r=347
Grü
L.
Updated the deplete function. You can use deplete in instant and sorcery (not tested)
Updated rampage (add an issue with the last parameter and the annulation of the bonuses at end of turn) should be resolved now (not tested).
Added Basilik from 10E and also lavaborn (not tested yet), should try to do a more generic basilik (abomination, cockatrice, basilik, all have the same abilities but different criteria for the “type” of creature that would be or not be affected.
Also added Elvish promenade from LRW (this one is fun ;D)
MRD added Seed of innocence
INV added aura and artifact mutation (but strange reaction if you bury target from opponent)... works anyway... test it and you will understand... ;)
Did not try it yet without target (e.g. when comes intoplay auto=discard:19 probably will not work and would make the opponent discard a card randomnly...
Finally tested the "may moveTo" function physically, it works, but there is this slight bug (that doesnt harm anything) but say "when XYZ comes into play, you may move 123 from your graveyard to your hand" you play XYZ, and choose 123 from your graveyard, you selected 123, but it still appears to be still in the graveyard, even thought i really have returned to your hand, but if u exit the graveyard and goes back in again, it really have disappeared.
(i think its better to see it yourself... getting too wordy)
- ICE complete update, reorganized all cards alphabetically both in cards.dat and todo.dat + some few addition
- tentatively added a generic millstone, first step to add the keyword "deplete" to the parser.. still working on this one.
- Added a few "stats" to the main menu. This might slow down loading times on the PSP (needs testing). In that case I'll move it to the options, or optimize it if needed
* Update for interface change.
- The new arguments, being PSP-specific, are ignored (same as windows
version). It might be surprising and not very readable, but it does
what makes the most sense in our case.
- a few bug fixes with cards that bring other cards back to play (zombify, resurrection...)
- bug fix with abilities parsing "reachshadow"
- a few card fixes
- add Mercadian Masques, Mirrodin, Odyssey -> let's do some cleanup!
- Attempt at solving a bug with AI+psychic venom (manaburn), not tested
- Added Abrasax's monocolor AI decks
- Momir better randomizer
- Removed 64 Abilities limitation, I hope...
-Fixed: Dark Banishing,Walking Wall, Pyknite,Snow Fortress,Blessed Wine,Touch of Death,Lhurgoyf
-Removed: Spectral Shield, Incinerate,Stampede,Warning,Word of Undoing,Icequake, Thermokarst,Essence Filter,Legions of Lim-Dul,Rime Dryad,Rime Dryad,Soldevi Machinist,Skeleton Ship
there are worrying number of cards removed, I believe that arent hardcoded, maybe I was too tired, but I am pretty sure they weren't hardcoded.
switched all cards discription to Oracle's version
- fixed a few bugs with the parser for subtypes
- fixed a bug for plague rats
- fixed a bug for P/T parser
- First release for the following sets: Mirrodin, Mirage, Lorwyn
- Added WEvent class, allows to send events to abilities
- Cards that change zones now becomes new objects (as specified in the Comprehensive rules). This should allow to fix lots of stupid bugs in the near future, but probably brings loads of new issues :(
- Bug fixes for Kird ape(RV), Dingus Egg(RV), Ankh of Mishra(RV), Ancient Tomb(TMP), Wooded Bastion (SHM)
- Added tests in the test suite to confirm/infirm some bug reports
- new Ability : ALifeGiver (bottle gnomes)
- Added a few cards from Tempest
- Hybrid mana fix for hybrid mana involving uncolored mana costs (see tests/generic/hybridmana2.txt - spectral possession)
- Fixed bugs with targetting for TargetAbilities
- Fixed multiple sacrifice abilities cost (Siege gang commander, see tests)
- Fixed a small font issue
- Added CC Avatar
- Fixed a segfault bug when selling cards
- Added a few messages in the credits
- Show types of a card in "Alternate" display
- This update should get rid of all copyrighted contents
- Added Dr Solomat's TEMPEST expansion
- Added Sacrifice as part of the cost of activated abilities. Making it work as an extra cost for "put in play" still requires some work though. "Render" methods need to be written correctly
- Added cards with sacrifice in the existing sets. Most of them need testing...
- Parser: Added possibility to add multiple abilities for one cost, using keyword && (see Ardakar wastes in 10E). Currently only works with mana and damage
- Added a dozen new cards
- Improved testing suite : new keyword "choice" to select an item in the abilities popup menu
- Updated alternate render
- Display hybrid mana cost on alternate Render
- Display big card in graveyard
- gray out alternate render when targetChooser is active
- Non-copyrighted avatars for the AI. They suck...
- Prevent TestSuite from crashing, by not showing big cards during the test suite
- Updated font size in game, to be readable
- WARNING!!! One test (brass man) not working anymore !!! High priority
* Remove errors when including nonexisting auto-generated makefiles,
but still generate and re-include them (that is to say, just work).
* Remove the "generating makefile" message that is generally totally
not interesting.
* Clean up the tree : don't leave objs in the middle of the source.
* A real makefile that works. - at least under a POSIX OS, we'll see the
crap ones later
- improved the parser for "lord", now can take any kind of "target", not only creature types (so it can now be used to code abilities such as Bad moon and crusade)
- fixed typos for goblin lord, zombie master, lord of atlantis
- Added "moveTo" keyword
- added a dozen cards
- display the thumbnail as a "shadow" over the text version of the card if the big picture is not available
- fixed a bug with circles of protection, although graphically it is difficult to understand what's going on when using those cards
- fixed a bug with a card in Ice age
- AI:increased percentage of chance to play an "unknown" Card
- removed delay before displaying big card ingame
- added 2 new AI Decks
- Fixed a bug with afflict (see tests/afflict.txt)
- fixed a problem with DOS card files under psp/linux
- Added a bunch of SAFE_DELETE, not sure they're really necessary
- fixed a small interface problem in Shop
- fixed the lib to play WAV file (erased too much things in a previous update)
- Updated wav sfx to be playable on the PSP (need to update the lib to accept more formats ?)
- There is still a bug with sfx on the PSP, I suspect I'm erasing files while they are being played !
- It is now possible to have avatars associated to each Deck
- Added SFX
- Added Music files
- Possibility to choose your opponent
- Opponents' difficulty is measured according to their number of victories against a given deck
- Fixed MP3 play bug on the psp. MP3 files need to have NO Id3v2 tag, or they won't play. Also, volume control is broken
- added dt to moving W's easter egg movement.
- Added fullscreen for windows version
- other stuff ?
- I DID NOT TEST THESE CHANGES, I Don't know if this revision compiles
- Merged my code with r21 from Abrasax (I had mistakenly removed some of his changes)
- fixed a few warnings with the PSP compilation
- changed definition of DWORD to unsinged int rather than unsigned long for PSP
- fixed make 3xx. the call to "which" in the makefile still needs to be corrected with a DOS compatible call
- Added the possibility to narrow a spell/ability target according to color,tapped status, attacker/blocker, abilities...
- Changed the games phase system to become a phaseRing. This allows to add cards that have an impact on the phases, such as stasis
- Added a few cards
- Fixed a (windows) bug in gatherer tool
- Adding stdint.h for VC++ (see wikipedia->stdint.h)
- deleting the compiled PSP lib to avoid confusion. People who work from the sourcehave to compile the lib by themselves.
Added the Tap in the parser (works)
Removed the code from MTGAbility that could be added in the cards.dat and modified cards.dat
Tryed to add the shadow & landshome ability (does not work properly)
Added the maxtoughness in targechooser--> added the card Aegis from ICE AGE
#error "Compiler not supported or configured - please reconfigure"
#endif
//
// last known and checked version is ...:
#if (__DMC__ > 0x848)
# if defined(BOOST_ASSERT_CONFIG)
# error "Unknown compiler version - please run the configure tests and report the results"
# endif
#endif
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.