added targetedplayer as a who for most abilities and token reciever..
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...
This commit is contained in:
@@ -669,8 +669,15 @@ public:
|
|||||||
{
|
{
|
||||||
WEventCardSacrifice * e = dynamic_cast<WEventCardSacrifice *> (event);
|
WEventCardSacrifice * e = dynamic_cast<WEventCardSacrifice *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
if (!tc->canTarget(e->card)) return 0;
|
MTGCardInstance * check = e->cardAfter;
|
||||||
|
MTGGameZone * oldZone = e->cardAfter->currentZone;
|
||||||
|
check->currentZone = check->previousZone;
|
||||||
|
if (!tc->canTarget(check,true))
|
||||||
|
{
|
||||||
|
check->currentZone = oldZone;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
check->currentZone = oldZone;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2809,6 +2816,11 @@ public:
|
|||||||
tokenReciever = ((MTGCardInstance*)target)->controller();
|
tokenReciever = ((MTGCardInstance*)target)->controller();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TargetChooser::TARGETED_PLAYER:
|
||||||
|
{
|
||||||
|
tokenReciever = source->playerTarget;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
tokenReciever = source->controller();
|
tokenReciever = source->controller();
|
||||||
break;
|
break;
|
||||||
@@ -2865,6 +2877,95 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//targetable abilities which are added to targeted players game.
|
||||||
|
class ATargetedAbilityCreator: public ActivatedAbility
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
string sabilities;
|
||||||
|
string name;
|
||||||
|
int who;
|
||||||
|
MTGCardInstance * myDummy;
|
||||||
|
Player * abilityReciever;
|
||||||
|
ATargetedAbilityCreator(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost,string _name, string abilityToAdd, int who = 0) :
|
||||||
|
ActivatedAbility(observer, _id, _source, _cost, 0),name(_name),sabilities(abilityToAdd), who(who)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int resolve()
|
||||||
|
{
|
||||||
|
setAbilityOwner();
|
||||||
|
myDummy = NEW MTGCardInstance();
|
||||||
|
setAbilityOwner();
|
||||||
|
myDummy->setObserver(abilityReciever->getObserver());
|
||||||
|
myDummy->owner = abilityReciever;
|
||||||
|
vector<string>magictextlines = split(sabilities,'_');
|
||||||
|
if(magictextlines.size())
|
||||||
|
{
|
||||||
|
string newMagicText = "";
|
||||||
|
for(unsigned int i = 0; i < magictextlines.size(); i++)
|
||||||
|
{
|
||||||
|
newMagicText.append(magictextlines[i]);
|
||||||
|
newMagicText.append("\n");
|
||||||
|
}
|
||||||
|
myDummy->magicText = newMagicText;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
myDummy->magicText = sabilities;
|
||||||
|
abilityReciever->game->garbage->addCard(myDummy);
|
||||||
|
Spell * spell = NEW Spell(game, myDummy);
|
||||||
|
spell->resolve();
|
||||||
|
myDummy = spell->source;
|
||||||
|
spell->source->owner = abilityReciever;
|
||||||
|
delete spell;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setAbilityOwner()
|
||||||
|
{
|
||||||
|
switch(who)
|
||||||
|
{
|
||||||
|
case TargetChooser::CONTROLLER:
|
||||||
|
abilityReciever = source->controller();
|
||||||
|
break;
|
||||||
|
case TargetChooser::OPPONENT:
|
||||||
|
abilityReciever = source->controller()->opponent();
|
||||||
|
break;
|
||||||
|
case TargetChooser::TARGET_CONTROLLER:
|
||||||
|
if(target)
|
||||||
|
{
|
||||||
|
abilityReciever = ((MTGCardInstance*)target)->controller();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TargetChooser::TARGETED_PLAYER:
|
||||||
|
{
|
||||||
|
abilityReciever = source->playerTarget;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
abilityReciever = source->controller()->opponent();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * getMenuText()
|
||||||
|
{
|
||||||
|
if(name.size())
|
||||||
|
return name.c_str();
|
||||||
|
return "Ability";
|
||||||
|
}
|
||||||
|
|
||||||
|
ATargetedAbilityCreator * clone() const
|
||||||
|
{
|
||||||
|
ATargetedAbilityCreator * a = NEW ATargetedAbilityCreator(*this);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ATargetedAbilityCreator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
///
|
||||||
//Foreach (plague rats...)
|
//Foreach (plague rats...)
|
||||||
class AForeach: public ListMaintainerAbility, public NestedAbility
|
class AForeach: public ListMaintainerAbility, public NestedAbility
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -179,8 +179,9 @@ struct WEventCardBlocked : public WEventCardUpdate {
|
|||||||
|
|
||||||
//event when card is sacrificed.
|
//event when card is sacrificed.
|
||||||
struct WEventCardSacrifice : public WEventCardUpdate {
|
struct WEventCardSacrifice : public WEventCardUpdate {
|
||||||
WEventCardSacrifice(MTGCardInstance * card);
|
MTGCardInstance * cardAfter;
|
||||||
virtual Targetable * getTarget(int target);
|
WEventCardSacrifice(MTGCardInstance * card,MTGCardInstance * afterCard);
|
||||||
|
virtual Targetable * getTarget(int target);
|
||||||
};
|
};
|
||||||
|
|
||||||
//event when card is discarded.
|
//event when card is discarded.
|
||||||
|
|||||||
@@ -292,7 +292,7 @@ Spell::~Spell()
|
|||||||
|
|
||||||
int Spell::resolve()
|
int Spell::resolve()
|
||||||
{
|
{
|
||||||
if (!source->hasType(Subtypes::TYPE_INSTANT) && !source->hasType(Subtypes::TYPE_SORCERY))
|
if (!source->hasType(Subtypes::TYPE_INSTANT) && !source->hasType(Subtypes::TYPE_SORCERY) && source->name.size())
|
||||||
{
|
{
|
||||||
Player * p = source->controller();
|
Player * p = source->controller();
|
||||||
int castMethod = source->castMethod;
|
int castMethod = source->castMethod;
|
||||||
|
|||||||
@@ -1279,11 +1279,12 @@ int AASacrificeCard::resolve()
|
|||||||
if (_target)
|
if (_target)
|
||||||
{
|
{
|
||||||
Player * p = _target->controller();
|
Player * p = _target->controller();
|
||||||
WEvent * e = NEW WEventCardSacrifice(_target);
|
MTGCardInstance * beforeCard = _target;
|
||||||
game->receiveEvent(e);
|
|
||||||
p->game->putInGraveyard(_target);
|
p->game->putInGraveyard(_target);
|
||||||
while(_target->next)
|
while(_target->next)
|
||||||
_target = _target->next;
|
_target = _target->next;
|
||||||
|
WEvent * e = NEW WEventCardSacrifice(beforeCard,_target);
|
||||||
|
game->receiveEvent(e);
|
||||||
if(andAbility)
|
if(andAbility)
|
||||||
{
|
{
|
||||||
MTGAbility * andAbilityClone = andAbility->clone();
|
MTGAbility * andAbilityClone = andAbility->clone();
|
||||||
@@ -1619,6 +1620,7 @@ int AAFlip::resolve()
|
|||||||
if(flipStats.size())
|
if(flipStats.size())
|
||||||
{
|
{
|
||||||
MTGCard * fcard = MTGCollection()->getCardByName(flipStats);
|
MTGCard * fcard = MTGCollection()->getCardByName(flipStats);
|
||||||
|
if(!fcard) return 0;
|
||||||
MTGCardInstance * myFlip = NEW MTGCardInstance(fcard, _target->controller()->game);
|
MTGCardInstance * myFlip = NEW MTGCardInstance(fcard, _target->controller()->game);
|
||||||
_target->name = myFlip->name;
|
_target->name = myFlip->name;
|
||||||
_target->colors = myFlip->colors;
|
_target->colors = myFlip->colors;
|
||||||
@@ -1629,6 +1631,7 @@ int AAFlip::resolve()
|
|||||||
for(unsigned int i = 0;i < _target->cardsAbilities.size();i++)
|
for(unsigned int i = 0;i < _target->cardsAbilities.size();i++)
|
||||||
{
|
{
|
||||||
MTGAbility * a = dynamic_cast<MTGAbility *>(_target->cardsAbilities[i]);
|
MTGAbility * a = dynamic_cast<MTGAbility *>(_target->cardsAbilities[i]);
|
||||||
|
|
||||||
if(a) game->removeObserver(a);
|
if(a) game->removeObserver(a);
|
||||||
}
|
}
|
||||||
_target->cardsAbilities.clear();
|
_target->cardsAbilities.clear();
|
||||||
@@ -1714,7 +1717,7 @@ int AAFlip::testDestroy()
|
|||||||
const char * AAFlip::getMenuText()
|
const char * AAFlip::getMenuText()
|
||||||
{
|
{
|
||||||
string s = flipStats;
|
string s = flipStats;
|
||||||
sprintf(menuText, "Transform into %s", s.c_str());
|
sprintf(menuText, "Transform:%s", s.c_str());
|
||||||
return menuText;
|
return menuText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4307,9 +4310,10 @@ void AVanishing::Update(float dt)
|
|||||||
}
|
}
|
||||||
if (newPhase == MTG_PHASE_UPKEEP && timeLeft <= 0 && next == 0)
|
if (newPhase == MTG_PHASE_UPKEEP && timeLeft <= 0 && next == 0)
|
||||||
{
|
{
|
||||||
WEvent * e = NEW WEventCardSacrifice(source);
|
MTGCardInstance * beforeCard = source;
|
||||||
game->receiveEvent(e);
|
|
||||||
source->controller()->game->putInGraveyard(source);
|
source->controller()->game->putInGraveyard(source);
|
||||||
|
WEvent * e = NEW WEventCardSacrifice(beforeCard,source);
|
||||||
|
game->receiveEvent(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -257,7 +257,6 @@ void CardGui::Render()
|
|||||||
icon = game?game->getResourceManager()->GetQuad("c_red"):WResourceManager::Instance()->GetQuad("c_red");
|
icon = game?game->getResourceManager()->GetQuad("c_red"):WResourceManager::Instance()->GetQuad("c_red");
|
||||||
else if (card->hasSubtype("island"))
|
else if (card->hasSubtype("island"))
|
||||||
icon = game?game->getResourceManager()->GetQuad("c_blue"):WResourceManager::Instance()->GetQuad("c_blue");
|
icon = game?game->getResourceManager()->GetQuad("c_blue"):WResourceManager::Instance()->GetQuad("c_blue");
|
||||||
|
|
||||||
if (icon.get())
|
if (icon.get())
|
||||||
{
|
{
|
||||||
icon->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,255));
|
icon->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,255));
|
||||||
|
|||||||
@@ -588,10 +588,11 @@ int SacrificeCost::doPay()
|
|||||||
{
|
{
|
||||||
if (target)
|
if (target)
|
||||||
{
|
{
|
||||||
WEvent * e = NEW WEventCardSacrifice(target);
|
MTGCardInstance * beforeCard = target;
|
||||||
|
target->controller()->game->putInGraveyard(target);
|
||||||
|
WEvent * e = NEW WEventCardSacrifice(beforeCard,target);
|
||||||
GameObserver * game = target->owner->getObserver();
|
GameObserver * game = target->owner->getObserver();
|
||||||
game->receiveEvent(e);
|
game->receiveEvent(e);
|
||||||
target->controller()->game->putInGraveyard(target);
|
|
||||||
target = NULL;
|
target = NULL;
|
||||||
if (tc)
|
if (tc)
|
||||||
tc->initTargets();
|
tc->initTargets();
|
||||||
|
|||||||
@@ -810,10 +810,10 @@ void GameObserver::gameStateBasedEffects()
|
|||||||
{
|
{
|
||||||
if (c->has(Constants::TREASON))
|
if (c->has(Constants::TREASON))
|
||||||
{
|
{
|
||||||
WEvent * e = NEW WEventCardSacrifice(c);
|
MTGCardInstance * beforeCard = c;
|
||||||
receiveEvent(e);
|
|
||||||
|
|
||||||
p->game->putInGraveyard(c);
|
p->game->putInGraveyard(c);
|
||||||
|
WEvent * e = NEW WEventCardSacrifice(beforeCard,c);
|
||||||
|
receiveEvent(e);
|
||||||
}
|
}
|
||||||
if (c->has(Constants::UNEARTH))
|
if (c->has(Constants::UNEARTH))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1009,6 +1009,15 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
|||||||
s.erase(stypesStartIndex, real_end - stypesStartIndex);
|
s.erase(stypesStartIndex, real_end - stypesStartIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
found = s.find("ability$!");
|
||||||
|
if (found != string::npos && storedString.empty())
|
||||||
|
{
|
||||||
|
size_t real_end = s.find("!$", found);
|
||||||
|
size_t sIndex = found + 9;
|
||||||
|
storedString.append(s.substr(sIndex, real_end - sIndex).c_str());
|
||||||
|
s.erase(sIndex, real_end - sIndex);
|
||||||
|
}
|
||||||
|
|
||||||
vector<string> splitTrigger = parseBetween(s, "@", ":");
|
vector<string> splitTrigger = parseBetween(s, "@", ":");
|
||||||
if (splitTrigger.size())
|
if (splitTrigger.size())
|
||||||
{
|
{
|
||||||
@@ -1754,6 +1763,17 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
|||||||
if (s.find(" owner") != string::npos)
|
if (s.find(" owner") != string::npos)
|
||||||
who = TargetChooser::OWNER;
|
who = TargetChooser::OWNER;
|
||||||
|
|
||||||
|
//ability creator the target has to do the ability.
|
||||||
|
if(s.find("ability$") != string::npos)
|
||||||
|
{
|
||||||
|
if (storedString.size())
|
||||||
|
{
|
||||||
|
ATargetedAbilityCreator * abl = NEW ATargetedAbilityCreator(observer, id, card,target, NULL,newName, storedString, who);
|
||||||
|
abl->oneShot = 1;
|
||||||
|
storedString.clear();
|
||||||
|
return abl;
|
||||||
|
}
|
||||||
|
}
|
||||||
//livingweapon (used for token below)
|
//livingweapon (used for token below)
|
||||||
bool aLivingWeapon = (s.find("livingweapon") != string::npos);
|
bool aLivingWeapon = (s.find("livingweapon") != string::npos);
|
||||||
|
|
||||||
@@ -3090,7 +3110,7 @@ int AbilityFactory::getAbilities(vector<MTGAbility *> * v, Spell * spell, MTGCar
|
|||||||
card->life = 2;
|
card->life = 2;
|
||||||
card->toughness = 2;
|
card->toughness = 2;
|
||||||
card->setColor(0,1);
|
card->setColor(0,1);
|
||||||
card->name = "";
|
card->name = "Morph";
|
||||||
card->types.clear();
|
card->types.clear();
|
||||||
string cre = "Creature";
|
string cre = "Creature";
|
||||||
card->setType(cre.c_str());
|
card->setType(cre.c_str());
|
||||||
|
|||||||
@@ -1110,7 +1110,7 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card)
|
|||||||
spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 0);
|
spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 0);
|
||||||
spell->source->morphed = true;
|
spell->source->morphed = true;
|
||||||
spell->source->isMorphed = true;
|
spell->source->isMorphed = true;
|
||||||
spell->source->name = "";
|
spell->source->name = "Morph";
|
||||||
spell->source->power = 2;
|
spell->source->power = 2;
|
||||||
spell->source->toughness = 2;
|
spell->source->toughness = 2;
|
||||||
copy->morphed = true;
|
copy->morphed = true;
|
||||||
|
|||||||
@@ -93,8 +93,8 @@ WEventcardDraw::WEventcardDraw(Player * player, int nb_cards) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
WEventCardSacrifice::WEventCardSacrifice(MTGCardInstance * card) :
|
WEventCardSacrifice::WEventCardSacrifice(MTGCardInstance * card, MTGCardInstance * after) :
|
||||||
WEventCardUpdate(card)
|
WEventCardUpdate(card),cardAfter(after)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +233,10 @@ Targetable * WEventCardAttackedAlone::getTarget(int target)
|
|||||||
|
|
||||||
Targetable * WEventCardSacrifice::getTarget(int target)
|
Targetable * WEventCardSacrifice::getTarget(int target)
|
||||||
{
|
{
|
||||||
if (target) return card;
|
if (target)
|
||||||
|
{
|
||||||
|
return cardAfter;
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user