Merge pull request #945 from kevlahnota/master

Updated attack rule & revert some activated "lord" to use "all"
This commit is contained in:
Anthony Calosa
2017-03-01 18:49:02 +08:00
committed by GitHub
10 changed files with 604 additions and 494 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -170,7 +170,7 @@ public:
MTGCardInstance * banding; // If belongs to a band when attacking
int canBlock();
int canBlock(MTGCardInstance * opponent);
int canAttack();
int canAttack( bool pwcheck = false );
int isAttacker();
Targetable * isAttacking;
MTGCardInstance * storedCard;

View File

@@ -266,7 +266,8 @@ class Constants
HIDDENFACE = 144,
ANYTYPEOFMANA = 145,
NECROED = 146,
NB_BASIC_ABILITIES = 147,
CANTPWATTACK = 147,
NB_BASIC_ABILITIES = 148,
RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics

View File

@@ -368,10 +368,13 @@ void CardGui::Render()
JQuadPtr ssMask = card->getObserver()->getResourceManager()->GetQuad("white");
//choose attacker mask
if(card->isInPlay(game) && (card->hasSummoningSickness() || card->attackCost > 0) && !card->isPhased && card->isCreature())
if(card->isInPlay(game) && card->isCreature()
&& ((!card->canAttack() || (card->attackCost > 0)) && (!card->canAttack(true) || (card->attackPlaneswalkerCost > 0)))
&& !card->isPhased && !card->didattacked )
{
if(game->getCurrentGamePhase() > MTG_PHASE_FIRSTMAIN && game->getCurrentGamePhase() < MTG_PHASE_SECONDMAIN &&
card->controller() == game->currentPlayer && game->currentPlayer->hasPossibleAttackers())
if(game->getCurrentGamePhase() > MTG_PHASE_FIRSTMAIN
&& game->getCurrentGamePhase() < MTG_PHASE_SECONDMAIN
&& card->controller() == game->currentPlayer )
{
if(card->controller()->isHuman() && ssMask)
{

View File

@@ -1049,12 +1049,15 @@ void GameObserver::gameStateBasedEffects()
int skipLevel = (currentPlayer->playMode == Player::MODE_TEST_SUITE || mLoading) ? Constants::ASKIP_NONE
: options[Options::ASPHASES].number;
bool noattackers = currentPlayer->noPossibleAttackers();
bool nodiaochan = (currentPlayer->game->battlefield->countByAlias(10544)<1)?true:false;
if (skipLevel == Constants::ASKIP_SAFE || skipLevel == Constants::ASKIP_FULL)
{
if ((opponent()->isAI() && !(isInterrupting)) && ((mCurrentGamePhase == MTG_PHASE_UNTAP)
|| (mCurrentGamePhase == MTG_PHASE_DRAW) || (mCurrentGamePhase == MTG_PHASE_COMBATBEGIN)
|| (mCurrentGamePhase == MTG_PHASE_DRAW)
|| ((mCurrentGamePhase == MTG_PHASE_COMBATBEGIN) && (nodiaochan))
|| ((mCurrentGamePhase == MTG_PHASE_COMBATATTACKERS) && (noattackers))
|| (mCurrentGamePhase == MTG_PHASE_COMBATEND) || (mCurrentGamePhase == MTG_PHASE_ENDOFTURN)
|| (mCurrentGamePhase == MTG_PHASE_COMBATEND)
|| (mCurrentGamePhase == MTG_PHASE_ENDOFTURN)
|| ((mCurrentGamePhase == MTG_PHASE_CLEANUP) && (currentPlayer->game->hand->nb_cards < 8))))
userRequestNextGamePhase();
}

View File

@@ -740,7 +740,11 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
{
restriction.push_back("type(land|mybattlefield)~morethan~type(land|opponentbattlefield)");
}
check = restriction[i].find("didnotcastnontoken");
if(check != string::npos)
{
restriction.push_back("lastturn(*[-token]|opponentstack,opponentbattlefield)~lessthan~1");
}
check = restriction[i].find("paid(");
if(check != string::npos)
{

View File

@@ -671,12 +671,20 @@ Player * MTGCardInstance::controller()
return lastController;
}
int MTGCardInstance::canAttack()
int MTGCardInstance::canAttack( bool pwcheck )
{
if (has(Constants::CANTATTACK))
return 0;
if (has(Constants::FLYERSONLY) && !has(Constants::FLYING))
return 0;
if(!pwcheck)
{
if (has(Constants::CANTATTACK))
return 0;
if (has(Constants::FLYERSONLY) && !has(Constants::FLYING))
return 0;
}
else
{
if (has(Constants::CANTPWATTACK))
return 0;
}
if (tapped)
return 0;
if (hasSummoningSickness())

View File

@@ -177,7 +177,8 @@ const char* Constants::MTGBasicAbilities[] = {
"cantcrew",
"hiddenface",//test for hiding card
"anytypeofmana",
"necroed"//hide necored
"necroed",//hide necored
"cantpwattack"
};
map<string,int> Constants::MTGBasicAbilitiesMap;

View File

@@ -1863,7 +1863,27 @@ int MTGAttackRule::receiveEvent(WEvent *e)
if (card->isAttacker() && !card->has(Constants::VIGILANCE))
card->tap();
if (card->isAttacker() && card->has(Constants::CANTATTACK))
card->toggleAttacker();//if a card has cantattack, then you cant
{
if(card->isAttacking)
{
Damageable * dtarget = ((Damageable *)card->isAttacking);
if(dtarget->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)
card->toggleAttacker();//if a card has cantattack, then you cant
}
}
else if (card->isAttacker() && card->has(Constants::CANTPWATTACK))
{
if(card->isAttacking)
{
Damageable * dtarget = ((Damageable *)card->isAttacking);
if(dtarget->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE)
{
MTGCardInstance * ctarget = ((MTGCardInstance *)card->isAttacking);
if(ctarget->hasType(Subtypes::TYPE_PLANESWALKER))
card->toggleAttacker();//if a card has cantpwattack, then you cant
}
}
}
}
return 1;
}
@@ -1915,7 +1935,7 @@ int MTGPlaneswalkerAttackRule::isReactingToClick(MTGCardInstance * card, ManaCos
return 0;
if (card->isAttacker())
return 1;
if (card->canAttack() && card->attackPlaneswalkerCost < 1)
if (card->canAttack(true) && card->attackPlaneswalkerCost < 1)
return 1;
}
return 0;
@@ -1972,7 +1992,7 @@ bool MTGPlaneswalkerAttackRule::select(Target* t)
if (CardView* c = dynamic_cast<CardView*>(t))
{
MTGCardInstance * card = c->getCard();
if (card->canAttack() && !card->isPhased)
if (card->canAttack(true) && !card->isPhased)
return true;
}
return false;

View File

@@ -260,7 +260,7 @@ bool Player::hasPossibleAttackers()
for (int j = 0; j < nbcards; ++j)
{
MTGCardInstance * c = z->cards[j];
if (c->canAttack() && c->isCreature())
if ((c->canAttack(true) || c->canAttack()) && c->isCreature())
return true;
}
return false;