J :
* Some more tweaking for combat. * This still doesn't work, but it's closer.
This commit is contained in:
@@ -40,7 +40,7 @@ class Damage: public Interruptible {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class DamageStack :public GuiLayer, public Interruptible{
|
class DamageStack : public GuiLayer, public Interruptible{
|
||||||
protected:
|
protected:
|
||||||
int currentState;
|
int currentState;
|
||||||
GameObserver* game;
|
GameObserver* game;
|
||||||
@@ -49,20 +49,7 @@ class DamageStack :public GuiLayer, public Interruptible{
|
|||||||
int resolve();
|
int resolve();
|
||||||
void Render();
|
void Render();
|
||||||
virtual ostream& toString(ostream& out) const;
|
virtual ostream& toString(ostream& out) const;
|
||||||
DamageStack(GameObserver* game);
|
DamageStack();
|
||||||
};
|
};
|
||||||
|
|
||||||
class StableDamageStack : public Interruptible {
|
|
||||||
protected:
|
|
||||||
vector<Damage*> damage;
|
|
||||||
|
|
||||||
public:
|
|
||||||
int resolve();
|
|
||||||
void Render();
|
|
||||||
void Add(Damage*);
|
|
||||||
virtual ostream& toString(ostream& out) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -31,11 +31,9 @@ class GameObserver{
|
|||||||
int nbPlayers;
|
int nbPlayers;
|
||||||
int currentPlayerId;
|
int currentPlayerId;
|
||||||
int currentRound;
|
int currentRound;
|
||||||
int blockersAssigned;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int blockersSorted;
|
CombatStep combatStep;
|
||||||
int turn;
|
int turn;
|
||||||
int forceShuffleLibraries();
|
int forceShuffleLibraries();
|
||||||
int targetListIsSet(MTGCardInstance * card);
|
int targetListIsSet(MTGCardInstance * card);
|
||||||
@@ -57,6 +55,7 @@ class GameObserver{
|
|||||||
void cardClick(MTGCardInstance * card,Targetable * _object = NULL );
|
void cardClick(MTGCardInstance * card,Targetable * _object = NULL );
|
||||||
int enteringPhase(int phase);
|
int enteringPhase(int phase);
|
||||||
int getCurrentGamePhase();
|
int getCurrentGamePhase();
|
||||||
|
void nextCombatStep();
|
||||||
void userRequestNextGamePhase();
|
void userRequestNextGamePhase();
|
||||||
void nextGamePhase();
|
void nextGamePhase();
|
||||||
void cleanupPhase();
|
void cleanupPhase();
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#include "CardGui.h"
|
#include "CardGui.h"
|
||||||
#include "GuiAvatars.h"
|
#include "GuiAvatars.h"
|
||||||
|
|
||||||
class TransientCardView;
|
class CardView;
|
||||||
|
|
||||||
struct GuiStatic : public PlayGuiObject{
|
struct GuiStatic : public PlayGuiObject{
|
||||||
GuiAvatars* parent;
|
GuiAvatars* parent;
|
||||||
@@ -35,7 +35,7 @@ struct GuiAvatar : public GuiStatic{
|
|||||||
struct GuiGameZone : public GuiStatic{
|
struct GuiGameZone : public GuiStatic{
|
||||||
static const int Width = 20;
|
static const int Width = 20;
|
||||||
static const int Height = 25;
|
static const int Height = 25;
|
||||||
vector<TransientCardView*> cards;
|
vector<CardView*> cards;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MTGGameZone * zone;
|
MTGGameZone * zone;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using std::list;
|
|||||||
|
|
||||||
class Player;
|
class Player;
|
||||||
|
|
||||||
typedef enum { ORDER, FIRST_STRIKE, DAMAGE } CombatStep;
|
typedef enum { BLOCKERS, ORDER, FIRST_STRIKE, DAMAGE } CombatStep;
|
||||||
class Phase{
|
class Phase{
|
||||||
public:
|
public:
|
||||||
int id;
|
int id;
|
||||||
|
|||||||
@@ -56,12 +56,9 @@ MTGCardInstance * AIPlayer::chooseCard(TargetChooser * tc, MTGCardInstance * sou
|
|||||||
|
|
||||||
int AIPlayer::Act(float dt){
|
int AIPlayer::Act(float dt){
|
||||||
GameObserver * gameObs = GameObserver::GetInstance();
|
GameObserver * gameObs = GameObserver::GetInstance();
|
||||||
if (gameObs->currentPlayer == this){
|
if (gameObs->currentPlayer == this)
|
||||||
gameObs->userRequestNextGamePhase();
|
gameObs->userRequestNextGamePhase();
|
||||||
return 1;
|
return 1;
|
||||||
}else{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -498,14 +495,14 @@ int AIPlayer::chooseBlockers(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
int AIPlayer::orderBlockers(){
|
int AIPlayer::orderBlockers(){
|
||||||
/*
|
|
||||||
GameObserver * g = GameObserver::GetInstance();
|
GameObserver * g = GameObserver::GetInstance();
|
||||||
DamageResolverLayer * drl = g->mLayers->combatLayer();
|
if (BLOCKERS == g->combatStep && g->currentPlayer==this)
|
||||||
if (drl->orderingIsNeeded && g->currentPlayer==this){
|
{
|
||||||
drl->blockersOrderingDone(); //TODO clever rank of blockers
|
g->userRequestNextGamePhase(); //TODO clever rank of blockers
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -716,6 +713,7 @@ int AIPlayerBaka::computeActions(){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
cout << "my turn" << endl;
|
||||||
switch(currentGamePhase){
|
switch(currentGamePhase){
|
||||||
case Constants::MTG_PHASE_COMBATBLOCKERS:
|
case Constants::MTG_PHASE_COMBATBLOCKERS:
|
||||||
chooseBlockers();
|
chooseBlockers();
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ void CardGui::Render()
|
|||||||
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE * 0.5 * actZ);
|
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE * 0.5 * actZ);
|
||||||
mFont->DrawString(card->getName().c_str(), actX - actZ * Width / 2 + 1, actY - actZ * Height / 2 + 1);
|
mFont->DrawString(card->getName().c_str(), actX - actZ * Width / 2 + 1, actY - actZ * Height / 2 + 1);
|
||||||
if (icon) { icon->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,255)); renderer->RenderQuad(icon, actX, actY, 0); }
|
if (icon) { icon->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,255)); renderer->RenderQuad(icon, actX, actY, 0); }
|
||||||
if (tc && !tc->canTarget(card)) renderer->FillRect(actX - actZ*Width/2, actY - actZ*Height/2, actZ*Width, actZ*Height, ARGB(200,0,0,0));
|
if (tc && !tc->canTarget(card)) renderer->FillRect(actX - actZ*Width/2, actY - actZ*Height/2, actZ*Width, actZ*Height, ARGB((static_cast<unsigned char>(actA*0.75)),0,0,0));
|
||||||
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
|
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ ostream& Damage::toString(ostream& out) const
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
DamageStack::DamageStack(GameObserver* game) : game(game){
|
DamageStack::DamageStack() {
|
||||||
currentState = -1;
|
currentState = -1;
|
||||||
type = ACTION_DAMAGES;
|
type = ACTION_DAMAGES;
|
||||||
}
|
}
|
||||||
@@ -130,33 +130,3 @@ ostream& DamageStack::toString(ostream& out) const
|
|||||||
{
|
{
|
||||||
return (out << "DamageStack ::: currentState : " << currentState);
|
return (out << "DamageStack ::: currentState : " << currentState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int StableDamageStack::resolve()
|
|
||||||
{
|
|
||||||
for (vector<Damage*>::iterator it = damage.begin(); it != damage.end(); ++it)
|
|
||||||
if ((*it)->state == NOT_RESOLVED) (*it)->resolve();
|
|
||||||
for (vector<Damage*>::iterator it = damage.begin(); it != damage.end(); ++it)
|
|
||||||
if ((*it)->state == RESOLVED_OK) (*it)->target->afterDamage();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StableDamageStack::Render(){
|
|
||||||
int currenty = y;
|
|
||||||
for (vector<Damage*>::iterator it = damage.begin(); it != damage.end(); ++it)
|
|
||||||
{
|
|
||||||
if ((*it)->state == NOT_RESOLVED){
|
|
||||||
(*it)->x = x;
|
|
||||||
(*it)->y = currenty;
|
|
||||||
currenty += (*it)->mHeight;
|
|
||||||
(*it)->Render();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void StableDamageStack::Add(Damage* d) { damage.push_back(d); }
|
|
||||||
|
|
||||||
ostream& StableDamageStack::toString(ostream& out) const
|
|
||||||
{
|
|
||||||
return (out << "StableDamageStack ::: size : " << damage.size());
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ void DamagerDamaged::Render(CombatStep mode)
|
|||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
|
case BLOCKERS :
|
||||||
case ORDER :
|
case ORDER :
|
||||||
mFont->SetColor(ARGB(92,255,255,255));
|
mFont->SetColor(ARGB(92,255,255,255));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -112,9 +112,9 @@ void DuelLayers::Render(){
|
|||||||
|
|
||||||
int DuelLayers::receiveEvent(WEvent * e){
|
int DuelLayers::receiveEvent(WEvent * e){
|
||||||
|
|
||||||
#if 0
|
#if 1
|
||||||
#define PRINT_IF(type) { type *foo = dynamic_cast<type*>(e); if (foo) cout << "Is a " << #type << endl; }
|
#define PRINT_IF(type) { type *foo = dynamic_cast<type*>(e); if (foo) cout << "Is a " << #type << endl; }
|
||||||
cout << "Received event " << e << endl;
|
cout << "Received event " << e << " ";
|
||||||
PRINT_IF(WEventZoneChange);
|
PRINT_IF(WEventZoneChange);
|
||||||
PRINT_IF(WEventDamage);
|
PRINT_IF(WEventDamage);
|
||||||
PRINT_IF(WEventPhaseChange);
|
PRINT_IF(WEventPhaseChange);
|
||||||
|
|||||||
@@ -51,8 +51,7 @@ GameObserver::GameObserver(Player * _players[], int _nb_players){
|
|||||||
gameOver = NULL;
|
gameOver = NULL;
|
||||||
phaseRing = NEW PhaseRing(_players,_nb_players);
|
phaseRing = NEW PhaseRing(_players,_nb_players);
|
||||||
replacementEffects = NEW ReplacementEffects();
|
replacementEffects = NEW ReplacementEffects();
|
||||||
blockersSorted = false;
|
combatStep = BLOCKERS;
|
||||||
blockersAssigned = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameObserver::setGamePhaseManager(MTGGamePhase * _phases){
|
void GameObserver::setGamePhaseManager(MTGGamePhase * _phases){
|
||||||
@@ -79,23 +78,12 @@ void GameObserver::nextPlayer(){
|
|||||||
currentPlayerId = (currentPlayerId+1)%nbPlayers;
|
currentPlayerId = (currentPlayerId+1)%nbPlayers;
|
||||||
currentPlayer = players[currentPlayerId];
|
currentPlayer = players[currentPlayerId];
|
||||||
currentActionPlayer = currentPlayer;
|
currentActionPlayer = currentPlayer;
|
||||||
blockersSorted = false;
|
combatStep = BLOCKERS;
|
||||||
blockersAssigned = 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void GameObserver::nextGamePhase(){
|
void GameObserver::nextGamePhase(){
|
||||||
Phase * cPhaseOld = phaseRing->getCurrentPhase();
|
Phase * cPhaseOld = phaseRing->getCurrentPhase();
|
||||||
if (!blockersSorted && cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS){
|
if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS)
|
||||||
blockersAssigned = 1;
|
if (DAMAGE != combatStep) { nextCombatStep(); return; }
|
||||||
receiveEvent(NEW WEventCombatStepChange(ORDER));
|
|
||||||
/*
|
|
||||||
if (!mLayers->combatLayer()->autoOrderBlockers()){
|
|
||||||
OutputDebugString("Player has To choose ordering!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
phaseRing->forward();
|
phaseRing->forward();
|
||||||
Phase * cPhase = phaseRing->getCurrentPhase();
|
Phase * cPhase = phaseRing->getCurrentPhase();
|
||||||
currentGamePhase = cPhase->id;
|
currentGamePhase = cPhase->id;
|
||||||
@@ -107,6 +95,7 @@ void GameObserver::nextGamePhase(){
|
|||||||
cleanupPhase();
|
cleanupPhase();
|
||||||
currentPlayer->canPutLandsIntoPlay = 1;
|
currentPlayer->canPutLandsIntoPlay = 1;
|
||||||
mLayers->actionLayer()->Update(0);
|
mLayers->actionLayer()->Update(0);
|
||||||
|
combatStep = BLOCKERS;
|
||||||
return nextGamePhase();
|
return nextGamePhase();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,28 +137,30 @@ int GameObserver::cancelCurrentAction(){
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameObserver::nextCombatStep()
|
||||||
|
{
|
||||||
|
switch (combatStep)
|
||||||
|
{
|
||||||
|
case BLOCKERS : receiveEvent(NEW WEventCombatStepChange(combatStep = ORDER)); return;
|
||||||
|
case ORDER : receiveEvent(NEW WEventCombatStepChange(combatStep = FIRST_STRIKE)); return;
|
||||||
|
case FIRST_STRIKE : receiveEvent(NEW WEventCombatStepChange(combatStep = DAMAGE)); return;
|
||||||
|
case DAMAGE : ; // Nothing : go to next phase
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GameObserver::userRequestNextGamePhase(){
|
void GameObserver::userRequestNextGamePhase(){
|
||||||
if (mLayers->stackLayer()->getNext(NULL,0,NOT_RESOLVED)) return;
|
if (mLayers->stackLayer()->getNext(NULL,0,NOT_RESOLVED)) return;
|
||||||
if (getCurrentTargetChooser()) return;
|
if (getCurrentTargetChooser()) return;
|
||||||
// if (mLayers->combatLayer()->isDisplayed()) return;
|
// if (mLayers->combatLayer()->isDisplayed()) return;
|
||||||
Phase * cPhaseOld = phaseRing->getCurrentPhase();
|
Phase * cPhaseOld = phaseRing->getCurrentPhase();
|
||||||
if (!blockersSorted && cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS){
|
if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS)
|
||||||
blockersAssigned = 1;
|
if (DAMAGE != combatStep) { nextCombatStep(); return; }
|
||||||
receiveEvent(NEW WEventCombatStepChange(ORDER));
|
|
||||||
/*
|
|
||||||
if (!mLayers->combatLayer()->autoOrderBlockers()){
|
|
||||||
OutputDebugString("Player has To choose ordering!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS ||
|
if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS ||
|
||||||
opponent()->isAI() ||
|
opponent()->isAI() ||
|
||||||
options[GameOptions::phaseInterrupts[currentGamePhase]].number){
|
options[GameOptions::phaseInterrupts[currentGamePhase]].number)
|
||||||
mLayers->stackLayer()->AddNextGamePhase();
|
mLayers->stackLayer()->AddNextGamePhase();
|
||||||
}else{
|
else
|
||||||
nextGamePhase();
|
nextGamePhase();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int GameObserver::forceShuffleLibraries(){
|
int GameObserver::forceShuffleLibraries(){
|
||||||
@@ -238,15 +229,15 @@ void GameObserver::addObserver(MTGAbility * observer){
|
|||||||
|
|
||||||
|
|
||||||
void GameObserver::removeObserver(ActionElement * observer){
|
void GameObserver::removeObserver(ActionElement * observer){
|
||||||
if (observer){
|
if (observer)
|
||||||
if (mLayers->actionLayer()->getIndexOf(observer) != -1){
|
{
|
||||||
observer->destroy();
|
if (mLayers->actionLayer()->getIndexOf(observer) != -1){
|
||||||
mLayers->actionLayer()->Remove(observer);
|
observer->destroy();
|
||||||
|
mLayers->actionLayer()->Remove(observer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}else{
|
else
|
||||||
//TODO log error
|
{} //TODO log error
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GameObserver::~GameObserver(){
|
GameObserver::~GameObserver(){
|
||||||
@@ -256,17 +247,10 @@ GameObserver::~GameObserver(){
|
|||||||
SAFE_DELETE(phaseRing);
|
SAFE_DELETE(phaseRing);
|
||||||
SAFE_DELETE(replacementEffects);
|
SAFE_DELETE(replacementEffects);
|
||||||
LOG("==GameObserver Destroyed==");
|
LOG("==GameObserver Destroyed==");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameObserver::Update(float dt){
|
void GameObserver::Update(float dt){
|
||||||
Player * player = currentPlayer;
|
Player * player = currentPlayer;
|
||||||
if (currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS && !blockersSorted){
|
|
||||||
player = opponent();
|
|
||||||
}else if (currentGamePhase == Constants::MTG_PHASE_COMBATDAMAGE){
|
|
||||||
// DamageResolverLayer * drl = mLayers->combatLayer();
|
|
||||||
// if (drl->currentChoosingPlayer && drl->mCount) player = drl->currentChoosingPlayer;
|
|
||||||
}
|
|
||||||
currentActionPlayer = player;
|
currentActionPlayer = player;
|
||||||
if (isInterrupting) player = isInterrupting;
|
if (isInterrupting) player = isInterrupting;
|
||||||
mLayers->Update(dt,player);
|
mLayers->Update(dt,player);
|
||||||
@@ -275,13 +259,12 @@ void GameObserver::Update(float dt){
|
|||||||
}
|
}
|
||||||
stateEffects();
|
stateEffects();
|
||||||
oldGamePhase = currentGamePhase;
|
oldGamePhase = currentGamePhase;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//applies damage to creatures after updates
|
//applies damage to creatures after updates
|
||||||
//Players life test
|
//Players life test
|
||||||
void GameObserver::stateEffects(){
|
void GameObserver::stateEffects()
|
||||||
|
{
|
||||||
if (mLayers->stackLayer()->count(0,NOT_RESOLVED) != 0) return;
|
if (mLayers->stackLayer()->count(0,NOT_RESOLVED) != 0) return;
|
||||||
if (mLayers->actionLayer()->menuObject) return;
|
if (mLayers->actionLayer()->menuObject) return;
|
||||||
if (targetChooser || mLayers->actionLayer()->isWaitingForAnswer()) return;
|
if (targetChooser || mLayers->actionLayer()->isWaitingForAnswer()) return;
|
||||||
@@ -292,23 +275,18 @@ void GameObserver::stateEffects(){
|
|||||||
card->afterDamage();
|
card->afterDamage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int i =0; i < 2; i++)
|
||||||
for (int i =0; i < 2; i++){
|
|
||||||
if (players[i]->life <= 0) gameOver = players[i];
|
if (players[i]->life <= 0) gameOver = players[i];
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GameObserver::Render(){
|
void GameObserver::Render()
|
||||||
|
{
|
||||||
mLayers->Render();
|
mLayers->Render();
|
||||||
if (targetChooser || mLayers->actionLayer()->isWaitingForAnswer()){
|
if (targetChooser || mLayers->actionLayer()->isWaitingForAnswer())
|
||||||
JRenderer::GetInstance()->DrawRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,ARGB(255,255,0,0));
|
JRenderer::GetInstance()->DrawRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,ARGB(255,255,0,0));
|
||||||
}
|
if (waitForExtraPayment)
|
||||||
if (waitForExtraPayment){
|
|
||||||
waitForExtraPayment->Render();
|
waitForExtraPayment->Render();
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,6 @@ GuiAvatars::GuiAvatars(CardSelector* cs) : cs(cs), active(NULL)
|
|||||||
|
|
||||||
GuiAvatars::~GuiAvatars()
|
GuiAvatars::~GuiAvatars()
|
||||||
{
|
{
|
||||||
cs->Remove(self); cs->Remove(selfGraveyard); cs->Remove(selfLibrary);
|
|
||||||
cs->Remove(opponent); cs->Remove(opponentGraveyard); cs->Remove(opponentLibrary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiAvatars::Activate(PlayGuiObject* c)
|
void GuiAvatars::Activate(PlayGuiObject* c)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <assert.h>
|
||||||
#include "../include/config.h"
|
#include "../include/config.h"
|
||||||
#include "../include/GameApp.h"
|
#include "../include/GameApp.h"
|
||||||
#include "../include/GuiCombat.h"
|
#include "../include/GuiCombat.h"
|
||||||
@@ -138,11 +139,14 @@ bool GuiCombat::CheckUserInput(u32 key)
|
|||||||
cursor_pos = BLK;
|
cursor_pos = BLK;
|
||||||
}
|
}
|
||||||
else if (OK == cursor_pos)
|
else if (OK == cursor_pos)
|
||||||
switch (step)
|
|
||||||
{
|
{
|
||||||
case ORDER : go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); break;
|
switch (step)
|
||||||
case FIRST_STRIKE : resolve(); go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); break;
|
{
|
||||||
case DAMAGE : resolve(); cursor_pos = NONE; go->userRequestNextGamePhase(); break;
|
case BLOCKERS : assert(false); break; // that should not happen
|
||||||
|
case ORDER : go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); break;
|
||||||
|
case FIRST_STRIKE : resolve(); go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); break;
|
||||||
|
case DAMAGE : resolve(); cursor_pos = NONE; go->userRequestNextGamePhase(); break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PSP_CTRL_TRIANGLE:
|
case PSP_CTRL_TRIANGLE:
|
||||||
@@ -242,16 +246,20 @@ void GuiCombat::Render()
|
|||||||
|
|
||||||
void GuiCombat::resolve()
|
void GuiCombat::resolve()
|
||||||
{
|
{
|
||||||
StableDamageStack stack;
|
DamageStack* stack = NEW DamageStack();
|
||||||
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
||||||
{
|
{
|
||||||
for (vector<DefenserDamaged*>::iterator q = (*it)->blockers.begin(); q != (*it)->blockers.end(); ++q)
|
if ((*it)->blockers.empty())
|
||||||
for (vector<Damage>::iterator d = (*q)->damages.begin(); d != (*q)->damages.end(); ++d)
|
stack->Add(NEW Damage((*it)->card, go->opponent(), (*it)->card->stepPower(step)));
|
||||||
stack.Add(&(*d));
|
else
|
||||||
|
for (vector<DefenserDamaged*>::iterator q = (*it)->blockers.begin(); q != (*it)->blockers.end(); ++q)
|
||||||
|
for (vector<Damage>::iterator d = (*q)->damages.begin(); d != (*q)->damages.end(); ++d)
|
||||||
|
stack->Add(NEW Damage(*d));
|
||||||
for (vector<Damage>::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d)
|
for (vector<Damage>::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d)
|
||||||
stack.Add(&(*d));
|
stack->Add(NEW Damage(*d));
|
||||||
}
|
}
|
||||||
stack.resolve();
|
go->mLayers->stackLayer()->Add(stack);
|
||||||
|
go->mLayers->stackLayer()->resolve(); // This will delete the damage stack which will in turn delete the Damage it contains
|
||||||
}
|
}
|
||||||
|
|
||||||
int GuiCombat::receiveEventPlus(WEvent* e)
|
int GuiCombat::receiveEventPlus(WEvent* e)
|
||||||
@@ -306,7 +314,9 @@ int GuiCombat::receiveEventMinus(WEvent* e)
|
|||||||
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
||||||
if ((*it)->card == event->card)
|
if ((*it)->card == event->card)
|
||||||
{
|
{
|
||||||
|
AttackerDamaged* d = *it;
|
||||||
attackers.erase(it);
|
attackers.erase(it);
|
||||||
|
SAFE_DELETE(d);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@@ -326,68 +336,77 @@ int GuiCombat::receiveEventMinus(WEvent* e)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else if (WEventPhaseChange* event = dynamic_cast<WEventPhaseChange*>(e))
|
||||||
|
{
|
||||||
|
step = BLOCKERS;
|
||||||
|
}
|
||||||
else if (WEventCombatStepChange* event = dynamic_cast<WEventCombatStepChange*>(e))
|
else if (WEventCombatStepChange* event = dynamic_cast<WEventCombatStepChange*>(e))
|
||||||
switch (event->step)
|
switch (event->step)
|
||||||
{
|
|
||||||
case ORDER:
|
|
||||||
{
|
{
|
||||||
if (ORDER == step) return 0; // Why do I take this twice ? >.>
|
case BLOCKERS:
|
||||||
if (!go->currentPlayer->displayStack()) { go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); return 1; }
|
break;
|
||||||
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
case ORDER:
|
||||||
{
|
{
|
||||||
(*it)->show = (1 < (*it)->blockers.size());
|
if (ORDER == step) return 0; // Why do I take this twice ? >.>
|
||||||
autoaffectDamage(*it, DAMAGE);
|
if (!go->currentPlayer->displayStack()) { go->nextCombatStep(); return 1; }
|
||||||
}
|
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
||||||
active = NULL;
|
|
||||||
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
|
||||||
if ((*it)->show)
|
|
||||||
{
|
{
|
||||||
(*it)->y = 210;
|
(*it)->show = (1 < (*it)->blockers.size());
|
||||||
(*it)->zoom = 2.2; (*it)->t = 0;
|
autoaffectDamage(*it, DAMAGE);
|
||||||
if (!active) active = *it;
|
|
||||||
}
|
}
|
||||||
|
active = NULL;
|
||||||
|
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
||||||
|
if ((*it)->show)
|
||||||
|
{
|
||||||
|
(*it)->y = 210;
|
||||||
|
(*it)->zoom = 2.2; (*it)->t = 0;
|
||||||
|
if (!active) active = *it;
|
||||||
|
}
|
||||||
|
repos<AttackerDamaged>(attackers.begin(), attackers.end(), 0);
|
||||||
|
if (active)
|
||||||
|
{
|
||||||
|
active->zoom = 2.7; // We know there is at least one, so this cannot be NULL
|
||||||
|
activeAtk = static_cast<AttackerDamaged*>(active);
|
||||||
|
remaskBlkViews(NULL, static_cast<AttackerDamaged*>(active));
|
||||||
|
cursor_pos = ATK;
|
||||||
|
step = ORDER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
go->nextCombatStep();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
case FIRST_STRIKE:
|
||||||
|
step = FIRST_STRIKE;
|
||||||
|
for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker)
|
||||||
|
if ((*attacker)->card->has(Constants::FIRSTSTRIKE) || (*attacker)->card->has(Constants::DOUBLESTRIKE)) goto DAMAGE;
|
||||||
|
cout << "FIRST STRIKE" << endl;
|
||||||
|
resolve();
|
||||||
|
go->nextCombatStep();
|
||||||
|
return 1;
|
||||||
|
case DAMAGE: DAMAGE:
|
||||||
|
step = event->step;
|
||||||
|
if (!go->currentPlayer->displayStack()) { cout << "DAMAGE" << endl; resolve(); go->userRequestNextGamePhase(); return 1; }
|
||||||
|
for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker)
|
||||||
|
autoaffectDamage(*attacker, step);
|
||||||
|
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
||||||
|
(*it)->show = ((*it)->card->has(Constants::DOUBLESTRIKE) || ((*it)->card->has(Constants::FIRSTSTRIKE) ^ (DAMAGE == step))) && (1 < (*it)->blockers.size());
|
||||||
repos<AttackerDamaged>(attackers.begin(), attackers.end(), 0);
|
repos<AttackerDamaged>(attackers.begin(), attackers.end(), 0);
|
||||||
|
active = NULL;
|
||||||
|
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) if ((*it)->show) { active = *it; break; }
|
||||||
if (active)
|
if (active)
|
||||||
{
|
{
|
||||||
active->zoom = 2.7; // We know there is at least one, so this cannot be NULL
|
active->zoom = 2.7;
|
||||||
activeAtk = static_cast<AttackerDamaged*>(active);
|
activeAtk = static_cast<AttackerDamaged*>(active);
|
||||||
remaskBlkViews(NULL, static_cast<AttackerDamaged*>(active));
|
remaskBlkViews(NULL, static_cast<AttackerDamaged*>(active));
|
||||||
cursor_pos = ATK;
|
cursor_pos = ATK;
|
||||||
step = ORDER;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE));
|
{
|
||||||
|
resolve();
|
||||||
|
if (FIRST_STRIKE == step) go->nextCombatStep();
|
||||||
|
else go->userRequestNextGamePhase();
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case FIRST_STRIKE:
|
|
||||||
for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker)
|
|
||||||
if ((*attacker)->card->has(Constants::FIRSTSTRIKE) || (*attacker)->card->has(Constants::DOUBLESTRIKE)) goto DAMAGE;
|
|
||||||
go->receiveEvent(NEW WEventCombatStepChange(DAMAGE));
|
|
||||||
return 1;
|
|
||||||
case DAMAGE: DAMAGE:
|
|
||||||
if (!go->currentPlayer->displayStack()) { go->userRequestNextGamePhase(); return 1; }
|
|
||||||
step = event->step;
|
|
||||||
for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker)
|
|
||||||
autoaffectDamage(*attacker, step);
|
|
||||||
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
|
|
||||||
(*it)->show = ((*it)->card->has(Constants::DOUBLESTRIKE) || ((*it)->card->has(Constants::FIRSTSTRIKE) ^ (DAMAGE == step))) && (1 < (*it)->blockers.size());
|
|
||||||
repos<AttackerDamaged>(attackers.begin(), attackers.end(), 0);
|
|
||||||
active = NULL;
|
|
||||||
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) if ((*it)->show) { active = *it; break; }
|
|
||||||
if (active)
|
|
||||||
{
|
|
||||||
active->zoom = 2.7;
|
|
||||||
activeAtk = static_cast<AttackerDamaged*>(active);
|
|
||||||
remaskBlkViews(NULL, static_cast<AttackerDamaged*>(active));
|
|
||||||
cursor_pos = ATK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
resolve();
|
|
||||||
if (FIRST_STRIKE == step) go->receiveEvent(NEW WEventCombatStepChange(DAMAGE));
|
|
||||||
else go->userRequestNextGamePhase();
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -219,6 +219,7 @@ int GuiPlay::receiveEventMinus(WEvent * e)
|
|||||||
CardView* cv = *it;
|
CardView* cv = *it;
|
||||||
cs->Remove(cv);
|
cs->Remove(cv);
|
||||||
cards.erase(it);
|
cards.erase(it);
|
||||||
|
cv->card->view = NULL;
|
||||||
delete cv;
|
delete cv;
|
||||||
Replace();
|
Replace();
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ void GuiGameZone::Render(){
|
|||||||
mFont->DrawString(buffer, actX, actY);
|
mFont->DrawString(buffer, actX, actY);
|
||||||
|
|
||||||
if (showCards) cd->Render();
|
if (showCards) cd->Render();
|
||||||
for (vector<TransientCardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
for (vector<CardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
||||||
(*it)->Render();
|
(*it)->Render();
|
||||||
PlayGuiObject::Render();
|
PlayGuiObject::Render();
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ void GuiGameZone::ButtonPressed(int controllerId, int controlId){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GuiGameZone::Update(float dt){
|
void GuiGameZone::Update(float dt){
|
||||||
for (vector<TransientCardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
for (vector<CardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
||||||
(*it)->Update(dt);
|
(*it)->Update(dt);
|
||||||
if (showCards) cd->Update(dt);
|
if (showCards) cd->Update(dt);
|
||||||
PlayGuiObject::Update(dt);
|
PlayGuiObject::Update(dt);
|
||||||
@@ -137,9 +137,8 @@ GuiGameZone::GuiGameZone(float x, float y, bool hasFocus, MTGGameZone* zone, Gui
|
|||||||
|
|
||||||
GuiGameZone::~GuiGameZone(){
|
GuiGameZone::~GuiGameZone(){
|
||||||
if (cd) delete cd;
|
if (cd) delete cd;
|
||||||
for (vector<TransientCardView*>::iterator it = cards.begin(); it != cards.end(); ++it){
|
for (vector<CardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
||||||
delete(*it);
|
delete(*it);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ostream& GuiGameZone::toString(ostream& out) const
|
ostream& GuiGameZone::toString(ostream& out) const
|
||||||
@@ -158,12 +157,11 @@ int GuiGraveyard::receiveEventPlus(WEvent* e)
|
|||||||
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e))
|
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e))
|
||||||
if (event->to == zone)
|
if (event->to == zone)
|
||||||
{
|
{
|
||||||
cout << "Goes to Graveyard " << event->card->view << endl;
|
CardView* t;
|
||||||
TransientCardView* t;
|
|
||||||
if (event->card->view)
|
if (event->card->view)
|
||||||
t = NEW TransientCardView(event->card, *(event->card->view));
|
t = NEW CardView(event->card, *(event->card->view));
|
||||||
else
|
else
|
||||||
t = NEW TransientCardView(event->card, x, y);
|
t = NEW CardView(event->card, x, y);
|
||||||
t->x = x + Width / 2; t->y = y + Height / 2; t->zoom = 0.3; t->alpha = 0;
|
t->x = x + Width / 2; t->y = y + Height / 2; t->zoom = 0.3; t->alpha = 0;
|
||||||
cards.push_back(t);
|
cards.push_back(t);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -175,10 +173,10 @@ int GuiGraveyard::receiveEventMinus(WEvent* e)
|
|||||||
{
|
{
|
||||||
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e))
|
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e))
|
||||||
if (event->from == zone)
|
if (event->from == zone)
|
||||||
for (vector<TransientCardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
for (vector<CardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
||||||
if (event->card->previous == (*it)->card)
|
if (event->card->previous == (*it)->card)
|
||||||
{
|
{
|
||||||
TransientCardView* cv = *it;
|
CardView* cv = *it;
|
||||||
cards.erase(it);
|
cards.erase(it);
|
||||||
delete cv;
|
delete cv;
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -534,17 +534,10 @@ int MTGCardInstance::setDefenser(MTGCardInstance * opponent){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
WEvent * e = NULL;
|
WEvent * e = NULL;
|
||||||
if (defenser != opponent){
|
if (defenser != opponent) e = NEW WEventCreatureBlocker(this, defenser, opponent);
|
||||||
e = NEW WEventCreatureBlocker(this, defenser, opponent);
|
|
||||||
|
|
||||||
}
|
|
||||||
defenser = opponent;
|
defenser = opponent;
|
||||||
if (defenser){
|
if (defenser) defenser->blockers.push_back(this);
|
||||||
defenser->blockers.push_back(this);
|
|
||||||
}
|
|
||||||
g->blockersSorted = false;
|
|
||||||
if (e) g->receiveEvent(e);
|
if (e) g->receiveEvent(e);
|
||||||
//delete e;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user