Erwan
-code cleanup -fix one card in TSP
This commit is contained in:
@@ -181,7 +181,8 @@ rarity=C
|
|||||||
[card]
|
[card]
|
||||||
text=Flash (You may play this spell any time you could play an instant.) Enchant creature Enchanted creature gets -2/-1.
|
text=Flash (You may play this spell any time you could play an instant.) Enchant creature Enchanted creature gets -2/-1.
|
||||||
target=creature
|
target=creature
|
||||||
auto=:-2/-1
|
auto=-2/-1
|
||||||
|
abilities=flash
|
||||||
id=108892
|
id=108892
|
||||||
name=Feebleness
|
name=Feebleness
|
||||||
rarity=C
|
rarity=C
|
||||||
@@ -844,4 +845,4 @@ toughness=1
|
|||||||
text=Forestwalk When Yavimaya Dryad comes into play, you may search your library for a Forest card and put it into play tapped under target player's control. If you do, shuffle your library.
|
text=Forestwalk When Yavimaya Dryad comes into play, you may search your library for a Forest card and put it into play tapped under target player's control. If you do, shuffle your library.
|
||||||
auto=may moveTo(myBattlefield) target(forest|mylibrary) && tap
|
auto=may moveTo(myBattlefield) target(forest|mylibrary) && tap
|
||||||
rarity=U
|
rarity=U
|
||||||
[/card]
|
[/card]
|
||||||
|
|||||||
@@ -171,8 +171,6 @@ class ActionStack :public GuiLayer{
|
|||||||
virtual void Render();
|
virtual void Render();
|
||||||
ActionStack(GameObserver* game);
|
ActionStack(GameObserver* game);
|
||||||
int resolve();
|
int resolve();
|
||||||
int CombatDamages();
|
|
||||||
int CombatDamages(int firststrike);
|
|
||||||
int has(Interruptible * action);
|
int has(Interruptible * action);
|
||||||
int has(MTGAbility * ability);
|
int has(MTGAbility * ability);
|
||||||
#if defined (WIN32) || defined (LINUX)
|
#if defined (WIN32) || defined (LINUX)
|
||||||
|
|||||||
@@ -48,8 +48,6 @@ class DamageStack :public GuiLayer, public Interruptible{
|
|||||||
public:
|
public:
|
||||||
int resolve();
|
int resolve();
|
||||||
void Render();
|
void Render();
|
||||||
int CombatDamages();//Deprecated ?
|
|
||||||
int CombatDamages(int strike);
|
|
||||||
virtual ostream& toString(ostream& out) const;
|
virtual ostream& toString(ostream& out) const;
|
||||||
DamageStack(GameObserver* game);
|
DamageStack(GameObserver* game);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
#ifndef _DAMAGERESOLVERLAYER_H_
|
|
||||||
#define _DAMAGERESOLVERLAYER_H_
|
|
||||||
#include "../include/PlayGuiObjectController.h"
|
|
||||||
|
|
||||||
class MTGCardInstance;
|
|
||||||
struct DamagerDamaged;
|
|
||||||
class DamageStack;
|
|
||||||
|
|
||||||
|
|
||||||
class DamageResolverLayer:public PlayGuiObjectController{
|
|
||||||
protected:
|
|
||||||
GameObserver* game;
|
|
||||||
int trampleDamage();
|
|
||||||
void updateAllCoordinates();
|
|
||||||
|
|
||||||
public:
|
|
||||||
int buttonOk;
|
|
||||||
int orderingIsNeeded;
|
|
||||||
|
|
||||||
int currentPhase;
|
|
||||||
int remainingDamageSteps;
|
|
||||||
Player * currentChoosingPlayer;
|
|
||||||
DamageStack * damageStack;
|
|
||||||
DamagerDamaged * currentSource;
|
|
||||||
|
|
||||||
DamageResolverLayer(GameObserver* game);
|
|
||||||
int init();
|
|
||||||
int initResolve();
|
|
||||||
Player * whoSelectsDamagesDealtBy(MTGCardInstance * card);
|
|
||||||
int addAutoDamageToOpponents(MTGCardInstance * card);
|
|
||||||
DamagerDamaged * addIfNotExists(MTGCardInstance * card, Player * selecter);
|
|
||||||
int addDamager(MTGCardInstance * card, Player * selecter);
|
|
||||||
int updateCoordinates(MTGCardInstance * card);
|
|
||||||
DamagerDamaged * findByCard(MTGCardInstance * card);
|
|
||||||
int canStopDealDamages();
|
|
||||||
int resolveDamages();
|
|
||||||
int isOpponent(DamagerDamaged * a, DamagerDamaged * b);
|
|
||||||
int nextPlayer();
|
|
||||||
virtual void Update(float dt);
|
|
||||||
virtual bool CheckUserInput(u32 key);
|
|
||||||
virtual void Render();
|
|
||||||
int isDisplayed(){return mCount;};
|
|
||||||
int autoOrderBlockers();
|
|
||||||
bool blockersOrderingDone();
|
|
||||||
|
|
||||||
bool clickDamage(DamagerDamaged * current);
|
|
||||||
bool clickDamage(MTGCardInstance * c);
|
|
||||||
bool clickReorderBlocker(MTGCardInstance * blocker);
|
|
||||||
|
|
||||||
bool checkUserInputOrderBlockers(u32 key);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -148,6 +148,7 @@ class ListMaintainerAbility:public MTGAbility{
|
|||||||
ListMaintainerAbility(int _id, MTGCardInstance *_source,Damageable * _target):MTGAbility(_id, _source, _target){};
|
ListMaintainerAbility(int _id, MTGCardInstance *_source,Damageable * _target):MTGAbility(_id, _source, _target){};
|
||||||
virtual void Update(float dt);
|
virtual void Update(float dt);
|
||||||
void updateTargets();
|
void updateTargets();
|
||||||
|
virtual bool canTarget(MTGGameZone * zone);
|
||||||
virtual int canBeInList(MTGCardInstance * card) = 0;
|
virtual int canBeInList(MTGCardInstance * card) = 0;
|
||||||
virtual int added(MTGCardInstance * card) = 0;
|
virtual int added(MTGCardInstance * card) = 0;
|
||||||
virtual int removed(MTGCardInstance * card) = 0;
|
virtual int removed(MTGCardInstance * card) = 0;
|
||||||
@@ -202,8 +203,8 @@ class AbilityFactory{
|
|||||||
int parsePowerToughness(string s, int *power, int *toughness);
|
int parsePowerToughness(string s, int *power, int *toughness);
|
||||||
TriggeredAbility * parseTrigger(string s, int id, Spell * spell, MTGCardInstance *card, Targetable * target);
|
TriggeredAbility * parseTrigger(string s, int id, Spell * spell, MTGCardInstance *card, Targetable * target);
|
||||||
MTGAbility * parseMagicLine(string s, int id, Spell * spell, MTGCardInstance *card, int activated = 0);
|
MTGAbility * parseMagicLine(string s, int id, Spell * spell, MTGCardInstance *card, int activated = 0);
|
||||||
int abilityEfficiency(MTGAbility * a, Player * p, int mode = MODE_ABILITY);
|
|
||||||
public:
|
public:
|
||||||
|
int abilityEfficiency(MTGAbility * a, Player * p, int mode = MODE_ABILITY);
|
||||||
int magicText(int id, Spell * spell, MTGCardInstance * card = NULL);
|
int magicText(int id, Spell * spell, MTGCardInstance * card = NULL);
|
||||||
static int computeX(Spell * spell, MTGCardInstance * card);
|
static int computeX(Spell * spell, MTGCardInstance * card);
|
||||||
int destroyAllInPlay(TargetChooser * tc, int bury = 0);
|
int destroyAllInPlay(TargetChooser * tc, int bury = 0);
|
||||||
|
|||||||
@@ -38,7 +38,11 @@ AIPlayer::~AIPlayer(){
|
|||||||
stats->save();
|
stats->save();
|
||||||
SAFE_DELETE(stats);
|
SAFE_DELETE(stats);
|
||||||
}
|
}
|
||||||
//TODO delete clickstream!
|
while(!clickstream.empty()){
|
||||||
|
AIAction * action = clickstream.front();
|
||||||
|
SAFE_DELETE(action);
|
||||||
|
clickstream.pop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
MTGCardInstance * AIPlayer::chooseCard(TargetChooser * tc, MTGCardInstance * source, int random){
|
MTGCardInstance * AIPlayer::chooseCard(TargetChooser * tc, MTGCardInstance * source, int random){
|
||||||
for (int i = 0; i < game->hand->nb_cards; i++){
|
for (int i = 0; i < game->hand->nb_cards; i++){
|
||||||
@@ -189,7 +193,13 @@ int AIAction::getEfficiency(){
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (target){
|
if (target){
|
||||||
efficiency = rand() % 5; //Small percentage of chance for other abilities
|
AbilityFactory af;
|
||||||
|
int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY);
|
||||||
|
if ((suggestion == BAKA_EFFECT_BAD && p==target->controller()) ||(suggestion == BAKA_EFFECT_GOOD && p!=target->controller())){
|
||||||
|
efficiency =0;
|
||||||
|
}else{
|
||||||
|
efficiency = rand() % 5; //Small percentage of chance for unknown abilities
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
efficiency = rand() % 10;
|
efficiency = rand() % 10;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -743,23 +743,6 @@ bool ActionStack::CheckUserInput(u32 key){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ActionStack::CombatDamages(){
|
|
||||||
CombatDamages(1);
|
|
||||||
CombatDamages(0);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ActionStack::CombatDamages(int strike){
|
|
||||||
DamageStack * damages = NEW DamageStack(game);
|
|
||||||
int damageitems = damages->CombatDamages(strike);
|
|
||||||
if (damageitems)
|
|
||||||
addAction(damages);
|
|
||||||
else
|
|
||||||
SAFE_DELETE(damages);
|
|
||||||
return damageitems;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Cleans history of last turn
|
//Cleans history of last turn
|
||||||
int ActionStack::garbageCollect(){
|
int ActionStack::garbageCollect(){
|
||||||
std::vector<JGuiObject *>::iterator iter = mObjects.begin() ;
|
std::vector<JGuiObject *>::iterator iter = mObjects.begin() ;
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ void CardGui::Render()
|
|||||||
TargetChooser * tc = NULL;
|
TargetChooser * tc = NULL;
|
||||||
if (game) tc = game->getCurrentTargetChooser();
|
if (game) tc = game->getCurrentTargetChooser();
|
||||||
|
|
||||||
|
quad = cache.getQuad(card);
|
||||||
if (quad) {
|
if (quad) {
|
||||||
const float scale = actZ * 40 / quad->mHeight;
|
const float scale = actZ * 40 / quad->mHeight;
|
||||||
renderer->RenderQuad(GameApp::CommonRes->GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale);
|
renderer->RenderQuad(GameApp::CommonRes->GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale);
|
||||||
|
|||||||
@@ -98,51 +98,6 @@ DamageStack::DamageStack(GameObserver* game) : game(game){
|
|||||||
type = ACTION_DAMAGES;
|
type = ACTION_DAMAGES;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DamageStack::CombatDamages(){
|
|
||||||
CombatDamages(1);
|
|
||||||
CombatDamages(0);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageStack::CombatDamages(int strike){
|
|
||||||
mHeight = 0;
|
|
||||||
MTGInPlay * attackers = game->currentPlayer->game->inPlay;
|
|
||||||
MTGInPlay * defensers = game->opponent()->game->inPlay;
|
|
||||||
|
|
||||||
MTGCardInstance * attacker = attackers->getNextAttacker(NULL);
|
|
||||||
while (attacker != NULL){
|
|
||||||
int nbdefensers = defensers->nbDefensers(attacker);
|
|
||||||
if ((!strike && !attacker->has(Constants::FIRSTSTRIKE)) || (strike && attacker->has(Constants::FIRSTSTRIKE)) || attacker->has(Constants::DOUBLESTRIKE)){
|
|
||||||
if (nbdefensers == 0){
|
|
||||||
Damage * damage = NEW Damage(attacker, game->opponent());
|
|
||||||
Add(damage);
|
|
||||||
}else if (nbdefensers == 1){
|
|
||||||
Damage * damage = NEW Damage(attacker, defensers->getNextDefenser(NULL, attacker));
|
|
||||||
Add(damage);
|
|
||||||
}else{
|
|
||||||
//TODO Fetch list of defensers and allow user to choose targets
|
|
||||||
Damage * damage = NEW Damage(attacker, defensers->getNextDefenser(NULL, attacker));
|
|
||||||
Add(damage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MTGCardInstance * defenser = defensers->getNextDefenser(NULL, attacker);
|
|
||||||
while (defenser != NULL){
|
|
||||||
if ((!strike && !defenser->has(Constants::FIRSTSTRIKE)) || (strike && defenser->has(Constants::FIRSTSTRIKE)) || defenser->has(Constants::DOUBLESTRIKE)){
|
|
||||||
Damage * damage = NEW Damage(defenser, attacker);
|
|
||||||
Add(damage);
|
|
||||||
}
|
|
||||||
defenser = defensers->getNextDefenser(defenser, attacker);
|
|
||||||
}
|
|
||||||
attacker = attackers->getNextAttacker(attacker);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < mCount; i++){
|
|
||||||
Damage * damage = (Damage*)mObjects[i];
|
|
||||||
mHeight += damage->mHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageStack::resolve(){
|
int DamageStack::resolve(){
|
||||||
for (int i = mCount-1; i>= 0; i--){
|
for (int i = mCount-1; i>= 0; i--){
|
||||||
|
|||||||
@@ -1,542 +0,0 @@
|
|||||||
#include "../include/config.h"
|
|
||||||
#include "../include/DamageResolverLayer.h"
|
|
||||||
#include "../include/GameObserver.h"
|
|
||||||
#include "../include/MTGCardInstance.h"
|
|
||||||
#include "../include/DamagerDamaged.h"
|
|
||||||
#include "../include/Damage.h"
|
|
||||||
#include "../include/Translate.h"
|
|
||||||
|
|
||||||
DamageResolverLayer::DamageResolverLayer(GameObserver * game) : game(game){
|
|
||||||
currentPhase = -1;
|
|
||||||
remainingDamageSteps = 0;
|
|
||||||
damageStack = NULL;
|
|
||||||
currentSource = NULL;
|
|
||||||
buttonOk = 0;
|
|
||||||
currentChoosingPlayer = NULL;
|
|
||||||
orderingIsNeeded = 0;
|
|
||||||
}
|
|
||||||
void DamageResolverLayer::Update(float dt){
|
|
||||||
int newPhase = game->getCurrentGamePhase();
|
|
||||||
if (newPhase == Constants::MTG_PHASE_UNTAP){
|
|
||||||
orderingIsNeeded = 0;
|
|
||||||
game->blockersSorted = 0;
|
|
||||||
}
|
|
||||||
if (newPhase == Constants::MTG_PHASE_COMBATDAMAGE){
|
|
||||||
if (!game->mLayers->stackLayer()->getNext(NULL,0,NOT_RESOLVED)){
|
|
||||||
if (newPhase != currentPhase){
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
if (remainingDamageSteps && empty()){
|
|
||||||
OutputDebugString("Combat Damage STEP\n");
|
|
||||||
initResolve();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
remainingDamageSteps = 0;
|
|
||||||
}
|
|
||||||
currentPhase = newPhase;
|
|
||||||
PlayGuiObjectController::Update(dt);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int DamageResolverLayer::autoOrderBlockers(){
|
|
||||||
resetObjects();
|
|
||||||
MTGInPlay * attackers = game->currentPlayer->game->inPlay;
|
|
||||||
MTGCardInstance * attacker = attackers->getNextAttacker(NULL);
|
|
||||||
while (attacker != NULL){
|
|
||||||
if (attacker->blockers.size() > 1){
|
|
||||||
orderingIsNeeded = 1;
|
|
||||||
Player * p = attacker->controller();
|
|
||||||
addIfNotExists(attacker, p);
|
|
||||||
list<MTGCardInstance *>::iterator it;
|
|
||||||
for (it= attacker->blockers.begin(); it != attacker->blockers.end(); ++it){
|
|
||||||
addIfNotExists(*it, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
attacker = attackers->getNextAttacker(attacker);
|
|
||||||
}
|
|
||||||
game->blockersSorted = 1;
|
|
||||||
return 1 - orderingIsNeeded;
|
|
||||||
};
|
|
||||||
|
|
||||||
Player * DamageResolverLayer::whoSelectsDamagesDealtBy(MTGCardInstance * card){
|
|
||||||
if (card->controller() == game->currentPlayer){ //Attacker
|
|
||||||
MTGInPlay * defensers = game->opponent()->game->inPlay;
|
|
||||||
int nbdefensers = defensers->nbDefensers(card);
|
|
||||||
if (nbdefensers == 0) return NULL;
|
|
||||||
if(nbdefensers == 1 && !card->has(Constants::TRAMPLE)) return NULL;
|
|
||||||
MTGCardInstance * defenser = defensers->getNextDefenser(NULL, card);
|
|
||||||
while (defenser != NULL){
|
|
||||||
if (defenser->has(Constants::BANDING)) return game->opponent();
|
|
||||||
defenser = defensers->getNextDefenser(defenser, card);
|
|
||||||
}
|
|
||||||
return game->currentPlayer;
|
|
||||||
}else{ //Defenser
|
|
||||||
MTGInPlay * attackers = game->currentPlayer->game->inPlay;
|
|
||||||
int nbattackers = attackers->nbPartners(card->isDefenser());
|
|
||||||
if(nbattackers <= 1) return NULL;
|
|
||||||
if (card->isDefenser()->banding) return game->currentPlayer;
|
|
||||||
return game->opponent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageResolverLayer::addAutoDamageToOpponents(MTGCardInstance * card){
|
|
||||||
if (card->controller() == game->currentPlayer){ //Attacker
|
|
||||||
MTGInPlay * defensers = game->opponent()->game->inPlay;
|
|
||||||
int nbdefensers = defensers->nbDefensers(card);
|
|
||||||
if (nbdefensers == 0){
|
|
||||||
Damage * damage = NEW Damage (0, card, game->opponent());
|
|
||||||
damageStack->Add(damage);
|
|
||||||
}else if (nbdefensers == 1){
|
|
||||||
Damage * damage = NEW Damage (0, card, defensers->getNextDefenser(NULL, card));
|
|
||||||
damageStack->Add(damage);
|
|
||||||
}else{
|
|
||||||
//SHOULDN'T HAPPEN !
|
|
||||||
}
|
|
||||||
}else{ //Defenser
|
|
||||||
Damage * damage = NEW Damage (mCount,card, card->isDefenser());
|
|
||||||
damageStack->Add(damage);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DamagerDamaged * DamageResolverLayer::addIfNotExists(MTGCardInstance * card, Player * selecter){
|
|
||||||
for (int i = 0; i < mCount; i++){
|
|
||||||
DamagerDamaged * item = (DamagerDamaged *)mObjects[i];
|
|
||||||
if (item->card == card) return item;
|
|
||||||
}
|
|
||||||
// CardGui * cardg = game->mLayers->playLayer()->getByCard(card);
|
|
||||||
// DamagerDamaged * item = NEW DamagerDamaged(card, selecter, mCount == 0);
|
|
||||||
// Add(NEW TransientCardView(card->gui));
|
|
||||||
// mCurr = 0;
|
|
||||||
// return item;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DamageResolverLayer::updateAllCoordinates(){
|
|
||||||
for (int i = 0; i < mCount; i++){
|
|
||||||
/*
|
|
||||||
DamagerDamaged * item = (DamagerDamaged *)mObjects[i];
|
|
||||||
CardGui * cardg = game->mLayers->playLayer()->getByCard(item->card);
|
|
||||||
item->x = cardg->x;
|
|
||||||
item->y = cardg->y;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageResolverLayer::updateCoordinates(MTGCardInstance * card){
|
|
||||||
DamagerDamaged * item = NULL;
|
|
||||||
for (int i = 0; i < mCount; i++){
|
|
||||||
item = (DamagerDamaged *)mObjects[i];
|
|
||||||
if (item->card != card) item = NULL ;
|
|
||||||
}
|
|
||||||
if (!item) return 0;
|
|
||||||
/*
|
|
||||||
CardGui * cardg = game->mLayers->playLayer()->getByCard(card);
|
|
||||||
item->x = cardg->x;
|
|
||||||
item->y = cardg->y;
|
|
||||||
*/
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Adds a card and all its opponents to the Damagers' list
|
|
||||||
int DamageResolverLayer::addDamager(MTGCardInstance * card, Player * selecter){
|
|
||||||
DamagerDamaged * me = addIfNotExists(card, selecter);
|
|
||||||
if (card->controller() == game->currentPlayer){ //Attacker
|
|
||||||
MTGInPlay * defensers = game->opponent()->game->inPlay;
|
|
||||||
MTGCardInstance * defenser = defensers->getNextDefenser(NULL, card);
|
|
||||||
while (defenser != NULL){
|
|
||||||
DamagerDamaged * item = addIfNotExists(defenser, whoSelectsDamagesDealtBy(defenser));
|
|
||||||
while (!item->hasLethalDamage() && me->dealOneDamage(item)){} //Add default damage to the card...
|
|
||||||
defenser = defensers->getNextDefenser(defenser, card);
|
|
||||||
}
|
|
||||||
}else{ //Defenser
|
|
||||||
MTGInPlay * attackers = game->currentPlayer->game->inPlay;
|
|
||||||
MTGCardInstance * attacker = card->isDefenser();
|
|
||||||
DamagerDamaged * item = addIfNotExists(attacker,whoSelectsDamagesDealtBy(attacker));
|
|
||||||
while (!item->hasLethalDamage() && me->dealOneDamage(item)){} //Add default damage to the card...
|
|
||||||
MTGCardInstance * banding = attacker->banding;
|
|
||||||
if (banding){
|
|
||||||
attacker = attackers->getNextAttacker(NULL);
|
|
||||||
while (attacker != NULL){
|
|
||||||
if (attacker->banding == banding){
|
|
||||||
item = addIfNotExists(attacker,whoSelectsDamagesDealtBy(attacker));
|
|
||||||
while (!item->hasLethalDamage() && me->dealOneDamage(item)){} //Add default damage to the card...
|
|
||||||
}
|
|
||||||
attacker = attackers->getNextAttacker(attacker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageResolverLayer::initResolve(){
|
|
||||||
#if defined (WIN32) || defined (LINUX)
|
|
||||||
char buf[4096];
|
|
||||||
sprintf(buf, "starting resolve, remainingDamagesStep = %i\n", remainingDamageSteps);
|
|
||||||
OutputDebugString(buf);
|
|
||||||
#endif
|
|
||||||
if (damageStack) return 0;
|
|
||||||
|
|
||||||
#if defined (WIN32) || defined (LINUX)
|
|
||||||
sprintf(buf, "damageStack is NULL, we can resolve \n");
|
|
||||||
OutputDebugString(buf);
|
|
||||||
#endif
|
|
||||||
currentSource = NULL;
|
|
||||||
currentChoosingPlayer = game->currentPlayer;
|
|
||||||
damageStack = NEW DamageStack(game);
|
|
||||||
int strike = 0;
|
|
||||||
if (remainingDamageSteps == 2) strike = 1;
|
|
||||||
|
|
||||||
MTGInPlay * attackers = game->currentPlayer->game->inPlay;
|
|
||||||
MTGInPlay * defensers = game->opponent()->game->inPlay;
|
|
||||||
|
|
||||||
MTGCardInstance * attacker = attackers->getNextAttacker(NULL);
|
|
||||||
while (attacker != NULL){
|
|
||||||
if ((!strike && !attacker->has(Constants::FIRSTSTRIKE)) || (strike && attacker->has(Constants::FIRSTSTRIKE)) || attacker->has(Constants::DOUBLESTRIKE)){
|
|
||||||
OutputDebugString("Attacker Damaging!\n");
|
|
||||||
if (Player * selecter = whoSelectsDamagesDealtBy(attacker)){
|
|
||||||
addDamager(attacker, selecter);
|
|
||||||
}else{
|
|
||||||
addAutoDamageToOpponents(attacker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MTGCardInstance * defenser = defensers->getNextDefenser(NULL, attacker);
|
|
||||||
while (defenser != NULL){
|
|
||||||
if ((!strike && !defenser->has(Constants::FIRSTSTRIKE)) || (strike && defenser->has(Constants::FIRSTSTRIKE)) || defenser->has(Constants::DOUBLESTRIKE)){
|
|
||||||
OutputDebugString("Blocker Damaging!\n");
|
|
||||||
if (Player * selecterb = whoSelectsDamagesDealtBy(defenser)){
|
|
||||||
addDamager(defenser, selecterb);
|
|
||||||
}else{
|
|
||||||
addAutoDamageToOpponents(defenser);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
defenser = defensers->getNextDefenser(defenser, attacker);
|
|
||||||
}
|
|
||||||
attacker = attackers->getNextAttacker(attacker);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty()){
|
|
||||||
if (!damageStack->empty()){
|
|
||||||
game->mLayers->stackLayer()->addAction(damageStack);
|
|
||||||
game->mLayers->stackLayer()->resolve(); //Wagic 2010
|
|
||||||
}else{
|
|
||||||
SAFE_DELETE(damageStack);
|
|
||||||
}
|
|
||||||
remainingDamageSteps--;
|
|
||||||
damageStack = NULL;
|
|
||||||
modal = remainingDamageSteps;
|
|
||||||
}else{
|
|
||||||
//nextPlayer();
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
int DamageResolverLayer::init(){
|
|
||||||
modal = 1;
|
|
||||||
remainingDamageSteps = 2;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
DamagerDamaged * DamageResolverLayer::findByCard(MTGCardInstance * card){
|
|
||||||
for (int i =0; i < mCount; i++){
|
|
||||||
DamagerDamaged * current = (DamagerDamaged *) mObjects[i];
|
|
||||||
if (current->card == card) return current;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Returns 1 if all "compulsory" damages have been assigned for current player
|
|
||||||
int DamageResolverLayer::canStopDealDamages(){
|
|
||||||
for (int i = 0; i < mCount ; i ++){
|
|
||||||
DamagerDamaged * current = (DamagerDamaged *) mObjects[i];
|
|
||||||
MTGCardInstance * card = current->card;
|
|
||||||
if (current->damageSelecter==currentChoosingPlayer){
|
|
||||||
if (current->damageToDeal > 0){
|
|
||||||
if (card->controller() == game->currentPlayer){ //Attacker
|
|
||||||
if (card->has(Constants::TRAMPLE)){
|
|
||||||
MTGInPlay * defensers = game->opponent()->game->inPlay;
|
|
||||||
MTGCardInstance * defenser = defensers->getNextDefenser(NULL, card);
|
|
||||||
while (defenser != NULL){
|
|
||||||
DamagerDamaged * _defenser = findByCard(defenser);
|
|
||||||
if (!_defenser->hasLethalDamage()) return 0;
|
|
||||||
defenser = defensers->getNextDefenser(defenser, card);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}else{ //Defenser
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (card->controller() == game->currentPlayer){ //Attacker
|
|
||||||
//check that blockers have lethal damage
|
|
||||||
list<MTGCardInstance *>::iterator it;
|
|
||||||
int found_non_lethal = 0;
|
|
||||||
for (it= card->blockers.begin(); it != card->blockers.end(); ++it){
|
|
||||||
MTGCardInstance * c = *it;
|
|
||||||
DamagerDamaged * defenser = findByCard(c);
|
|
||||||
if (found_non_lethal && defenser->sumDamages()) return 0;
|
|
||||||
if (!defenser->hasLethalDamage()) found_non_lethal = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageResolverLayer::trampleDamage(){
|
|
||||||
for (int i = 0; i < mCount ; i ++){
|
|
||||||
DamagerDamaged * current = (DamagerDamaged *) mObjects[i];
|
|
||||||
if (current->damageToDeal > 0){
|
|
||||||
MTGCardInstance * card = current->card;
|
|
||||||
if (card->controller() == game->currentPlayer){ //Attacker
|
|
||||||
if (card->has(Constants::TRAMPLE)){
|
|
||||||
Damage * damage = NEW Damage(0, card, game->opponent(), current->damageToDeal);
|
|
||||||
damageStack->Add(damage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageResolverLayer::resolveDamages(){
|
|
||||||
trampleDamage();
|
|
||||||
/*
|
|
||||||
for (int i = 0; i < mCount ; i++){
|
|
||||||
DamagerDamaged * current = (DamagerDamaged *) mObjects[i];
|
|
||||||
for (int j =0; j < current->mCount ; j++){
|
|
||||||
Damage * damage = NEW Damage(0, current->damages[j]->source, current->damages[j]->target, current->damages[j]->damage);
|
|
||||||
damageStack->Add(damage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
game->mLayers->stackLayer()->addAction(damageStack);
|
|
||||||
game->mLayers->stackLayer()->resolve(); //Wagic 2010
|
|
||||||
remainingDamageSteps--;
|
|
||||||
resetObjects();
|
|
||||||
damageStack = NULL;
|
|
||||||
modal = remainingDamageSteps;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//a and b are opponents if b is blocking a band in which a belongs or blocking directly a
|
|
||||||
int DamageResolverLayer::isOpponent(DamagerDamaged * a, DamagerDamaged * b){
|
|
||||||
MTGCardInstance * carda = a->card;
|
|
||||||
MTGCardInstance * cardb = b->card;
|
|
||||||
if (cardb->controller() == game->currentPlayer) {//if b is the attacker switch the cards
|
|
||||||
carda = cardb;
|
|
||||||
cardb = a->card;
|
|
||||||
}
|
|
||||||
if (cardb->controller() == game->currentPlayer || carda->controller() == game->opponent()) return 0; //Same team, idiot !
|
|
||||||
|
|
||||||
if (!carda->banding){
|
|
||||||
if (cardb->isDefenser() == carda) return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cardb->isDefenser() && cardb->isDefenser()->banding == carda->banding) return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DamageResolverLayer::nextPlayer(){
|
|
||||||
if (!canStopDealDamages()) return 0;
|
|
||||||
if (currentChoosingPlayer == game->currentPlayer){
|
|
||||||
currentChoosingPlayer = game->opponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
resolveDamages();
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DamageResolverLayer::blockersOrderingDone(){
|
|
||||||
orderingIsNeeded = 0;
|
|
||||||
game->blockersSorted = 1;
|
|
||||||
resetObjects();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DamageResolverLayer::clickReorderBlocker(MTGCardInstance * blocker){
|
|
||||||
if (!blocker->defenser) return false;
|
|
||||||
MTGCardInstance * attacker = blocker->defenser;
|
|
||||||
attacker->raiseBlockerRankOrder(blocker);
|
|
||||||
list<MTGCardInstance *>::iterator it;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DamageResolverLayer::checkUserInputOrderBlockers(u32 key){
|
|
||||||
if (PSP_CTRL_CIRCLE == key) {
|
|
||||||
if (mObjects[mCurr] && mObjects[mCurr]->ButtonPressed()){
|
|
||||||
DamagerDamaged * current = (DamagerDamaged *) mObjects[mCurr];
|
|
||||||
MTGCardInstance * blocker = current->card;
|
|
||||||
return clickReorderBlocker(blocker);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}else if (PSP_CTRL_SQUARE == key){
|
|
||||||
return blockersOrderingDone();
|
|
||||||
}else{
|
|
||||||
return PlayGuiObjectController::CheckUserInput(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DamageResolverLayer::clickDamage(MTGCardInstance *c){
|
|
||||||
DamagerDamaged * current = findByCard(c);
|
|
||||||
return clickDamage(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DamageResolverLayer::clickDamage(DamagerDamaged * current){
|
|
||||||
if (!current) return false;
|
|
||||||
if (!currentSource || !isOpponent(current,currentSource)){
|
|
||||||
for (int i = 0; i < mCount; i++){
|
|
||||||
DamagerDamaged * _current = (DamagerDamaged *) mObjects[i];
|
|
||||||
if (isOpponent(current,_current)){
|
|
||||||
currentSource = _current;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (currentSource){
|
|
||||||
if (currentSource->damageSelecter == currentChoosingPlayer){
|
|
||||||
if (isOpponent(current,currentSource)){
|
|
||||||
MTGCardInstance * card = currentSource->card;
|
|
||||||
list<MTGCardInstance *>::iterator it = card->blockers.begin();
|
|
||||||
while (it!= card->blockers.end() && *it!=current->card){
|
|
||||||
DamagerDamaged * item = findByCard(*it);
|
|
||||||
while (!item->hasLethalDamage() && currentSource->dealOneDamage(item)){} //Add default damage to the card...
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
if (!currentSource->dealOneDamage(current)){
|
|
||||||
currentSource->removeDamagesTo(current);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
if (current->damageSelecter == currentChoosingPlayer){
|
|
||||||
currentSource = current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DamageResolverLayer::CheckUserInput(u32 key){
|
|
||||||
if (!mCount) return false;
|
|
||||||
if (orderingIsNeeded) return checkUserInputOrderBlockers(key);
|
|
||||||
if (PSP_CTRL_CIRCLE == key){
|
|
||||||
if (mObjects[mCurr] && mObjects[mCurr]->ButtonPressed()){
|
|
||||||
DamagerDamaged * current = (DamagerDamaged *) mObjects[mCurr];
|
|
||||||
return clickDamage(current);
|
|
||||||
//buttonOk = 0;
|
|
||||||
//if (canStopDealDamages()) buttonOk = 1;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}else if (PSP_CTRL_CROSS == key){
|
|
||||||
if (mObjects[mCurr] && mObjects[mCurr]->ButtonPressed()){
|
|
||||||
DamagerDamaged * current = (DamagerDamaged *) mObjects[mCurr];
|
|
||||||
if (current->damageSelecter == currentChoosingPlayer){
|
|
||||||
currentSource = current;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}else if (PSP_CTRL_SQUARE == key){
|
|
||||||
return nextPlayer();
|
|
||||||
}else{
|
|
||||||
if (!mCount)
|
|
||||||
return false;
|
|
||||||
if (game != NULL){
|
|
||||||
if (mActionButton == key){
|
|
||||||
if (mObjects[mCurr] != NULL && mObjects[mCurr]->ButtonPressed()){
|
|
||||||
game->ButtonPressed((PlayGuiObject *)mObjects[mCurr]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (PSP_CTRL_CROSS == key){
|
|
||||||
game->cancelCurrentAction();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
last_user_move = 0;
|
|
||||||
switch (key)
|
|
||||||
{
|
|
||||||
case PSP_CTRL_LEFT:
|
|
||||||
{
|
|
||||||
int n = getClosestItem(DIR_LEFT);
|
|
||||||
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_LEFT))
|
|
||||||
{
|
|
||||||
mCurr = n;
|
|
||||||
mObjects[mCurr]->Entering();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case PSP_CTRL_RIGHT:
|
|
||||||
{
|
|
||||||
int n = getClosestItem(DIR_RIGHT);
|
|
||||||
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_RIGHT))
|
|
||||||
{
|
|
||||||
mCurr = n;
|
|
||||||
mObjects[mCurr]->Entering();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case PSP_CTRL_UP:
|
|
||||||
{
|
|
||||||
int n = getClosestItem(DIR_UP);
|
|
||||||
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_UP))
|
|
||||||
{
|
|
||||||
mCurr = n;
|
|
||||||
mObjects[mCurr]->Entering();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case PSP_CTRL_DOWN:
|
|
||||||
{
|
|
||||||
int n = getClosestItem(DIR_DOWN);
|
|
||||||
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_DOWN))
|
|
||||||
{
|
|
||||||
mCurr = n;
|
|
||||||
mObjects[mCurr]->Entering();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case PSP_CTRL_TRIANGLE:
|
|
||||||
showBigCards = (showBigCards + 1) % 3;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DamageResolverLayer::Render(){
|
|
||||||
if (!mCount) return;
|
|
||||||
updateAllCoordinates(); //this is dirty :(
|
|
||||||
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
|
|
||||||
mFont->SetBase(0);
|
|
||||||
|
|
||||||
JRenderer * renderer = JRenderer::GetInstance();
|
|
||||||
renderer->FillRect(0 ,0 , SCREEN_WIDTH , SCREEN_HEIGHT , ARGB(200,0,0,0));
|
|
||||||
if (currentChoosingPlayer == game->currentPlayer){
|
|
||||||
mFont->DrawString(_("Attacking Player").c_str(), 0,0);
|
|
||||||
}else{
|
|
||||||
mFont->DrawString(_("Blocking Player").c_str(), 0,0);
|
|
||||||
}
|
|
||||||
if (currentSource){
|
|
||||||
// currentSource->RenderBig(10, 20);
|
|
||||||
mFont->DrawString(_("Current Damager:").c_str(), 10, 5);
|
|
||||||
}
|
|
||||||
for (int i = 0; i < mCount; i++){
|
|
||||||
((DamagerDamaged *)mObjects[i])->Render();
|
|
||||||
}
|
|
||||||
if (mObjects[mCurr]){
|
|
||||||
((DamagerDamaged *)mObjects[mCurr])->Render();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (currentPhase == Constants::MTG_PHASE_COMBATDAMAGE && canStopDealDamages()){
|
|
||||||
mFont->DrawString(_("Damages Assigned, Click Square to Continue").c_str(), 250, 5);
|
|
||||||
}
|
|
||||||
if (orderingIsNeeded) mFont->DrawString(_("Order blockers, then Click Square to Continue").c_str(), 200, 5);
|
|
||||||
}
|
|
||||||
@@ -2081,6 +2081,14 @@ ostream& InstantAbility::toString(ostream& out) const
|
|||||||
return MTGAbility::toString(out) << ")";
|
return MTGAbility::toString(out) << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ListMaintainerAbility::canTarget(MTGGameZone * zone){
|
||||||
|
if (tc) return tc->targetsZone(zone);
|
||||||
|
for (int i = 0; i < 2; i++){
|
||||||
|
Player * p = game->players[i];
|
||||||
|
if (zone == p->game->inPlay) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void ListMaintainerAbility::updateTargets(){
|
void ListMaintainerAbility::updateTargets(){
|
||||||
//remove invalid ones
|
//remove invalid ones
|
||||||
@@ -2104,10 +2112,12 @@ void ListMaintainerAbility::updateTargets(){
|
|||||||
MTGGameZone * zones[] = {p->game->inPlay,p->game->graveyard,p->game->hand,p->game->library};
|
MTGGameZone * zones[] = {p->game->inPlay,p->game->graveyard,p->game->hand,p->game->library};
|
||||||
for (int k = 0; k < 4; k++){
|
for (int k = 0; k < 4; k++){
|
||||||
MTGGameZone * zone = zones[k];
|
MTGGameZone * zone = zones[k];
|
||||||
for (int j = 0; j < zone->nb_cards; j++){
|
if (canTarget(zone)){
|
||||||
if (canBeInList(zone->cards[j])){
|
for (int j = 0; j < zone->nb_cards; j++){
|
||||||
if(cards.find(zone->cards[j]) == cards.end()){
|
if (canBeInList(zone->cards[j])){
|
||||||
temp[zone->cards[j]] = true;
|
if(cards.find(zone->cards[j]) == cards.end()){
|
||||||
|
temp[zone->cards[j]] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -280,10 +280,6 @@
|
|||||||
RelativePath=".\src\DamagerDamaged.cpp"
|
RelativePath=".\src\DamagerDamaged.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\src\DamageResolverLayer.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\src\DeckDataWrapper.cpp"
|
RelativePath=".\src\DeckDataWrapper.cpp"
|
||||||
>
|
>
|
||||||
@@ -657,10 +653,6 @@
|
|||||||
RelativePath=".\include\DamagerDamaged.h"
|
RelativePath=".\include\DamagerDamaged.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\include\DamageResolverLayer.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\include\DeckDataWrapper.h"
|
RelativePath=".\include\DeckDataWrapper.h"
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user