Added/fixed primitives, updated the "missing_cards_by_sets" folder, added a new trigger when a player shuffles his/her library, added new keywords "plastshlturn" and "olastshlturn" to retrieve the last turn a player shuffled his/her library, refactoring of some source files.

This commit is contained in:
Vittorio Alfieri
2021-08-30 23:02:54 +02:00
parent e1f91a50f6
commit 45de20c8d3
42 changed files with 584 additions and 737 deletions
+20 -12
View File
@@ -1194,35 +1194,43 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
//energized player - controller of card
if (TargetChooser * tc = parseSimpleTC(s, "energizedof", card))
return NEW TrplayerEnergized(observer, id, card, tc,once,true,false);
return NEW TrplayerEnergized(observer, id, card, tc, once, true, false);
//energized player - opponent of card controller
if (TargetChooser * tc = parseSimpleTC(s, "energizedfoeof", card))
return NEW TrplayerEnergized(observer, id, card, tc,once,false,true);
return NEW TrplayerEnergized(observer, id, card, tc, once, false, true);
//experienced player - controller of card
if (TargetChooser * tc = parseSimpleTC(s, "experiencedof", card))
return NEW TrplayerExperienced(observer, id, card, tc,once,true,false);
return NEW TrplayerExperienced(observer, id, card, tc, once, true, false);
//experienced player - opponent of card controller
if (TargetChooser * tc = parseSimpleTC(s, "experiencedfoeof", card))
return NEW TrplayerExperienced(observer, id, card, tc,once,false,true);
return NEW TrplayerExperienced(observer, id, card, tc, once, false, true);
//becomes monarch - controller of card
if (TargetChooser * tc = parseSimpleTC(s, "becomesmonarchof", card))
return NEW TrplayerMonarch(observer, id, card, tc,once,true,false);
return NEW TrplayerMonarch(observer, id, card, tc, once, true, false);
//becomes monarch - opponent of card controller
if (TargetChooser * tc = parseSimpleTC(s, "becomesmonarchfoeof", card))
return NEW TrplayerMonarch(observer, id, card, tc,once,false,true);
return NEW TrplayerMonarch(observer, id, card, tc, once, false, true);
//shuffled library - controller of card
if (TargetChooser * tc = parseSimpleTC(s, "shuffledof", card))
return NEW TrplayerShuffled(observer, id, card, tc, once, true, false);
//shuffled library - opponent of card controller
if (TargetChooser * tc = parseSimpleTC(s, "shuffledfoeof", card))
return NEW TrplayerShuffled(observer, id, card, tc, once, false, true);
//drawn player - controller of card - dynamic version drawof(player) -> returns current controller even with exchange of card controller
if (TargetChooser * tc = parseSimpleTC(s, "drawof", card))
return NEW TrcardDrawn(observer, id, card, tc,once,true,false,limitOnceATurn);
return NEW TrcardDrawn(observer, id, card, tc, once, true, false, limitOnceATurn);
//drawn player - opponent of card controller - dynamic version drawfoeof(player) -> returns current opponent even with exchange of card controller
if (TargetChooser * tc = parseSimpleTC(s, "drawfoeof", card))
return NEW TrcardDrawn(observer, id, card, tc,once,false,true,limitOnceATurn);
return NEW TrcardDrawn(observer, id, card, tc, once, false, true, limitOnceATurn);
//Card card is drawn - static version - drawn(player) - any player; drawn(controller) - owner forever; drawn(opponent) - opponent forever
if (TargetChooser * tc = parseSimpleTC(s, "drawn", card))
@@ -7166,7 +7174,7 @@ ostream& ListMaintainerAbility::toString(ostream& out) const
return MTGAbility::toString(out) << ")";
}
TriggerAtPhase::TriggerAtPhase(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who, bool sourceUntapped, bool sourceTap,bool lifelost,int lifeamount,bool once) :
TriggerAtPhase::TriggerAtPhase(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who, bool sourceUntapped, bool sourceTap, bool lifelost, int lifeamount, bool once) :
TriggeredAbility(observer, id, source, target), phaseId(_phaseId), who(who), sourceUntapped(sourceUntapped), sourceTap(sourceTap),lifelost(lifelost),lifeamount(lifeamount),once(once)
{
activeTrigger = true;
@@ -7252,7 +7260,7 @@ TriggerAtPhase* TriggerAtPhase::clone() const
return NEW TriggerAtPhase(*this);
}
TriggerNextPhase::TriggerNextPhase(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who,bool sourceUntapped, bool sourceTap,bool once) :
TriggerNextPhase::TriggerNextPhase(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who, bool sourceUntapped, bool sourceTap, bool once) :
TriggerAtPhase(observer, id, source, target, _phaseId, who, sourceUntapped, sourceTap, once)
{
destroyActivated = 0;
@@ -7277,7 +7285,7 @@ TriggerNextPhase* TriggerNextPhase::clone() const
return NEW TriggerNextPhase(*this);
}
TriggerRebound::TriggerRebound(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who,bool sourceUntapped, bool sourceTap,bool once) :
TriggerRebound::TriggerRebound(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who, bool sourceUntapped, bool sourceTap, bool once) :
TriggerAtPhase(observer, id, source, target, _phaseId, who, sourceUntapped, sourceTap, once)
{
destroyActivated = 0;
@@ -7441,7 +7449,7 @@ GenericTriggeredAbility* GenericTriggeredAbility::clone() const
*/
AManaProducer::AManaProducer(GameObserver* observer, int id, MTGCardInstance * card, Targetable * t, ManaCost * _output, ManaCost * _cost,
int who,string producing,bool doesntEmpty) :
int who,string producing, bool doesntEmpty) :
ActivatedAbilityTP(observer, id, card, t, _cost, who)
{
+5
View File
@@ -1197,6 +1197,11 @@ void MTGGameZone::cleanupPhase()
void MTGGameZone::shuffle()
{
owner->getObserver()->getRandomGenerator()->random_shuffle(cards.begin(), cards.end());
if(this == owner->game->library){
owner->lastShuffleTurn = owner->getObserver()->turn;
WEvent * e = NEW WEventplayerShuffled(owner); //Added to trigger an event when a player shuffles his/her library.
owner->getObserver()->receiveEvent(e);
}
}
void MTGGameZone::addCard(MTGCardInstance * card)
+1
View File
@@ -42,6 +42,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck *
monarch = 0;
surveilOffset = 0;
devotionOffset = 0;
lastShuffleTurn = -1;
epic = 0;
forcefield = 0;
dealsdamagebycombat = 0;
+11
View File
@@ -297,6 +297,11 @@ WEventplayerMonarch::WEventplayerMonarch(Player * player) :
{
}
WEventplayerShuffled::WEventplayerShuffled(Player * player) :
player(player)
{
}
WEventCardBoasted::WEventCardBoasted(MTGCardInstance * card) :
WEventCardUpdate(card)
{
@@ -622,6 +627,12 @@ Targetable * WEventplayerMonarch::getTarget(Player * player)
return NULL;
}
Targetable * WEventplayerShuffled::getTarget(Player * player)
{
if (player) return player;
return NULL;
}
std::ostream& WEvent::toString(std::ostream& out) const
{
return out << "EVENT";
+4
View File
@@ -1303,6 +1303,10 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
{
intValue = (s == "pexperience")?card->controller()->experienceCount:card->controller()->opponent()->experienceCount;
}
else if (s == "plastshlturn" || s == "olastshlturn")
{
intValue = (s == "plastshlturn")?card->controller()->lastShuffleTurn:card->controller()->opponent()->lastShuffleTurn;
}
else if(!intValue)//found nothing, try parsing a atoi
{
intValue = atoi(s.c_str());