Play the Top Card of Library
This commit is contained in:
@@ -368,18 +368,21 @@ void CardGui::Render()
|
||||
JQuadPtr ssMask = card->getObserver()->getResourceManager()->GetQuad("white");
|
||||
|
||||
//choose attacker mask
|
||||
if(card->isInPlay(game) && card->isCreature()
|
||||
&& ((!card->canAttack() || (card->attackCost > 0)) && (!card->canAttack(true) || (card->attackPlaneswalkerCost > 0)))
|
||||
&& !card->isPhased && !card->didattacked )
|
||||
if(game->currentPlayer->hasPossibleAttackers())
|
||||
{
|
||||
if(game->getCurrentGamePhase() > MTG_PHASE_FIRSTMAIN
|
||||
&& game->getCurrentGamePhase() < MTG_PHASE_SECONDMAIN
|
||||
&& card->controller() == game->currentPlayer )
|
||||
if(card->isInPlay(game) && card->isCreature()
|
||||
&& ((!card->canAttack() || (card->attackCost > 0)) && (!card->canAttack(true) || (card->attackPlaneswalkerCost > 0)))
|
||||
&& !card->isPhased && !card->didattacked )
|
||||
{
|
||||
if(card->controller()->isHuman() && ssMask)
|
||||
if(game->getCurrentGamePhase() > MTG_PHASE_FIRSTMAIN
|
||||
&& game->getCurrentGamePhase() < MTG_PHASE_SECONDMAIN
|
||||
&& card->controller() == game->currentPlayer )
|
||||
{
|
||||
ssMask->SetColor(ARGB(170,64,64,64));
|
||||
renderer->RenderQuad(ssMask.get(), actX, actY, actT, (27 * actZ + 1) / 16, 40 * actZ / 16);
|
||||
if(card->controller()->isHuman() && ssMask)
|
||||
{
|
||||
ssMask->SetColor(ARGB(170,64,64,64));
|
||||
renderer->RenderQuad(ssMask.get(), actX, actY, actT, (27 * actZ + 1) / 16, 40 * actZ / 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,12 +197,60 @@ void GuiGameZone::Render()
|
||||
//Texture
|
||||
JQuadPtr quad = WResourceManager::Instance()->GetQuad(kGenericCardThumbnailID);
|
||||
float scale = defaultHeight / quad->mHeight;
|
||||
float modx = 0;
|
||||
float mody = 0;
|
||||
bool replaced = false;
|
||||
bool showtop = (zone && zone->owner->game->battlefield->nb_cards && zone->owner->game->battlefield->hasAbility(Constants::SHOWFROMTOPLIBRARY))?true:false;
|
||||
bool showopponenttop = (zone && zone->owner->opponent()->game->battlefield->nb_cards && zone->owner->opponent()->game->battlefield->hasAbility(Constants::SHOWOPPONENTTOPLIBRARY))?true:false;
|
||||
|
||||
quad->SetColor(ARGB((int)(actA),255,255,255));
|
||||
if(type == GUI_EXILE)
|
||||
{
|
||||
quad->SetColor(ARGB((int)(actA),255,240,255));
|
||||
}
|
||||
JRenderer::GetInstance()->RenderQuad(quad.get(), actX, actY, 0.0, scale * actZ, scale * actZ);
|
||||
|
||||
if(type == GUI_LIBRARY && zone->nb_cards && !showCards)
|
||||
{
|
||||
int top = zone->nb_cards - 1;
|
||||
if(zone->cards[top] && (zone->cards[top]->canPlayFromLibrary()||showtop||showopponenttop))
|
||||
{
|
||||
MTGCardInstance * card = zone->cards[top];
|
||||
if(card && card->getObserver())
|
||||
{
|
||||
replaced = true;
|
||||
/*TargetChooser * tc = card->getObserver()->getCurrentTargetChooser();
|
||||
if(tc && tc->canTarget(card) && !tc->done)
|
||||
replaced = false;
|
||||
else
|
||||
{*/
|
||||
JQuadPtr kquad = WResourceManager::Instance()->RetrieveCard(card, CACHE_THUMB);
|
||||
if(kquad)
|
||||
{
|
||||
kquad->SetColor(ARGB((int)(actA),255,255,255));
|
||||
scale = defaultHeight / kquad->mHeight;
|
||||
modx = (35/4)+1;
|
||||
mody = (50/4)+1;
|
||||
quad = kquad;
|
||||
}
|
||||
else
|
||||
{
|
||||
quad = CardGui::AlternateThumbQuad(card);
|
||||
if(quad)
|
||||
{
|
||||
quad->SetColor(ARGB((int)(actA),255,255,255));
|
||||
scale = defaultHeight / quad->mHeight;
|
||||
modx = (35/4)+1;
|
||||
mody = (50/4)+1;
|
||||
}
|
||||
}
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//render small card quad
|
||||
if(quad)
|
||||
JRenderer::GetInstance()->RenderQuad(quad.get(), actX+modx, actY+mody, 0.0, scale * actZ, scale * actZ);
|
||||
|
||||
float x0 = actX;
|
||||
if (x0 < SCREEN_WIDTH / 2)
|
||||
@@ -211,8 +259,11 @@ void GuiGameZone::Render()
|
||||
}
|
||||
|
||||
if (mHasFocus)
|
||||
JRenderer::GetInstance()->FillRect(actX, actY, quad->mWidth * scale * actZ, quad->mHeight * scale * actZ,
|
||||
{
|
||||
if(!replaced)
|
||||
JRenderer::GetInstance()->FillRect(actX, actY, quad->mWidth * scale * actZ, quad->mHeight * scale * actZ,
|
||||
ARGB(abs(128 - wave),255,255,255));
|
||||
}
|
||||
|
||||
//Number of cards
|
||||
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
|
||||
@@ -236,10 +287,24 @@ void GuiGameZone::Render()
|
||||
mFont->SetColor(ARGB(mAlpha,255,255,255));
|
||||
mFont->DrawString(buffer, x0, actY);
|
||||
|
||||
//show top library - big card display
|
||||
if(type == GUI_LIBRARY && mHasFocus && zone->nb_cards && !showCards && replaced)
|
||||
{
|
||||
int top = zone->nb_cards - 1;
|
||||
if(zone->cards[top])
|
||||
{
|
||||
Pos pos = Pos(SCREEN_WIDTH - 35 - CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 15, 0.80f, 0.0, 220);
|
||||
pos.actY = 165;
|
||||
if (x < (CardGui::BigWidth / 2)) pos.actX = CardGui::BigWidth / 2;
|
||||
CardGui::DrawCard(zone->cards[top], pos);
|
||||
}
|
||||
}
|
||||
|
||||
if (showCards)
|
||||
cd->Render();
|
||||
for (vector<CardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
||||
(*it)->Render();
|
||||
|
||||
PlayGuiObject::Render();
|
||||
}
|
||||
|
||||
@@ -252,6 +317,26 @@ bool GuiGameZone::CheckUserInput(JButton key)
|
||||
{
|
||||
if (showCards)
|
||||
return cd->CheckUserInput(key);
|
||||
else if(type == GUI_LIBRARY && zone->nb_cards && !showCards && key == JGE_BTN_OK && mHasFocus)
|
||||
{
|
||||
bool activateclick = true;
|
||||
|
||||
int top = zone->nb_cards - 1;
|
||||
MTGCardInstance * card = zone->cards[top];
|
||||
GameObserver * game = card->getObserver();
|
||||
if(game)
|
||||
{
|
||||
TargetChooser * tc = game->getCurrentTargetChooser();
|
||||
if(tc && (tc->canTarget(card) || !tc->done || tc->Owner->isHuman()))
|
||||
activateclick = false;
|
||||
}
|
||||
|
||||
if(card && activateclick)
|
||||
{
|
||||
card->getObserver()->cardClick(card);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -903,6 +903,32 @@ int MTGCardInstance::canproduceMana(int color)
|
||||
return 0;
|
||||
}
|
||||
|
||||
//check can be played from library top
|
||||
bool MTGCardInstance::canPlayFromLibrary()
|
||||
{
|
||||
int found = 0;
|
||||
if(has(Constants::CANPLAYFROMLIBRARYTOP)
|
||||
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYFROMLIBRARYTOP)))
|
||||
found++;
|
||||
if(isLand() && (has(Constants::CANPLAYLANDTOPLIBRARY)
|
||||
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYLANDTOPLIBRARY))))
|
||||
found++;
|
||||
if(hasSubtype(Subtypes::TYPE_ARTIFACT) && (has(Constants::CANPLAYARTIFACTTOPLIBRARY)
|
||||
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYARTIFACTTOPLIBRARY))))
|
||||
found++;
|
||||
if(isCreature() && (has(Constants::CANPLAYCREATURETOPLIBRARY)
|
||||
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYCREATURETOPLIBRARY))))
|
||||
found++;
|
||||
if(isSorceryorInstant() && (has(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY)
|
||||
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY))))
|
||||
found++;
|
||||
|
||||
if(found > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//check stack
|
||||
bool MTGCardInstance::StackIsEmptyandSorcerySpeed()
|
||||
{
|
||||
|
||||
@@ -178,7 +178,14 @@ const char* Constants::MTGBasicAbilities[] = {
|
||||
"hiddenface",//test for hiding card
|
||||
"anytypeofmana",
|
||||
"necroed",//hide necored
|
||||
"cantpwattack"
|
||||
"cantpwattack",
|
||||
"canplayfromlibrarytop",//all
|
||||
"canplaylandlibrarytop",//land
|
||||
"canplaycreaturelibrarytop",//creature
|
||||
"canplayartifactlibrarytop",//artifact
|
||||
"canplayinstantsorcerylibrarytop",//instant or sorcery
|
||||
"showfromtoplibrary",
|
||||
"showopponenttoplibrary"
|
||||
};
|
||||
|
||||
map<string,int> Constants::MTGBasicAbilitiesMap;
|
||||
|
||||
@@ -304,9 +304,9 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
int cardsinhand = game->players[0]->game->hand->nb_cards;
|
||||
defaultPlayName = card->isLand()?"Play Land":"Cast Card Normally";
|
||||
Player * player = game->currentlyActing();
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card))
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->library->hasCard(card))
|
||||
return 0;
|
||||
if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
if ((player->game->library->hasCard(card) && !card->canPlayFromLibrary()) || (player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
if ((game->turn < 1) && (cardsinhand != 0) && (card->basicAbilities[(int)Constants::LEYLINE])
|
||||
&& game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN
|
||||
@@ -574,9 +574,9 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
if(OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number)
|
||||
return 0;
|
||||
Player * player = game->currentlyActing();
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card))
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->library->hasCard(card))
|
||||
return 0;
|
||||
if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
if ((player->game->library->hasCard(card) && !card->canPlayFromLibrary()) || (player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
if(!allowedToCast(card,player))
|
||||
return 0;
|
||||
@@ -739,9 +739,9 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *
|
||||
{
|
||||
alternateCost->extraCosts->costs[i]->setSource(card);
|
||||
}
|
||||
if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card))
|
||||
if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card) && !game->currentlyActing()->game->library->hasCard(card))
|
||||
return 0;
|
||||
if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
if ((game->currentlyActing()->game->library->hasCard(card) && !card->canPlayFromLibrary()) || (game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
return isReactingToClick( card, mana, alternateCost );
|
||||
}
|
||||
@@ -758,10 +758,12 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *
|
||||
|
||||
alternativeName = "Pay Alternative Cost";
|
||||
|
||||
if(card->has(Constants::CANPLAYFROMGRAVEYARD))
|
||||
if(card->has(Constants::CANPLAYFROMGRAVEYARD) && game->isInGrave(card))
|
||||
alternativeName = "Alternate Cast From Graveyard";
|
||||
else if(card->has(Constants::CANPLAYFROMEXILE))
|
||||
else if(card->has(Constants::CANPLAYFROMEXILE) && game->isInExile(card))
|
||||
alternativeName = "Alternate Cast From Exile";
|
||||
else if(card->canPlayFromLibrary() && game->isInLibrary(card))
|
||||
alternativeName = "Alternate Cast From Library";
|
||||
else if(card->model->data->getManaCost()->getAlternative() && card->model->data->getManaCost()->getAlternative()->alternativeName.size())
|
||||
alternativeName = card->model->data->getManaCost()->getAlternative()->alternativeName;
|
||||
|
||||
@@ -1330,9 +1332,9 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
|
||||
Player * player = game->currentlyActing();
|
||||
//Player * currentPlayer = game->currentPlayer;
|
||||
if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
||||
if (!player->game->library->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
||||
return 0;
|
||||
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||
if ((!card->canPlayFromLibrary() && player->game->library->hasCard(card))||(!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||
return 0;
|
||||
if (!card->getManaCost()->getMorph())
|
||||
return 0;
|
||||
@@ -1468,12 +1470,12 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||
if (!card->has(Constants::PAYZERO))
|
||||
return 0;
|
||||
Player * player = game->currentlyActing();
|
||||
if (card->isLand() || (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)))
|
||||
if (card->isLand() || (!player->game->library->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)))
|
||||
{
|
||||
//only allowed to pay zero for cards in library??? above is "if you dont have it in hand, grave, or exile"
|
||||
return 0;
|
||||
}
|
||||
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card)) || (!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||
if ((!card->canPlayFromLibrary() && player->game->library->hasCard(card))||(!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card)) || (!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -1538,11 +1540,11 @@ int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||
return 0;
|
||||
}
|
||||
Player * player = card->controller();
|
||||
if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
||||
if (!player->game->library->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card)) || (!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||
if ((!card->canPlayFromLibrary() && player->game->library->hasCard(card)) || (!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card)) || (!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user