- reworked the testsuite and the rules (storyflow) to use the same game deserialization code, moved that code to the players and zone classes

- removed every references to the gameobserver singleton. This object can now be instantiated several times as it's needed for minmax. To be able to do that, I mostly added a reference to a gameobserver from any targetable object (cards, players, spells) and abilities.
This commit is contained in:
Xawotihs
2011-10-01 13:30:30 +00:00
parent d6db0c4f63
commit 9adb9d625d
86 changed files with 1902 additions and 1961 deletions
+2 -2
View File
@@ -6,12 +6,12 @@
class AIMomirPlayer: public AIPlayerBaka
{
public:
AIMomirPlayer(string file, string fileSmall, string avatarFile, MTGDeck * deck = NULL);
AIMomirPlayer(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck = NULL);
int getEfficiency(OrderedAIAction * action);
int momir();
int computeActions();
static MTGAbility * momirAbility;
static MTGAbility * getMomirAbility();
MTGAbility * getMomirAbility();
};
#endif
+3 -3
View File
@@ -88,7 +88,7 @@ public:
virtual int receiveEvent(WEvent * event);
virtual void Render();
AIPlayer(string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
AIPlayer(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
virtual ~AIPlayer();
virtual int chooseTarget(TargetChooser * tc = NULL, Player * forceTarget = NULL, MTGCardInstance * Chosencard = NULL, bool checkonly = false) = 0;
@@ -105,9 +105,9 @@ public:
class AIPlayerFactory{
public:
AIPlayer * createAIPlayer(MTGAllCards * collection, Player * opponent, int deckid = 0);
AIPlayer * createAIPlayer(GameObserver *observer, MTGAllCards * collection, Player * opponent, int deckid = 0);
#ifdef AI_CHANGE_TESTING
AIPlayer * createAIPlayerTest(MTGAllCards * collection, Player * opponent, string folder);
AIPlayer * createAIPlayerTest(GameObserver *observer, MTGAllCards * collection, Player * opponent, string folder);
#endif
};
+1 -1
View File
@@ -114,7 +114,7 @@ class AIPlayerBaka: public AIPlayer{
vector<MTGAbility*>gotPayments;
int deckId;
AIPlayerBaka(string deckFile, string deckfileSmall, string avatarFile, MTGDeck * deck = NULL);
AIPlayerBaka(GameObserver *observer, string deckFile, string deckfileSmall, string avatarFile, MTGDeck * deck = NULL);
virtual int Act(float dt);
void initTimer();
virtual int computeActions();
+1 -1
View File
@@ -49,7 +49,7 @@ protected:
public:
AIPlayerBakaB(string deckFile, string deckfileSmall, string avatarFile, MTGDeck * deck = NULL);
AIPlayerBakaB(GameObserver *observer, string deckFile, string deckfileSmall, string avatarFile, MTGDeck * deck = NULL);
virtual int Act(float dt);
void initTimer();
virtual int computeActions();
+1 -1
View File
@@ -29,7 +29,7 @@ public:
virtual void Render();
virtual void Update(float dt);
bool CheckUserInput(JButton key);
ActionLayer();
ActionLayer(GameObserver *observer);
~ActionLayer();
int cancelCurrentAction();
ActionElement * isWaitingForAnswer();
+9 -10
View File
@@ -83,8 +83,8 @@ public:
return TARGET_STACKACTION;
}
Interruptible(int inID = 0, bool hasFocus = false)
: PlayGuiObject(40, x, y, inID, hasFocus), state(NOT_RESOLVED), display(0), source(NULL)
Interruptible(GameObserver* observer, int inID = 0, bool hasFocus = false)
: Targetable(observer), PlayGuiObject(40, x, y, inID, hasFocus), state(NOT_RESOLVED), display(0), source(NULL)
{
}
@@ -112,7 +112,7 @@ public:
void Render();
virtual ostream& toString(ostream& out) const;
virtual const string getDisplayName() const;
NextGamePhase(int id);
NextGamePhase(GameObserver* observer, int id);
};
class Spell: public Interruptible
@@ -125,8 +125,8 @@ public:
ManaCost * cost;
int payResult;
int computeX(MTGCardInstance * card);
Spell(MTGCardInstance* _source);
Spell(int id, MTGCardInstance* _source, TargetChooser *_tc, ManaCost * _cost, int payResult);
Spell(GameObserver* observer, MTGCardInstance* _source);
Spell(GameObserver* observer, int id, MTGCardInstance* _source, TargetChooser *_tc, ManaCost * _cost, int payResult);
~Spell();
int resolve();
void Render();
@@ -151,7 +151,7 @@ public:
void Render();
virtual ostream& toString(ostream& out) const;
virtual const string getDisplayName() const;
StackAbility(int id, MTGAbility * _ability);
StackAbility(GameObserver* observer, int id, MTGAbility * _ability);
};
class PutInGraveyard: public Interruptible {
@@ -161,7 +161,7 @@ public:
int resolve();
void Render();
virtual ostream& toString(ostream& out) const;
PutInGraveyard(int id, MTGCardInstance * _card);
PutInGraveyard(GameObserver* observer, int id, MTGCardInstance * _card);
};
@@ -173,7 +173,7 @@ public:
int resolve();
void Render();
virtual ostream& toString(ostream& out) const;
DrawAction(int id, Player * _player, int _nbcards);
DrawAction(GameObserver* observer, int id, Player * _player, int _nbcards);
};
class LifeAction: public Interruptible
@@ -184,14 +184,13 @@ public:
int resolve();
void Render();
virtual ostream& toString(ostream& out) const;
LifeAction(int id, Damageable * _target, int amount);
LifeAction(GameObserver* observer, int id, Damageable * _target, int amount);
};
class ActionStack :public GuiLayer
{
protected:
JQuadPtr pspIcons[8];
GameObserver* game;
int interruptDecision[2];
float timer;
int currentState;
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -10,13 +10,12 @@ class MTGCardInstance;
class CardDisplay: public PlayGuiObjectController
{
int mId;
GameObserver* game;
public:
int x, y, start_item, nb_displayed_items;
MTGGameZone * zone;
TargetChooser * tc;
JGuiListener * listener;
CardDisplay();
CardDisplay(GameObserver* game);
CardDisplay(int id, GameObserver* game, int x, int y, JGuiListener * listener = NULL, TargetChooser * tc = NULL,
int nb_displayed_items = 7);
void AddCard(MTGCardInstance * _card);
+4 -3
View File
@@ -24,8 +24,9 @@ class CardSelectorBase: public GuiLayer
{
public:
CardSelectorBase(int inDrawMode = DrawMode::kNormal) :
mDrawMode(inDrawMode)
CardSelectorBase(GameObserver *observer, int inDrawMode = DrawMode::kNormal) :
GuiLayer(observer), mDrawMode(inDrawMode)
{
}
;
@@ -70,7 +71,7 @@ protected:
PlayGuiObject* fetchMemory(SelectorMemory&);
public:
CardSelector(DuelLayers*);
CardSelector(GameObserver *observer, DuelLayers*);
void Add(PlayGuiObject*);
void Remove(PlayGuiObject*);
bool CheckUserInput(JButton key);
+1 -1
View File
@@ -18,7 +18,7 @@ namespace CardSelectorSingleton
/*
** Create the singleton pointer. Instance() isn't valid until this is called.
*/
CardSelectorBase* Create(DuelLayers* inDuelLayers);
CardSelectorBase* Create(GameObserver* observer, DuelLayers* inDuelLayers);
/*
** Teardown the singleton pointer instance.
+2 -1
View File
@@ -38,6 +38,7 @@ private:
public:
int value;
Player * p1, *p2;
GameObserver* observer;
GameApp * app;
int showMsg;
int unlocked;
@@ -45,7 +46,7 @@ public:
vector<CreditBonus *> bonus;
Credits();
~Credits();
void compute(Player * _p1, Player * _p2, GameApp * _app);
void compute(GameObserver* observer, GameApp * _app);
void Render();
static int unlockRandomSet(bool force = false);
static int unlockSetByName(string name);
+10 -5
View File
@@ -30,7 +30,9 @@ public:
int thatmuch;
int lifeLostThisTurn;
int type_as_damageable;
Damageable(int _life){life=_life;lifeLostThisTurn = 0;};
Damageable(GameObserver* observer, int _life)
: Targetable(observer)
{life=_life;lifeLostThisTurn = 0;};
int getLife(){return life;};
virtual int dealDamage(int damage){life-=damage;return life;};
virtual int afterDamage(){return 0;}
@@ -48,8 +50,8 @@ class Damage: public Interruptible
int typeOfDamage;
int damage;
void Render();
Damage(MTGCardInstance* source, Damageable * target);
Damage(MTGCardInstance* source, Damageable * target, int damage, int typeOfDamage = DAMAGE_OTHER);
Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target);
Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target, int damage, int typeOfDamage = DAMAGE_OTHER);
int resolve();
virtual ostream& toString(ostream& out) const;
};
@@ -58,14 +60,17 @@ class DamageStack : public GuiLayer, public Interruptible
{
protected:
int currentState;
GameObserver* game;
public:
int receiveEvent(WEvent * event);
int resolve();
void Render();
virtual ostream& toString(ostream& out) const;
DamageStack();
DamageStack(GameObserver *observer);
};
ostream& operator<<(ostream& out, const Damageable& p);
istream& operator>>(istream& in, Damageable& p);
#endif
+1 -1
View File
@@ -35,7 +35,7 @@ public:
ActionStack * stackLayer();
GuiCombat * combatLayer();
GuiAvatars * GetAvatars();
void init();
void init(GameObserver* go);
virtual void Update(float dt, Player * player);
void CheckUserInput(int isAI);
void Render();
+6 -4
View File
@@ -24,13 +24,13 @@ using namespace std;
class GameObserver{
protected:
static GameObserver * mInstance;
MTGCardInstance * cardWaitingForTargets;
queue<WEvent *> eventsQueue;
int nbPlayers;
int untap(MTGCardInstance * card);
bool WaitForExtraPayment(MTGCardInstance* card);
void initialize();
public:
int currentPlayerId;
@@ -56,19 +56,20 @@ class GameObserver{
int cardClick(MTGCardInstance * card,Targetable * _object = NULL );
int getCurrentGamePhase();
const char * getCurrentGamePhaseName();
const char * getNextGamePhaseName();
void nextCombatStep();
void userRequestNextGamePhase();
void nextGamePhase();
void cleanupPhase();
void nextPlayer();
static void Init(Player * _players[], int _nbplayers);
static GameObserver * GetInstance();
static void EndInstance();
void setPlayers(Player * _players[], int _nbplayers);
Player * currentPlayer;
Player * currentActionPlayer;
Player * isInterrupting;
Player * opponent();
Player * currentlyActing();
GameObserver();
GameObserver(Player * _players[], int _nbplayers);
~GameObserver();
void gameStateBasedEffects();
@@ -86,6 +87,7 @@ class GameObserver{
void Update(float dt);
void Render();
void ButtonPressed(PlayGuiObject*);
int getPlayersNumber() {return nbPlayers;};
int receiveEvent(WEvent * event);
bool connectRule;
+1 -1
View File
@@ -17,7 +17,7 @@ protected:
GuiAvatar* active;
public:
GuiAvatars();
GuiAvatars(GameObserver *observer);
~GuiAvatars();
GuiAvatar* GetSelf();
+1 -1
View File
@@ -10,7 +10,7 @@ protected:
JQuad* quad;
public:
GuiBackground();
GuiBackground(GameObserver* observer);
~GuiBackground();
virtual void Render();
};
+4 -2
View File
@@ -6,8 +6,10 @@
class GuiCardsController: public PlayGuiObjectController
{
public:
GuiCardsController(){}
;
GuiCardsController(GameObserver*observer)
: PlayGuiObjectController(observer)
{
};
};
#endif
-1
View File
@@ -10,7 +10,6 @@
class GuiCombat: public GuiLayer
{
protected:
GameObserver* go;
DamagerDamaged* active;
AttackerDamaged* activeAtk;
static JTexture* ok_tex;
+1 -1
View File
@@ -11,7 +11,7 @@ protected:
float step;
public:
GuiFrame();
GuiFrame(GameObserver* observer);
~GuiFrame();
virtual void Render();
void Update(float dt);
+3 -3
View File
@@ -36,7 +36,7 @@ protected:
vector<CardView*> cards;
public:
GuiHand(MTGHand* hand);
GuiHand(GameObserver* observer, MTGHand* hand);
~GuiHand();
void Update(float dt);
bool isInHand(CardView*);
@@ -47,7 +47,7 @@ public:
class GuiHandOpponent : public GuiHand
{
public:
GuiHandOpponent(MTGHand* hand);
GuiHandOpponent(GameObserver* observer, MTGHand* hand);
virtual void Render();
virtual int receiveEventPlus(WEvent* e);
virtual int receiveEventMinus(WEvent* e);
@@ -65,7 +65,7 @@ protected:
Pos backpos;
public:
GuiHandSelf(MTGHand* hand);
GuiHandSelf(GameObserver* observer, MTGHand* hand);
~GuiHandSelf();
virtual int receiveEventPlus(WEvent* e);
virtual int receiveEventMinus(WEvent* e);
+2 -1
View File
@@ -16,6 +16,7 @@ class GuiLayer
{
protected:
JButton mActionButton;
GameObserver* observer;
public:
int mCurr;
vector<JGuiObject *> mObjects;
@@ -26,7 +27,7 @@ public:
bool hasFocus;
virtual void resetObjects();
int getMaxId();
GuiLayer();
GuiLayer(GameObserver *observer);
virtual ~GuiLayer();
virtual void Update(float dt);
virtual bool CheckUserInput(JButton key)
+1 -1
View File
@@ -13,7 +13,7 @@ protected:
float zoomFactor;
public:
GuiPhaseBar();
GuiPhaseBar(GameObserver* observer);
~GuiPhaseBar();
void Update(float dt);
virtual void Render();
-1
View File
@@ -71,7 +71,6 @@ protected:
class Spells: public VertStack {};
protected:
GameObserver* game;
Creatures selfCreatures, opponentCreatures;
BattleField battleField;
Lands selfLands, opponentLands;
+29 -27
View File
@@ -130,10 +130,10 @@ public:
int abilitygranted;
MTGCardInstance * source;
static int allowedToCast(MTGCardInstance* card, Player* player);
static int allowedToAltCast(MTGCardInstance* card, Player* player);
MTGAbility(int id, MTGCardInstance * card);
MTGAbility(int id, MTGCardInstance * _source, Targetable * _target);
int allowedToCast(MTGCardInstance* card, Player* player);
int allowedToAltCast(MTGCardInstance* card, Player* player);
MTGAbility(GameObserver* observer, int id, MTGCardInstance * card);
MTGAbility(GameObserver* observer, int id, MTGCardInstance * _source, Targetable * _target);
MTGAbility(const MTGAbility& copyFromMe);
virtual int testDestroy();
virtual ~MTGAbility();
@@ -226,8 +226,8 @@ public:
class TriggeredAbility : public MTGAbility
{
public:
TriggeredAbility(int id, MTGCardInstance* card);
TriggeredAbility(int id, MTGCardInstance* _source, Targetable* _target);
TriggeredAbility(GameObserver* observer, int id, MTGCardInstance* card);
TriggeredAbility(GameObserver* observer, int id, MTGCardInstance* _source, Targetable* _target);
virtual void Update(float dt);
virtual void Render()
@@ -259,7 +259,7 @@ private:
bool mActiveTrigger;
public:
Trigger(int id, MTGCardInstance * source, bool once, TargetChooser * _tc = NULL);
Trigger(GameObserver* observer, int id, MTGCardInstance * source, bool once, TargetChooser * _tc = NULL);
int resolve()
{
return 0; //This is a trigger, this function should not be called
@@ -284,7 +284,7 @@ public:
int uses;
string castRestriction;
ActivatedAbility(int id, MTGCardInstance* card, ManaCost* _cost = NULL, int _restrictions = NO_RESTRICTION, string limit = "", MTGAbility* sideEffect = NULL, string usesBeforeSideEffects = "",string castRestriction = "");
ActivatedAbility(GameObserver* observer, int id, MTGCardInstance* card, ManaCost* _cost = NULL, int _restrictions = NO_RESTRICTION, string limit = "", MTGAbility* sideEffect = NULL, string usesBeforeSideEffects = "",string castRestriction = "");
virtual ~ActivatedAbility();
virtual void Update(float dt)
@@ -308,8 +308,8 @@ public:
class TargetAbility : public ActivatedAbility, public NestedAbility
{
public:
TargetAbility(int id, MTGCardInstance * card, TargetChooser * _tc,ManaCost * _cost = NULL, int _playerturnonly = 0, string castRestriction = "");
TargetAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _playerturnonly = 0, string castRestriction = "");
TargetAbility(GameObserver* observer, int id, MTGCardInstance * card, TargetChooser * _tc,ManaCost * _cost = NULL, int _playerturnonly = 0, string castRestriction = "");
TargetAbility(GameObserver* observer, int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _playerturnonly = 0, string castRestriction = "");
~TargetAbility();
virtual int reactToClick(MTGCardInstance * card);
@@ -327,8 +327,8 @@ public:
int init;
virtual void Update(float dt);
virtual int testDestroy();
InstantAbility(int _id, MTGCardInstance * source);
InstantAbility(int _id, MTGCardInstance * source,Targetable * _target);
InstantAbility(GameObserver* observer, int _id, MTGCardInstance * source);
InstantAbility(GameObserver* observer, int _id, MTGCardInstance * source,Targetable * _target);
virtual int resolve()
{
@@ -346,18 +346,18 @@ public:
map<MTGCardInstance *,bool> cards;
map<MTGCardInstance *,bool> checkCards;
map<Player *,bool> players;
ListMaintainerAbility(int _id)
: MTGAbility(_id, NULL)
ListMaintainerAbility(GameObserver* observer, int _id)
: MTGAbility(observer, _id, NULL)
{
}
ListMaintainerAbility(int _id, MTGCardInstance *_source)
: MTGAbility(_id, _source)
ListMaintainerAbility(GameObserver* observer, int _id, MTGCardInstance *_source)
: MTGAbility(observer, _id, _source)
{
}
ListMaintainerAbility(int _id, MTGCardInstance *_source,Damageable * _target)
: MTGAbility(_id, _source, _target)
ListMaintainerAbility(GameObserver* observer, int _id, MTGCardInstance *_source,Damageable * _target)
: MTGAbility(observer, _id, _source, _target)
{
}
@@ -399,7 +399,7 @@ public:
bool lifelost;
int lifeamount;
bool once,activeTrigger;
TriggerAtPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false,bool lifelost = false, int lifeamount = 0, bool once = false);
TriggerAtPhase(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false,bool lifelost = false, int lifeamount = 0, bool once = false);
virtual int trigger();
int resolve(){return 0;};
virtual TriggerAtPhase* clone() const;
@@ -412,7 +412,7 @@ public:
bool sourceUntapped;
bool sourceTap;
bool once,activeTrigger;
TriggerNextPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false,bool once = false);
TriggerNextPhase(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false,bool once = false);
virtual TriggerNextPhase* clone() const;
virtual int testDestroy();
@@ -425,7 +425,7 @@ public:
TriggeredAbility * t;
queue<Targetable *> targets;
MTGAbility * destroyCondition;
GenericTriggeredAbility(int id, MTGCardInstance * _source, TriggeredAbility * _t, MTGAbility * a,MTGAbility * dc = NULL, Targetable * _target = NULL);
GenericTriggeredAbility(GameObserver* observer, int id, MTGCardInstance * _source, TriggeredAbility * _t, MTGAbility * a,MTGAbility * dc = NULL, Targetable * _target = NULL);
virtual int trigger();
virtual int triggerOnEvent(WEvent * e);
virtual int resolve();
@@ -450,10 +450,12 @@ private:
MTGAbility * getAlternateCost( string s, int id, Spell *spell, MTGCardInstance *card );
MTGAbility * getManaReduxAbility(string s, int id, Spell *spell, MTGCardInstance *card, MTGCardInstance *target);
TargetChooser * parseSimpleTC(const std::string& s, const std::string& starter, MTGCardInstance *card, bool forceNoTarget = true);
GameObserver *observer;
public:
static int parseRestriction(string s);
static int parseCastRestrictions(MTGCardInstance * card, Player * player, string restrictions);
AbilityFactory(GameObserver *observer) : observer(observer) {};
int parseRestriction(string s);
int parseCastRestrictions(MTGCardInstance * card, Player * player, string restrictions);
Counter * parseCounter(string s, MTGCardInstance * target, Spell * spell = NULL);
int parsePowerToughness(string s, int *power, int *toughness);
int getAbilities(vector<MTGAbility *> * v, Spell * spell, MTGCardInstance * card = NULL, int id = 0, MTGGameZone * dest = NULL);
@@ -478,7 +480,7 @@ class ActivatedAbilityTP : public ActivatedAbility
{
public:
int who;
ActivatedAbilityTP(int id, MTGCardInstance * card, Targetable * _target = NULL, ManaCost * cost=NULL, int who = TargetChooser::UNSET);
ActivatedAbilityTP(GameObserver* observer, int id, MTGCardInstance * card, Targetable * _target = NULL, ManaCost * cost=NULL, int who = TargetChooser::UNSET);
Targetable * getTarget();
};
@@ -486,7 +488,7 @@ class InstantAbilityTP : public InstantAbility
{
public:
int who;
InstantAbilityTP(int id, MTGCardInstance * card, Targetable * _target = NULL, int who = TargetChooser::UNSET);
InstantAbilityTP(GameObserver* observer, int id, MTGCardInstance * card, Targetable * _target = NULL, int who = TargetChooser::UNSET);
Targetable * getTarget();
};
@@ -494,7 +496,7 @@ class AbilityTP : public MTGAbility
{
public:
int who;
AbilityTP(int id, MTGCardInstance * card, Targetable * _target = NULL, int who = TargetChooser::UNSET);
AbilityTP(GameObserver* observer, int id, MTGCardInstance * card, Targetable * _target = NULL, int who = TargetChooser::UNSET);
Targetable * getTarget();
@@ -513,7 +515,7 @@ public:
string menutext;
ManaCost * output;
int tap;
AManaProducer(int id, MTGCardInstance * card, Targetable * t, ManaCost * _output, ManaCost * _cost = NULL, int who = TargetChooser::UNSET);
AManaProducer(GameObserver* observer, int id, MTGCardInstance * card, Targetable * t, ManaCost * _output, ManaCost * _cost = NULL, int who = TargetChooser::UNSET);
int isReactingToClick(MTGCardInstance * _card, ManaCost * mana = NULL);
int resolve();
int reactToClick(MTGCardInstance* _card);
+1 -1
View File
@@ -196,7 +196,7 @@ public:
void eventattackedblocked(MTGCardInstance * opponent);
void eventblocked(MTGCardInstance * opponent);
int isInPlay();
int isInPlay(GameObserver* game);
JSample * getSample();
JQuadPtr getIcon();
+2 -1
View File
@@ -14,9 +14,10 @@ protected:
int currentState;
WFont * mFont;
static MTGGamePhase* instance;
GameObserver* observer;
public:
MTGGamePhase(int id);
MTGGamePhase(GameObserver* g, int id);
static MTGGamePhase* GetInstance() { return instance; };
virtual void Update(float dt);
bool CheckUserInput(JButton key);
+4 -3
View File
@@ -108,9 +108,9 @@ class MTGGameZone {
void setOwner(Player * player);
MTGCardInstance * lastCardDrawn;
static MTGGameZone * stringToZone(string zoneName, MTGCardInstance * source, MTGCardInstance * target);
static MTGGameZone * stringToZone(GameObserver *g, string zoneName, MTGCardInstance * source, MTGCardInstance * target);
static int zoneStringToId(string zoneName);
static MTGGameZone *intToZone(int zoneId, MTGCardInstance * source = NULL,MTGCardInstance * target = NULL);
static MTGGameZone *intToZone(GameObserver *g, int zoneId, MTGCardInstance * source = NULL,MTGCardInstance * target = NULL);
static MTGGameZone *intToZone(int zoneId, Player * source, Player * target = NULL);
bool needShuffle;
virtual const char * getName(){return "zone";};
@@ -177,7 +177,7 @@ public:
MTGGameZone * temp;
MTGPlayerCards();
MTGPlayerCards(int * idList, int idListSize);
MTGPlayerCards(Player*, int * idList, int idListSize);
MTGPlayerCards(MTGDeck * deck);
~MTGPlayerCards();
void initGame(int shuffle = 1, int draw = 1);
@@ -200,6 +200,7 @@ public:
};
ostream& operator<<(ostream&, const MTGGameZone&);
istream& operator>>(istream&, MTGGameZone&);
ostream& operator<<(ostream&, const MTGPlayerCards&);
istream& operator>>(istream&, MTGPlayerCards&);
+26 -26
View File
@@ -15,7 +15,7 @@ class OtherAbilitiesEventReceiver: public MTGAbility
public:
int testDestroy();
int receiveEvent(WEvent * event);
OtherAbilitiesEventReceiver(int _id);
OtherAbilitiesEventReceiver(GameObserver* observer, int _id);
OtherAbilitiesEventReceiver * clone() const;
};
@@ -58,7 +58,7 @@ public:
int testDestroy();
void Update(float dt);
void Render();
MTGEventBonus(int _id);
MTGEventBonus(GameObserver* observer, int _id);
virtual MTGEventBonus * clone() const;
};
@@ -69,7 +69,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGPutInPlayRule(int _id);
MTGPutInPlayRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "cast card normally";
@@ -84,7 +84,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGKickerRule(int _id);
MTGKickerRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "pay kicker";
@@ -104,7 +104,7 @@ public:
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGAlternativeCostRule(int _id);
MTGAlternativeCostRule(GameObserver* observer, int _id);
const char * getMenuText()
{
if(alternativeName.size())
@@ -121,7 +121,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGBuyBackRule(int _id);
MTGBuyBackRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "cast and buy back";
@@ -137,7 +137,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGFlashBackRule(int _id);
MTGFlashBackRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "flash back";
@@ -152,7 +152,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGRetraceRule(int _id);
MTGRetraceRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "retrace";
@@ -168,7 +168,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGMorphCostRule(int _id);
MTGMorphCostRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "play morphed";
@@ -185,7 +185,7 @@ public:
int testDestroy();
string suspendmenu;
virtual ostream& toString(ostream& out) const;
MTGSuspendRule(int _id);
MTGSuspendRule(GameObserver* observer, int _id);
const char * getMenuText()
{
suspendmenu = "suspend";
@@ -208,7 +208,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGAttackRule(int _id);
MTGAttackRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "Attacker";
@@ -221,7 +221,7 @@ public:
class MTGCombatTriggersRule: public MTGAbility
{
public:
MTGCombatTriggersRule(int _id);
MTGCombatTriggersRule(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
virtual ostream& toString(ostream& out) const;
int testDestroy();
@@ -235,7 +235,7 @@ public:
int reactToClick(MTGCardInstance * card);
int testDestroy();
virtual ostream& toString(ostream& out) const;
MTGBlockRule(int _id);
MTGBlockRule(GameObserver* observer, int _id);
const char * getMenuText()
{
return "Blocker";
@@ -247,7 +247,7 @@ public:
class MTGPersistRule: public MTGAbility
{
public:
MTGPersistRule(int _id);
MTGPersistRule(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
virtual ostream& toString(ostream& out) const;
int testDestroy();
@@ -257,7 +257,7 @@ public:
class MTGVampireRule: public MTGAbility
{
public:
MTGVampireRule(int _id);
MTGVampireRule(GameObserver* observer, int _id);
map<MTGCardInstance*,vector<MTGCardInstance*> > victems;
int receiveEvent(WEvent * event);
virtual ostream& toString(ostream& out) const;
@@ -268,7 +268,7 @@ public:
class MTGUnearthRule: public MTGAbility
{
public:
MTGUnearthRule(int _id);
MTGUnearthRule(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
virtual ostream& toString(ostream& out) const;
int testDestroy();
@@ -278,7 +278,7 @@ class MTGTokensCleanup: public MTGAbility
{
public:
vector<MTGCardInstance *> list;
MTGTokensCleanup(int _id);
MTGTokensCleanup(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
int testDestroy();
virtual MTGTokensCleanup * clone() const;
@@ -293,7 +293,7 @@ public:
class MTGLegendRule: public ListMaintainerAbility
{
public:
MTGLegendRule(int _id);
MTGLegendRule(GameObserver* observer, int _id);
int canBeInList(MTGCardInstance * card);
int added(MTGCardInstance * card);
int removed(MTGCardInstance * card);
@@ -304,7 +304,7 @@ public:
class MTGPlaneWalkerRule: public ListMaintainerAbility
{
public:
MTGPlaneWalkerRule(int _id);
MTGPlaneWalkerRule(GameObserver* observer, int _id);
int canBeInList(MTGCardInstance * card);
int added(MTGCardInstance * card);
int removed(MTGCardInstance * card);
@@ -330,7 +330,7 @@ public:
int testDestroy();
void Update(float dt);
void Render();
MTGMomirRule(int _id, MTGAllCards * _collection);
MTGMomirRule(GameObserver* observer, int _id, MTGAllCards * _collection);
int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL);
int reactToClick(MTGCardInstance * card);
int reactToClick(MTGCardInstance * card, int id);
@@ -353,7 +353,7 @@ public:
MTGAllCards * collection;
MTGCardInstance * genEquip(int id);
int testDestroy();
MTGStoneHewerRule(int _id, MTGAllCards * _collection);
MTGStoneHewerRule(GameObserver* observer, int _id, MTGAllCards * _collection);
int receiveEvent(WEvent * event);
const char * getMenuText()
{
@@ -367,7 +367,7 @@ class MTGHermitRule: public MTGAbility
{
public:
int testDestroy();
MTGHermitRule(int _id);
MTGHermitRule(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
const char * getMenuText()
{
@@ -380,7 +380,7 @@ public:
class MTGLifelinkRule: public MTGAbility
{
public:
MTGLifelinkRule(int _id);
MTGLifelinkRule(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
@@ -395,7 +395,7 @@ public:
class MTGDeathtouchRule: public MTGAbility
{
public:
MTGDeathtouchRule(int _id);
MTGDeathtouchRule(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
@@ -412,7 +412,7 @@ public:
class ParentChildRule: public MTGAbility
{
public:
ParentChildRule(int _id);
ParentChildRule(GameObserver* observer, int _id);
int receiveEvent(WEvent * event);
virtual ostream& toString(ostream& out) const;
int testDestroy();
@@ -448,7 +448,7 @@ public:
int receiveEvent(WEvent * event);
void Update(float dt);
void Render();
HUDDisplay(int _id);
HUDDisplay(GameObserver* observer, int _id);
~HUDDisplay();
virtual HUDDisplay * clone() const;
};
+5 -3
View File
@@ -10,6 +10,7 @@ using namespace std;
*/
class Player;
class GameObserver;
typedef enum
{
@@ -37,19 +38,20 @@ public:
class PhaseRing
{
private:
static bool extraDamagePhase(int id);
bool extraDamagePhase(int id);
GameObserver* observer;
public:
list<Phase *> ring;
list<Phase *>::iterator current;
Phase * getCurrentPhase();
Phase * forward(bool sendEvents = true);
Phase * goToPhase(int id, Player * player, bool sendEvents = true);
PhaseRing(Player* players[], int nbPlayers = 2);
PhaseRing(GameObserver* observer);
~PhaseRing();
int addPhase(Phase * phase);
int addPhaseBefore(int id, Player* player, int after_id, Player * after_player, int allOccurences = 1);
int removePhase(int id, Player * player, int allOccurences = 1);
static const char * phaseName(int id);
const char * phaseName(int id);
static int phaseStrToInt(string s);
};
@@ -15,7 +15,8 @@ protected:
public:
virtual void Update(float dt);
virtual bool CheckUserInput(JButton key);
PlayGuiObjectController()
PlayGuiObjectController(GameObserver *observer)
: GuiLayer(observer)
{
last_user_move = 0;
}
+6 -5
View File
@@ -24,6 +24,7 @@ public:
MODE_AI
};
string mAvatarName;
JTexture * mAvatarTex;
JQuadPtr mAvatar;
int playMode;
@@ -35,9 +36,9 @@ public:
string deckName;
string phaseRing;
int offerInterruptOnPhase;
Player(string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
virtual ~Player();
virtual void setObserver(GameObserver*g);
virtual void End();
virtual int displayStack()
{
@@ -94,17 +95,17 @@ public:
** Returns the path to the stats file of currently selected deck.
*/
std::string GetCurrentDeckStatsFile();
friend istream& operator>>(istream& in, Player& p);
};
class HumanPlayer: public Player
{
public:
HumanPlayer(string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
HumanPlayer(string deckFile);
HumanPlayer(GameObserver *observer, string deckFile, string deckFileSmall = "", MTGDeck * deck = NULL);
};
ostream& operator<<(ostream&, const Player&);
istream& operator>>(istream& in, Player& p);
#endif
+10 -26
View File
@@ -10,31 +10,15 @@ class Player;
class MTGPlayerCards;
class MTGDeck;
class MTGCardInstance;
class GameObserver;
#define MAX_RULES_CARDS 4096;
class RulesPlayerZone
{
public:
vector<int> cards;
void add(int cardid);
RulesPlayerZone();
void cleanup();
};
class RulesPlayerData
{
public:
vector<string> extraRules;
string phaseRing;
int offerInterruptOnPhase;
int life;
int poisonCount;
int damageCount;
int preventable;
string avatar;
ManaCost * manapool;
RulesPlayerZone zones[5];
Player* player;
RulesPlayerData();
~RulesPlayerData();
void cleanup();
@@ -55,9 +39,9 @@ public:
class Rules
{
protected:
Player * loadPlayerMomir(int isAI);
Player * loadPlayerRandom(int isAI, int mode);
Player * initPlayer(int playerId);
Player * loadPlayerMomir(GameObserver* observer, int isAI);
Player * loadPlayerRandom(GameObserver* observer, int isAI, int mode);
Player * initPlayer(GameObserver *observer, int playerId);
MTGDeck * buildDeck(int playerId);
int strToGameMode(string s);
bool postUpdateInitDone;
@@ -84,17 +68,17 @@ public:
static int loadAllRules();
static void unloadAllRules();
static Rules * getRulesByFilename(string _filename);
void initPlayers();
void initPlayers(GameObserver *observer);
bool canChooseDeck(); //True if the players get to select their decks, false if the decks are automatically generated by the mode
void addExtraRules();
void initGame();
void addExtraRules(GameObserver *observer);
void initGame(GameObserver* observer);
//second part of the initialization, needs to happen after the first update call
void postUpdateInit();
void postUpdateInit(GameObserver* observer);
void cleanup();
vector<string> extraRules;
RulesState initState;
static int getMTGId(string name);
static MTGCardInstance * getCardByMTGId(int mtgid);
static MTGCardInstance * getCardByMTGId(GameObserver* observer, int mtgid);
};
+28 -25
View File
@@ -36,8 +36,9 @@ public:
};
bool other;
bool withoutProtections;
TargetChooser(MTGCardInstance * card = NULL, int _maxtargets = UNLITMITED_TARGETS, bool other = false, bool targetMin = false);
TargetChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _maxtargets = UNLITMITED_TARGETS, bool other = false, bool targetMin = false);
Player * Owner;
GameObserver *observer;
MTGCardInstance * source;
MTGCardInstance * targetter; //Optional, usually equals source, used for protection from...
int maxtargets;
@@ -96,7 +97,9 @@ public:
class TargetChooserFactory
{
GameObserver* observer;
public:
TargetChooserFactory(GameObserver *observer) : observer(observer) {};
TargetChooser * createTargetChooser(string s, MTGCardInstance * card, MTGAbility * ability = NULL);
TargetChooser * createTargetChooser(MTGCardInstance * card);
};
@@ -110,8 +113,8 @@ public:
bool targetsZone(MTGGameZone * z);
bool targetsZone(MTGGameZone * z,MTGCardInstance * mSource);
bool withoutProtections;
TargetZoneChooser(MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
TargetZoneChooser(int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
TargetZoneChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
TargetZoneChooser(GameObserver *observer, int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
virtual bool canTarget(Targetable * _card,bool withoutProtections = false);
int setAllZones();
virtual TargetZoneChooser * clone() const;
@@ -124,7 +127,7 @@ protected:
MTGCardInstance * validTarget;
public:
bool withoutProtections;
CardTargetChooser(MTGCardInstance * card, MTGCardInstance * source, int * zones = NULL, int nbzones = 0);
CardTargetChooser(GameObserver *observer, MTGCardInstance * card, MTGCardInstance * source, int * zones = NULL, int nbzones = 0);
virtual bool canTarget(Targetable * target,bool withoutProtections = false);
virtual CardTargetChooser * clone() const;
virtual bool equals(TargetChooser * tc);
@@ -136,8 +139,8 @@ public:
int nbtypes;
int types[10];
bool withoutProtections;
TypeTargetChooser(const char * _type, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
TypeTargetChooser(const char * _type, int * _zones, int nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
TypeTargetChooser(GameObserver *observer, const char * _type, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
TypeTargetChooser(GameObserver *observer, const char * _type, int * _zones, int nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false);
void addType(int type);
void addType(const char * type);
virtual bool canTarget(Targetable * target,bool withoutProtections = false);
@@ -149,13 +152,13 @@ class DamageableTargetChooser: public TypeTargetChooser
{
public:
bool withoutProtections;
DamageableTargetChooser(int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser("creature",_zones, _nbzones, card, _maxtargets, other, targetMin)
DamageableTargetChooser(GameObserver *observer, int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser(observer, "creature",_zones, _nbzones, card, _maxtargets, other, targetMin)
{
}
;
DamageableTargetChooser(MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser("creature", card, _maxtargets, other, targetMin)
DamageableTargetChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser(observer, "creature", card, _maxtargets, other, targetMin)
{
}
;
@@ -170,7 +173,7 @@ protected:
Player * p; //In Case we can only target a specific player
public:
bool withoutProtections;
PlayerTargetChooser(MTGCardInstance * card = NULL, int _maxtargets = 1, Player *_p = NULL);
PlayerTargetChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _maxtargets = 1, Player *_p = NULL);
virtual bool canTarget(Targetable * target, bool withoutProtections = false);
virtual PlayerTargetChooser * clone() const;
virtual bool equals(TargetChooser * tc);
@@ -181,8 +184,8 @@ class DescriptorTargetChooser: public TargetZoneChooser
public:
CardDescriptor * cd;
bool withoutProtections;
DescriptorTargetChooser(CardDescriptor * _cd, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false,bool targetMin = false);
DescriptorTargetChooser(CardDescriptor * _cd, int * _zones, int nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false,bool targetMin = false);
DescriptorTargetChooser(GameObserver *observer, CardDescriptor * _cd, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false,bool targetMin = false);
DescriptorTargetChooser(GameObserver *observer, CardDescriptor * _cd, int * _zones, int nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false,bool targetMin = false);
virtual bool canTarget(Targetable * target,bool withoutProtections = false);
~DescriptorTargetChooser();
virtual DescriptorTargetChooser * clone() const;
@@ -194,7 +197,7 @@ class SpellTargetChooser: public TargetChooser
public:
int color;
bool withoutProtections;
SpellTargetChooser(MTGCardInstance * card = NULL, int _color = -1, int _maxtargets = 1, bool other = false, bool targetMin = false);
SpellTargetChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _color = -1, int _maxtargets = 1, bool other = false, bool targetMin = false);
virtual bool canTarget(Targetable * target, bool withoutProtections = false);
virtual SpellTargetChooser * clone() const;
virtual bool equals(TargetChooser * tc);
@@ -205,7 +208,7 @@ class SpellOrPermanentTargetChooser: public TargetZoneChooser
public:
int color;
bool withoutProtections;
SpellOrPermanentTargetChooser(MTGCardInstance * card = NULL, int _color = -1, int _maxtargets = 1, bool other = false, bool targetMin = false);
SpellOrPermanentTargetChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _color = -1, int _maxtargets = 1, bool other = false, bool targetMin = false);
virtual bool canTarget(Targetable * target, bool withoutProtections = false);
virtual SpellOrPermanentTargetChooser * clone() const;
virtual bool equals(TargetChooser * tc);
@@ -217,7 +220,7 @@ public:
int color;
int state;
bool withoutProtections;
DamageTargetChooser(MTGCardInstance * card = NULL, int _color = -1, int _maxtargets = 1, int state = NOT_RESOLVED);
DamageTargetChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _color = -1, int _maxtargets = 1, int state = NOT_RESOLVED);
virtual bool canTarget(Targetable * target, bool withoutProtections = false);
virtual DamageTargetChooser * clone() const;
virtual bool equals(TargetChooser * tc);
@@ -230,7 +233,7 @@ public:
Targetable * target;
int triggerTarget;
bool withoutProtections;
TriggerTargetChooser(int _triggerTarget);
TriggerTargetChooser(GameObserver *observer, int _triggerTarget);
virtual bool targetsZone(MTGGameZone * z);
virtual bool canTarget(Targetable * _target, bool withoutProtections = false);
virtual TriggerTargetChooser * clone() const;
@@ -241,13 +244,13 @@ class ProliferateChooser: public TypeTargetChooser
{
public:
bool withoutProtections;
ProliferateChooser(int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser("*",_zones, _nbzones, card, _maxtargets, other, targetMin)
ProliferateChooser(GameObserver *observer, int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser(observer, "*",_zones, _nbzones, card, _maxtargets, other, targetMin)
{
}
;
ProliferateChooser(MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false,bool targetMin = false) :
TypeTargetChooser("*", card, _maxtargets, other,targetMin)
ProliferateChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false,bool targetMin = false) :
TypeTargetChooser(observer, "*", card, _maxtargets, other,targetMin)
{
}
;
@@ -262,13 +265,13 @@ public:
bool withoutProtections;
int type;
TargetChooser * deeperTargeting;
ParentChildChooser(int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1,TargetChooser * deepTc = NULL,int type = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser("*",_zones, _nbzones, card, _maxtargets, other, targetMin),type(type),deeperTargeting(deepTc)
ParentChildChooser(GameObserver *observer, int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1,TargetChooser * deepTc = NULL,int type = 1, bool other = false, bool targetMin = false) :
TypeTargetChooser(observer, "*",_zones, _nbzones, card, _maxtargets, other, targetMin),type(type),deeperTargeting(deepTc)
{
}
;
ParentChildChooser(MTGCardInstance * card = NULL, int _maxtargets = 1,TargetChooser * deepTc = NULL,int type = 1, bool other = false,bool targetMin = false) :
TypeTargetChooser("*", card, _maxtargets, other,targetMin),type(type),deeperTargeting(deepTc)
ParentChildChooser(GameObserver *observer, MTGCardInstance * card = NULL, int _maxtargets = 1,TargetChooser * deepTc = NULL,int type = 1, bool other = false,bool targetMin = false) :
TypeTargetChooser(observer, "*", card, _maxtargets, other,targetMin),type(type),deeperTargeting(deepTc)
{
}
;
+5
View File
@@ -7,9 +7,14 @@
class Targetable
{
protected:
GameObserver* observer;
public:
Targetable(GameObserver* observer) : observer(observer) {};
virtual int typeAsTarget() = 0;
virtual const string getDisplayName() const = 0;
inline GameObserver* getObserver() { return observer; };
virtual void setObserver(GameObserver*g) { observer = g; };
};
#endif
+10 -10
View File
@@ -59,7 +59,7 @@ public:
virtual string getShortDesc() = 0;
int getExpiration();
int getReward();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app) = 0;
virtual bool isDone(GameObserver* observer, GameApp * _app) = 0;
bool isExpired();
void setExpiration(int _expiresIn);
void passOneDay();
@@ -100,7 +100,7 @@ public:
void addRandomTask(int diff = 100);
void removeTask(Task *task);
void passOneDay();
void getDoneTasks(Player * _p1, Player * _p2, GameApp * _app, vector<Task*>* result);
void getDoneTasks(GameObserver* observer, GameApp * _app, vector<Task*>* result);
int getTaskCount();
void Start();
@@ -121,7 +121,7 @@ public:
TaskWinAgainst(int _opponent = 0);
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
};
class TaskSlaughter: public TaskWinAgainst
@@ -133,7 +133,7 @@ public:
TaskSlaughter(int _opponent = 0, int _targetLife = -15);
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
virtual void storeCustomAttribs();
virtual void restoreCustomAttribs();
virtual void randomize();
@@ -149,7 +149,7 @@ public:
TaskDelay(int _opponent = 0, int _turn = 20);
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
virtual void storeCustomAttribs();
virtual void restoreCustomAttribs();
virtual void randomize();
@@ -166,7 +166,7 @@ public:
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
virtual void storeCustomAttribs();
virtual void restoreCustomAttribs();
virtual void randomize();
@@ -183,7 +183,7 @@ public:
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
virtual void storeCustomAttribs();
virtual void restoreCustomAttribs();
virtual void randomize();
@@ -200,7 +200,7 @@ public:
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
virtual void storeCustomAttribs();
virtual void restoreCustomAttribs();
virtual void randomize();
@@ -216,7 +216,7 @@ public:
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
virtual void storeCustomAttribs();
virtual void restoreCustomAttribs();
virtual void randomize();
@@ -232,7 +232,7 @@ public:
virtual string createDesc();
virtual string getShortDesc();
virtual bool isDone(Player * _p1, Player * _p2, GameApp * _app);
virtual bool isDone(GameObserver* observer, GameApp * _app);
virtual void storeCustomAttribs();
virtual void restoreCustomAttribs();
virtual void randomize();
+11 -30
View File
@@ -18,37 +18,18 @@ public:
void cleanup();
};
class TestSuitePlayerZone
{
public:
int cards[MAX_TESTUITE_CARDS];
int nbitems;
void add(int cardid);
TestSuitePlayerZone();
void cleanup();
};
class TestSuitePlayerData
{
public:
int life;
ManaCost * manapool;
TestSuitePlayerZone zones[5];
TestSuitePlayerData();
~TestSuitePlayerData();
void cleanup();
};
class TestSuite;
class TestSuiteAI;
class TestSuiteState
{
public:
int phase;
void parsePlayerState(int playerId, string s);
TestSuiteState();
TestSuitePlayerData playerData[2];
void cleanup();
TestSuiteAI* players[2];
void cleanup(TestSuite*);
};
class TestSuitePregame
@@ -66,8 +47,6 @@ private:
TestSuiteState endState;
TestSuiteActions actions;
bool forceAbility;
int summoningSickness;
int load(const char * filename);
void cleanup();
@@ -77,12 +56,13 @@ public:
float timerLimit;
int aiMaxCalls;
int currentAction;
int summoningSickness;
TestSuiteState initState;
string getNextAction();
MTGPlayerCards * buildDeck(int playerId);
Interruptible * getActionByMTGId(int mtgid);
int assertGame();
MTGPlayerCards * buildDeck(Player*, int playerId);
Interruptible * getActionByMTGId(GameObserver* observer, int mtgid);
int assertGame(GameObserver*);
public:
int startTime, endTime;
@@ -90,7 +70,7 @@ public:
unsigned int seed;
int nbFailed, nbTests, nbAIFailed, nbAITests;
TestSuite(const char * filename);
void initGame();
void initGame(GameObserver* g);
void pregameTests();
int loadNext();
static int Log(const char * text);
@@ -106,9 +86,10 @@ private:
TestSuite * suite;
public:
TestSuiteAI(TestSuite * suite, int playerId);
TestSuiteAI(GameObserver *observer, TestSuite * suite, int playerId);
virtual int Act(float dt);
virtual int displayStack();
bool summoningSickness() {return (suite->summoningSickness == 1); }
};
#endif
+1 -1
View File
@@ -22,7 +22,7 @@ class ThisDescriptor{
class ThisDescriptorFactory{
public:
ThisDescriptor * createThisDescriptor(string s);
ThisDescriptor * createThisDescriptor(GameObserver* observer, string s);
};
class ThisCounter:public ThisDescriptor{
+1
View File
@@ -8,6 +8,7 @@ class Token: public MTGCardInstance
MTGCardInstance * tokenSource;
public:
Token(string _name, MTGCardInstance * source, int _power = 0, int _toughness = 0);
Token(int id);
};
#endif
+1 -1
View File
@@ -104,7 +104,7 @@ bool AIHints::abilityMatches(MTGAbility * ability, AIHint * hint)
vector<MTGAbility *> AIHints::findAbilities(AIHint * hint)
{
std::vector<MTGAbility *> elems;
ActionLayer * al = GameObserver::GetInstance()->mLayers->actionLayer();
ActionLayer * al = mPlayer->getObserver()->mLayers->actionLayer();
for (size_t i = 1; i < al->mObjects.size(); i++) //0 is not a mtgability...hackish
{
+11 -13
View File
@@ -8,8 +8,8 @@
MTGAbility * AIMomirPlayer::momirAbility = NULL;
AIMomirPlayer::AIMomirPlayer(string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayerBaka(file, fileSmall, avatarFile, deck)
AIMomirPlayer::AIMomirPlayer(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayerBaka(observer, file, fileSmall, avatarFile, deck)
{
momirAbility = NULL;
agressivity = 100;
@@ -22,8 +22,7 @@ int AIMomirPlayer::getEfficiency(OrderedAIAction * action)
if (cost && !(cost->isExtraPaymentSet())) return 0; //Does not handle abilities with sacrifice yet
int efficiency = AIPlayerBaka::getEfficiency(action);
GameObserver * g = GameObserver::GetInstance();
if (g->getCurrentGamePhase() < Constants::MTG_PHASE_FIRSTMAIN) return 0;
if (observer->getCurrentGamePhase() < Constants::MTG_PHASE_FIRSTMAIN) return 0;
return efficiency;
}
@@ -31,8 +30,7 @@ MTGAbility * AIMomirPlayer::getMomirAbility()
{
if (momirAbility) return momirAbility;
GameObserver * g = GameObserver::GetInstance();
momirAbility = g->mLayers->actionLayer()->getAbility(MTGAbility::MOMIR);
momirAbility = observer->mLayers->actionLayer()->getAbility(MTGAbility::MOMIR);
return momirAbility;
}
@@ -79,17 +77,17 @@ int AIMomirPlayer::computeActions()
You skip your Five on the play because it is the weakest drop. There are plenty of serviceable guys there, but very few bombs compared to other drops
the general rule is this: if you want to get to Eight, you have to skip two drops on the play and one drop on the draw.
*/
GameObserver * g = GameObserver::GetInstance();
Player * p = g->currentPlayer;
if (!(g->currentlyActing() == this)) return 0;
Player * p = observer->currentPlayer;
if (!(observer->currentlyActing() == this)) return 0;
if (chooseTarget()) return 1;
int currentGamePhase = g->getCurrentGamePhase();
if (g->isInterrupting == this)
int currentGamePhase = observer->getCurrentGamePhase();
if (observer->isInterrupting == this)
{ // interrupting
selectAbility();
return 1;
}
else if (p == this && g->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)
else if (p == this && observer->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)
{ //standard actions
CardDescriptor cd;
MTGCardInstance * card = NULL;
@@ -111,7 +109,7 @@ int AIMomirPlayer::computeActions()
int canPutLandsIntoPlay = game->playRestrictions->canPutIntoZone(card, game->inPlay);
if (card && (canPutLandsIntoPlay == PlayRestriction::CAN_PLAY))
{
MTGAbility * putIntoPlay = g->mLayers->actionLayer()->getAbility(MTGAbility::PUT_INTO_PLAY);
MTGAbility * putIntoPlay = observer->mLayers->actionLayer()->getAbility(MTGAbility::PUT_INTO_PLAY);
AIAction * a = NEW AIAction(this, putIntoPlay, card); //TODO putinplay action
clickstream.push(a);
return 1;
+13 -14
View File
@@ -45,7 +45,7 @@ AIAction::AIAction(Player * owner, MTGCardInstance * c, MTGCardInstance * t)
int AIAction::Act()
{
GameObserver * g = GameObserver::GetInstance();
GameObserver * g = owner->getObserver();
if (player && !playerAbilityTarget)
{
g->cardClick(NULL, player);
@@ -85,10 +85,10 @@ int AIAction::Act()
int AIAction::clickMultiAct(vector<Targetable*>& actionTargets)
{
GameObserver * g = GameObserver::GetInstance();
GameObserver * g = player->getObserver();
TargetChooser * tc = g->getCurrentTargetChooser();
if(!tc) return 0;
bool sourceIncluded = false;
if(!tc) return 0;
for(size_t f = 0;f < actionTargets.size();f++)
{
MTGCardInstance * card = ((MTGCardInstance *) actionTargets[f]);
@@ -123,8 +123,8 @@ int AIAction::clickMultiAct(vector<Targetable*>& actionTargets)
return 1;
}
AIPlayer::AIPlayer(string file, string fileSmall, MTGDeck * deck) :
Player(file, fileSmall, deck)
AIPlayer::AIPlayer(GameObserver *observer, string file, string fileSmall, MTGDeck * deck) :
Player(observer, file, fileSmall, deck)
{
agressivity = 50;
forceBestAbilityUse = false;
@@ -147,9 +147,8 @@ AIPlayer::~AIPlayer()
int AIPlayer::Act(float dt)
{
GameObserver * gameObs = GameObserver::GetInstance();
if (gameObs->currentPlayer == this)
gameObs->userRequestNextGamePhase();
if (observer->currentPlayer == this)
observer->userRequestNextGamePhase();
return 1;
}
@@ -217,7 +216,7 @@ int AIPlayer::clickSingleTarget(TargetChooser * tc, vector<Targetable*>& potenti
}
AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * opponent, int deckid)
AIPlayer * AIPlayerFactory::createAIPlayer(GameObserver *observer, MTGAllCards * collection, Player * opponent, int deckid)
{
char deckFile[512];
string avatarFilename; // default imagename
@@ -268,7 +267,7 @@ AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * op
}
// AIPlayerBaka will delete MTGDeck when it's time
AIPlayerBaka * baka = NEW AIPlayerBaka(deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting));
AIPlayerBaka * baka = NEW AIPlayerBaka(observer, deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting));
baka->deckId = deckid;
return baka;
}
@@ -284,7 +283,7 @@ void AIPlayer::Render()
}
#ifdef AI_CHANGE_TESTING
AIPlayer * AIPlayerFactory::createAIPlayerTest(MTGAllCards * collection, Player * opponent, string _folder)
AIPlayer * AIPlayerFactory::createAIPlayerTest(GameObserver *observer, MTGAllCards * collection, Player * opponent, string _folder)
{
char deckFile[512];
string avatarFilename; // default imagename
@@ -312,7 +311,7 @@ AIPlayer * AIPlayerFactory::createAIPlayerTest(MTGAllCards * collection, Player
if (!nbdecks)
{
if (_folder.size())
return createAIPlayerTest(collection, opponent, "");
return createAIPlayerTest(observer, collection, opponent, "");
return NULL;
}
deckid = 1 + WRand() % (nbdecks);
@@ -334,8 +333,8 @@ AIPlayer * AIPlayerFactory::createAIPlayerTest(MTGAllCards * collection, Player
// AIPlayerBaka will delete MTGDeck when it's time
AIPlayerBaka * baka = opponent ?
NEW AIPlayerBakaB(deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting)) :
NEW AIPlayerBaka(deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting));
NEW AIPlayerBakaB(observer, deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting)) :
NEW AIPlayerBaka(observer, deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting));
baka->deckId = deckid;
return baka;
}
+76 -95
View File
@@ -28,7 +28,7 @@ Player * OrderedAIAction::getPlayerTarget()
int OrderedAIAction::getEfficiency(AADamager * aad)
{
Player * playerTarget = getPlayerTarget();
GameObserver * g = GameObserver::GetInstance();
GameObserver * g = owner->getObserver();
Player * p = g->currentlyActing();
MTGCardInstance * dTarget = target ? target : dynamic_cast<MTGCardInstance *>(aad->getTarget());
@@ -68,7 +68,7 @@ int OrderedAIAction::getEfficiency()
return efficiency;
if (!ability)
return 0;
GameObserver * g = GameObserver::GetInstance();
GameObserver * g = owner->getObserver();
ActionStack * s = g->mLayers->stackLayer();
int currentPhase = g->getCurrentGamePhase();
@@ -271,7 +271,7 @@ int OrderedAIAction::getEfficiency()
target = a->source;
}
AbilityFactory af;
AbilityFactory af(g);
int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY);
//i do not set a starting eff. on this ability, this allows Ai to sometimes randomly do it as it normally does.
int currentPhase = g->getCurrentGamePhase();
@@ -333,7 +333,7 @@ int OrderedAIAction::getEfficiency()
//ensuring that Ai grants abilities to creatures during first main, so it can actually use them in combat.
//quick note: the eff is multiplied by creatures ranking then divided by the number of cards in hand.
//the reason i do this is to encourage more casting and less waste of mana on abilities.
AbilityFactory af;
AbilityFactory af(g);
int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY);
int efficiencyModifier = (25 * target->DangerRanking());
@@ -405,7 +405,7 @@ int OrderedAIAction::getEfficiency()
Targetable * _t = alife->getTarget();
efficiency = 100;
AbilityFactory af;
AbilityFactory af(g);
int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY);
if ((suggestion == BAKA_EFFECT_BAD && _t == p) || (suggestion == BAKA_EFFECT_GOOD && _t != p))
@@ -469,7 +469,7 @@ int OrderedAIAction::getEfficiency()
default:
if (target)
{
AbilityFactory af;
AbilityFactory af(g);
int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY,NULL,target);
if (AADynamic * ady = dynamic_cast<AADynamic *>(a))
{
@@ -749,13 +749,12 @@ bool AIPlayerBaka::payTheManaCost(ManaCost * cost, MTGCardInstance * target,vect
}
ManaCost * diff = pMana->Diff(cost);
delete (pMana);
GameObserver * g = GameObserver::GetInstance();
map<MTGCardInstance *, bool> used;
for (size_t i = 1; i < g->mLayers->actionLayer()->mObjects.size(); ++i)
for (size_t i = 1; i < observer->mLayers->actionLayer()->mObjects.size(); ++i)
{ //0 is not a mtgability...hackish
//Make sure we can use the ability
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->mObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->mObjects[i]);
AManaProducer * amp = dynamic_cast<AManaProducer*> (a);
if (amp && canHandleCost(amp))
{
@@ -792,12 +791,11 @@ bool AIPlayerBaka::payTheManaCost(ManaCost * cost, MTGCardInstance * target,vect
ManaCost * AIPlayerBaka::getPotentialMana(MTGCardInstance * target)
{
ManaCost * result = NEW ManaCost();
GameObserver * g = GameObserver::GetInstance();
map<MTGCardInstance *, bool> used;
for (size_t i = 0; i < g->mLayers->actionLayer()->manaObjects.size(); i++)
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
{
//Make sure we can use the ability
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->manaObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->manaObjects[i]);
AManaProducer * amp = dynamic_cast<AManaProducer*> (a);
GenericActivatedAbility * gmp = dynamic_cast<GenericActivatedAbility*>(a);
if(gmp && canHandleCost(gmp))
@@ -834,7 +832,6 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost *
if(!cost || (cost && !cost->getConvertedCost()))
return vector<MTGAbility*>();
ManaCost * result = NEW ManaCost();
GameObserver * g = GameObserver::GetInstance();
map<MTGCardInstance *, bool> used;
vector<MTGAbility*>payments = vector<MTGAbility*>();
if (this->getManaPool()->getConvertedCost())
@@ -844,9 +841,9 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost *
}
int needColorConverted = cost->getConvertedCost()-int(cost->getCost(0)+cost->getCost(7));
int fullColor = 0;
for (size_t i = 0; i < g->mLayers->actionLayer()->manaObjects.size(); i++)
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
{
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->manaObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->manaObjects[i]);
AManaProducer * amp = dynamic_cast<AManaProducer*> (a);
if(amp && (amp->getCost() && amp->getCost()->extraCosts && !amp->getCost()->extraCosts->canPay()))
continue;
@@ -946,9 +943,9 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost *
//{rw}{ub} would be 2 runs of this.90% of the time ai finds it's hybrid in pMana check.
bool foundColor1 = false;
bool foundColor2 = false;
for (size_t i = 0; i < g->mLayers->actionLayer()->manaObjects.size(); i++)
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
{
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->manaObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->manaObjects[i]);
AManaProducer * amp = dynamic_cast<AManaProducer*> (a);
if (amp && canHandleCost(amp))
{
@@ -1010,9 +1007,9 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost *
{
//if we decided to play an "x" ability/card, lets go all out, these effects tend to be game winners.
//add the rest of the mana.
for (size_t i = 0; i < g->mLayers->actionLayer()->manaObjects.size(); i++)
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
{
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->manaObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->manaObjects[i]);
AManaProducer * amp = dynamic_cast<AManaProducer*> (a);
if (amp && canHandleCost(amp))
{
@@ -1035,21 +1032,20 @@ vector<MTGAbility*> AIPlayerBaka::canPaySunBurst(ManaCost * cost)
//note it is still possible to use lotus petal for it's first mana ability and not later for a final color
//a search of true sunburst would cause the game to come to a crawl, trust me, this is the "fast" method for sunburst :)
ManaCost * result = NEW ManaCost();
GameObserver * g = GameObserver::GetInstance();
map<MTGCardInstance *, bool> used;
vector<MTGAbility*>payments = vector<MTGAbility*>();
int needColorConverted = 6;
int fullColor = 0;
result->add(this->getManaPool());
for (size_t i = 0; i < g->mLayers->actionLayer()->manaObjects.size(); i++)
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
{
//Make sure we can use the ability
if(fullColor == needColorConverted || fullColor == cost->getConvertedCost())
{
i = g->mLayers->actionLayer()->manaObjects.size();
i = observer->mLayers->actionLayer()->manaObjects.size();
break;
}
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->manaObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->manaObjects[i]);
AManaProducer * amp = dynamic_cast<AManaProducer*> (a);
if(amp && amp->getCost() && amp->getCost()->extraCosts && !amp->getCost()->extraCosts->canPay())
continue;//pentid prism, has no cost but contains a counter cost, without this check ai will think it can still use this mana.
@@ -1084,9 +1080,9 @@ vector<MTGAbility*> AIPlayerBaka::canPaySunBurst(ManaCost * cost)
}
for(int i = fullColor;i < cost->getConvertedCost();i++)
{
for (size_t i = 0; i < g->mLayers->actionLayer()->manaObjects.size(); i++)
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
{
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->manaObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->manaObjects[i]);
AManaProducer * amp = dynamic_cast<AManaProducer*> (a);
if (amp && canHandleCost(amp))
{
@@ -1151,10 +1147,9 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank
return 1;
}
vector<Targetable*>potentialTargets;
GameObserver * g = GameObserver::GetInstance();
for (int i = 0; i < 2; i++)
{
Player * p = g->players[i];
Player * p = observer->players[i];
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay,p->game->stack };
if(a->getActionTc()->canTarget((Targetable*)p))
{
@@ -1260,8 +1255,7 @@ int AIPlayerBaka::selectAbility()
if (selectHintAbility())
return 1;
GameObserver * go = GameObserver::GetInstance();
if(go->mLayers->stackLayer()->lastActionController == this)
if(observer->mLayers->stackLayer()->lastActionController == this)
{
//this is here for 2 reasons, MTG rules state that priority is passed with each action.
//without this ai is able to chain cast {t}:damage:1 target(creature) from everything it can all at once.
@@ -1271,14 +1265,13 @@ int AIPlayerBaka::selectAbility()
RankingContainer ranking;
list<int>::iterator it;
GameObserver * g = GameObserver::GetInstance();
vector<MTGAbility*>abilityPayment = vector<MTGAbility*>();
//This loop is extrmely inefficient. TODO: optimize!
ManaCost * totalPotentialMana = getPotentialMana();
totalPotentialMana->add(this->getManaPool());
for (size_t i = 1; i < g->mLayers->actionLayer()->mObjects.size(); i++)
for (size_t i = 1; i < observer->mLayers->actionLayer()->mObjects.size(); i++)
{ //0 is not a mtgability...hackish
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->mObjects[i]);
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->mObjects[i]);
//Skip mana abilities for performance
if (dynamic_cast<AManaProducer*> (a))
continue;
@@ -1353,14 +1346,12 @@ int AIPlayerBaka::selectAbility()
int AIPlayerBaka::interruptIfICan()
{
GameObserver * g = GameObserver::GetInstance();
if (g->mLayers->stackLayer()->askIfWishesToInterrupt == this)
if (observer->mLayers->stackLayer()->askIfWishesToInterrupt == this)
{
if (!clickstream.empty())
g->mLayers->stackLayer()->cancelInterruptOffer();
observer->mLayers->stackLayer()->cancelInterruptOffer();
else
return g->mLayers->stackLayer()->setIsInterrupting(this);
return observer->mLayers->stackLayer()->setIsInterrupting(this);
}
return 0;
}
@@ -1368,7 +1359,7 @@ int AIPlayerBaka::interruptIfICan()
int AIPlayerBaka::effectBadOrGood(MTGCardInstance * card, int mode, TargetChooser * tc)
{
int id = card->getMTGId();
AbilityFactory af;
AbilityFactory af(observer);
int autoGuess = af.magicText(id, NULL, card, mode, tc);
if (autoGuess)
return autoGuess;
@@ -1379,12 +1370,11 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
{
vector<Targetable *> potentialTargets;
TargetChooser * tc = _tc;
GameObserver * gameObs = GameObserver::GetInstance();
if (!(gameObs->currentlyActing() == this))
if (!(observer->currentlyActing() == this))
return 0;
if (!tc)
{
tc = gameObs->getCurrentTargetChooser();
tc = observer->getCurrentTargetChooser();
}
if (!tc || !tc->source || tc->maxtargets < 1)
return 0;
@@ -1395,10 +1385,10 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
potentialTargets.clear();
}
//Make sure we own the decision to choose the targets
assert(tc->Owner == gameObs->currentlyActing());
if (tc && tc->Owner != gameObs->currentlyActing())
assert(tc->Owner == observer->currentlyActing());
if (tc && tc->Owner != observer->currentlyActing())
{
gameObs->currentActionPlayer = tc->Owner;
observer->currentActionPlayer = tc->Owner;
//this is a hack, but if we hit this condition we are locked in a infinate loop
//so lets give the tc to its owner
//todo:find the root cause of this.
@@ -1413,7 +1403,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
int cardEffect = effectBadOrGood(tc->source, MODE_TARGET, tc);
if(tc->belongsToAbility.size())
{
AbilityFactory af;
AbilityFactory af(observer);
MTGAbility * withoutGuessing = af.parseMagicLine(tc->belongsToAbility,NULL,NULL,tc->source);
cardEffect = af.abilityEfficiency(withoutGuessing,this,MODE_TARGET,tc,NULL);
delete withoutGuessing;
@@ -1461,7 +1451,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
{
if(tc->maxtargets != 1 && tc->belongsToAbility.size())
{
AbilityFactory af;
AbilityFactory af(observer);
MTGAbility * withoutGuessing = af.parseMagicLine(tc->belongsToAbility,NULL,NULL,tc->source);
OrderedAIAction * effCheck = NEW OrderedAIAction(this, withoutGuessing,(MTGCardInstance*)tc->source,card);
if(effCheck->getEfficiency())
@@ -1504,7 +1494,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
//Couldn't find any valid target,
//usually that's because we played a card that has bad side effects (ex: when X comes into play, return target land you own to your hand)
//so we try again to choose a target in the other player's field...
int cancel = gameObs->cancelCurrentAction();
int cancel = observer->cancelCurrentAction();
if (!cancel && !forceTarget)
return chooseTarget(tc, target->opponent(), NULL, checkOnly);
//ERROR!!!
@@ -1514,8 +1504,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
int AIPlayerBaka::selectMenuOption()
{
GameObserver * g = GameObserver::GetInstance();
ActionLayer * object = g->mLayers->actionLayer();
ActionLayer * object = observer->mLayers->actionLayer();
int doThis = -1;
if (object->menuObject)
{
@@ -1633,7 +1622,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost())))
{
TargetChooserFactory tcf;
TargetChooserFactory tcf(observer);
TargetChooser * tc = tcf.createTargetChooser(card);
int shouldPlayPercentage = 10;
if (tc)
@@ -1705,7 +1694,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
}
if(card->getRestrictions().size())
{
AbilityFactory af;
AbilityFactory af(observer);
int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions());
if(!canPlay)
continue;
@@ -1746,27 +1735,26 @@ int AIPlayerBaka::computeActions()
reasoning:I split this from 2 to 3 else statements, leaving chooseblockers in the 3rd else,
the 2nd else is run about 90% of the time over the third, this was causing ai to miss the chance to chooseblockers()
when it could have blocked almost 90% of the time.*/
GameObserver * g = GameObserver::GetInstance();
Player * p = this;
Player * currentP = g->currentlyActing();
Player * currentP = observer->currentlyActing();
if (!(currentP == p))
return 0;
ActionLayer * object = g->mLayers->actionLayer();
ActionLayer * object = observer->mLayers->actionLayer();
if (object->menuObject)
{
int doThis = selectMenuOption();
if(doThis >= 0)
{
if(object->abilitiesMenu->isMultipleChoice)
g->mLayers->actionLayer()->doMultipleChoice(doThis);
observer->mLayers->actionLayer()->doMultipleChoice(doThis);
else
g->mLayers->actionLayer()->doReactTo(doThis);
observer->mLayers->actionLayer()->doReactTo(doThis);
}
else if(doThis < 0 || object->checkCantCancel())
g->mLayers->actionLayer()->doReactTo(object->abilitiesMenu->mObjects.size()-1);
observer->mLayers->actionLayer()->doReactTo(object->abilitiesMenu->mObjects.size()-1);
return 1;
}
TargetChooser * currentTc = g->getCurrentTargetChooser();
TargetChooser * currentTc = observer->getCurrentTargetChooser();
if(currentTc)
{
int targetResult = currentTc->Owner == this? chooseTarget():0;
@@ -1783,13 +1771,13 @@ int AIPlayerBaka::computeActions()
{//is already looking kick me out of this function!
return 0;
}
Interruptible * action = g->mLayers->stackLayer()->getAt(-1);
Interruptible * action = observer->mLayers->stackLayer()->getAt(-1);
Spell * spell = dynamic_cast<Spell *>(action);
Player * lastStackActionController = spell ? spell->source->controller() : NULL;
if (g->isInterrupting == this
if (observer->isInterrupting == this
&& this == currentP
//and i am the currentlyActivePlayer
&& ((lastStackActionController && lastStackActionController != this) || (g->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)))
&& ((lastStackActionController && lastStackActionController != this) || (observer->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)))
//am im not interupting my own spell, or the stack contains nothing.
{
bool ipotential = false;
@@ -1834,9 +1822,9 @@ int AIPlayerBaka::computeActions()
findingCard = false;
return 1;
}
else if(g->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)
else if(observer->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)
{ //standard actions
switch (g->getCurrentGamePhase())
switch (observer->getCurrentGamePhase())
{
case Constants::MTG_PHASE_UPKEEP:
selectAbility();
@@ -1904,13 +1892,13 @@ int AIPlayerBaka::computeActions()
}
case Constants::MTG_PHASE_COMBATATTACKERS:
{
if(g->currentPlayer == this)//only on my turns.
if(observer->currentPlayer == this)//only on my turns.
chooseAttackers();
break;
}
case Constants::MTG_PHASE_COMBATBLOCKERS:
{
if(g->currentPlayer != this)//only on my opponents turns.
if(observer->currentPlayer != this)//only on my opponents turns.
chooseBlockers();
break;
}
@@ -1924,7 +1912,7 @@ int AIPlayerBaka::computeActions()
else
{
cout << "my turn" << endl;
switch (g->getCurrentGamePhase())
switch (observer->getCurrentGamePhase())
{
case Constants::MTG_PHASE_UPKEEP:
case Constants::MTG_PHASE_FIRSTMAIN:
@@ -1996,11 +1984,10 @@ int AIPlayerBaka::chooseAttackers()
cd.init();
cd.setType("creature");
MTGCardInstance * card = NULL;
GameObserver * g = GameObserver::GetInstance();
MTGAbility * a = g->mLayers->actionLayer()->getAbility(MTGAbility::MTG_ATTACK_RULE);
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::MTG_ATTACK_RULE);
while ((card = cd.nextmatch(game->inPlay, card)))
{
g->mLayers->actionLayer()->reactToClick(a, card);
observer->mLayers->actionLayer()->reactToClick(a, card);
}
}
return 1;
@@ -2022,10 +2009,8 @@ int AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *en
int AIPlayerBaka::chooseBlockers()
{
GameObserver * g = GameObserver::GetInstance();
//Should not block during my own turn...
if (g->currentPlayer == this)
if (observer->currentPlayer == this)
return 0;
map<MTGCardInstance *, int> opponentsToughness;
int opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER);
@@ -2047,12 +2032,12 @@ int AIPlayerBaka::chooseBlockers()
cd.setType("Creature");
cd.unsecureSetTapped(-1);
card = NULL;
MTGAbility * a = g->mLayers->actionLayer()->getAbility(MTGAbility::MTG_BLOCK_RULE);
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::MTG_BLOCK_RULE);
// We first try to block the major threats, those that are marked in the Top 3 of our stats
while ((card = cd.nextmatch(game->inPlay, card)))
{
g->mLayers->actionLayer()->reactToClick(a, card);
observer->mLayers->actionLayer()->reactToClick(a, card);
int set = 0;
while (!set)
{
@@ -2076,7 +2061,7 @@ int AIPlayerBaka::chooseBlockers()
}
else
{
g->mLayers->actionLayer()->reactToClick(a, card);
observer->mLayers->actionLayer()->reactToClick(a, card);
}
}
}
@@ -2091,7 +2076,7 @@ int AIPlayerBaka::chooseBlockers()
{
while (card->defenser)
{
g->mLayers->actionLayer()->reactToClick(a, card);
observer->mLayers->actionLayer()->reactToClick(a, card);
}
}
}
@@ -2102,7 +2087,7 @@ int AIPlayerBaka::chooseBlockers()
{
if (!card->defenser)
{
g->mLayers->actionLayer()->reactToClick(a, card);
observer->mLayers->actionLayer()->reactToClick(a, card);
int set = 0;
while (!set)
{
@@ -2116,7 +2101,7 @@ int AIPlayerBaka::chooseBlockers()
if (opponentsToughness[attacker] <= 0 || (card->toughness <= attacker->power && opponentForce * 2 < life
&& !canFirstStrikeKill(card, attacker)) || attacker->nbOpponents() > 1)
{
g->mLayers->actionLayer()->reactToClick(a, card);
observer->mLayers->actionLayer()->reactToClick(a, card);
}
else
{
@@ -2132,12 +2117,10 @@ int AIPlayerBaka::chooseBlockers()
int AIPlayerBaka::orderBlockers()
{
GameObserver * g = GameObserver::GetInstance();
if (ORDER == g->combatStep && g->currentPlayer == this)
if (ORDER == observer->combatStep && observer->currentPlayer == this)
{
DebugTrace("AIPLAYER: order blockers");
g->userRequestNextGamePhase(); //TODO clever rank of blockers
observer->userRequestNextGamePhase(); //TODO clever rank of blockers
return 1;
}
@@ -2146,8 +2129,7 @@ int AIPlayerBaka::orderBlockers()
int AIPlayerBaka::affectCombatDamages(CombatStep step)
{
GameObserver * g = GameObserver::GetInstance();
GuiCombat * gc = g->mLayers->combatLayer();
GuiCombat * gc = observer->mLayers->combatLayer();
for (vector<AttackerDamaged*>::iterator attacker = gc->attackers.begin(); attacker != gc->attackers.end(); ++attacker)
gc->autoaffectDamage(*attacker, step);
return 1;
@@ -2156,7 +2138,7 @@ int AIPlayerBaka::affectCombatDamages(CombatStep step)
//TODO: Deprecate combatDamages
int AIPlayerBaka::combatDamages()
{
int currentGamePhase = GameObserver::GetInstance()->getCurrentGamePhase();
int currentGamePhase = observer->getCurrentGamePhase();
if (currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS)
return orderBlockers();
@@ -2200,8 +2182,8 @@ int AIPlayerBaka::receiveEvent(WEvent * event)
}
AIPlayerBaka::AIPlayerBaka(string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayer(file, fileSmall, deck)
AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayer(observer, file, fileSmall, deck)
{
nextCardToPlay = NULL;
@@ -2236,13 +2218,12 @@ AIPlayerBaka::AIPlayerBaka(string file, string fileSmall, string avatarFile, MTG
int AIPlayerBaka::Act(float dt)
{
GameObserver * g = GameObserver::GetInstance();
if (!(g->currentlyActing() == this))
if (!(observer->currentlyActing() == this))
{
return 0;
}
int currentGamePhase = g->getCurrentGamePhase();
int currentGamePhase = observer->getCurrentGamePhase();
oldGamePhase = currentGamePhase;
@@ -2263,7 +2244,7 @@ int AIPlayerBaka::Act(float dt)
interruptIfICan();
//computeActions only when i have priority
if (!(g->currentlyActing() == this))
if (!(observer->currentlyActing() == this))
{
DebugTrace("Cannot interrupt");
return 0;
@@ -2272,14 +2253,14 @@ int AIPlayerBaka::Act(float dt)
computeActions();
if (clickstream.empty())
{
if (g->isInterrupting == this)
if (observer->isInterrupting == this)
{
g->mLayers->stackLayer()->cancelInterruptOffer(); //endOfInterruption();
observer->mLayers->stackLayer()->cancelInterruptOffer(); //endOfInterruption();
}
else
{
if (g->currentActionPlayer == this)//if im not the action player why would i requestnextphase?
g->userRequestNextGamePhase();
if (observer->currentActionPlayer == this)//if im not the action player why would i requestnextphase?
observer->userRequestNextGamePhase();
}
}
else
+2 -2
View File
@@ -178,8 +178,8 @@ int AIPlayerBakaB::receiveEvent(WEvent * event)
}
AIPlayerBakaB::AIPlayerBakaB(string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayerBaka(file, fileSmall, avatarFile, deck)
AIPlayerBakaB::AIPlayerBakaB(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayerBaka(observer, file, fileSmall, avatarFile, deck)
{
}
+3 -3
View File
@@ -50,7 +50,7 @@ void AIStats::updateStatsCard(MTGCardInstance * cardInstance, Damage * damage, f
else if (damage->target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE)
{
MTGCardInstance * target = (MTGCardInstance *) damage->target;
if (target->controller() == player && !target->isInPlay())
if (target->controller() == player && !target->isInPlay(player->getObserver()))
{
//One of my creatures got lethal damage...
stat->value += static_cast<int>(multiplier * STATS_CREATURE_MULTIPLIER * damage->damage);
@@ -79,7 +79,7 @@ int AIStats::receiveEvent(WEvent * event)
}
}
GameObserver * g = GameObserver::GetInstance();
GameObserver * g = player->getObserver();
//Lords
map<MTGCardInstance *, int> lords;
for (size_t i = 1; i < g->mLayers->actionLayer()->mObjects.size(); i++)
@@ -190,7 +190,7 @@ void AIStats::save()
void AIStats::Render()
{
GameObserver * g = GameObserver::GetInstance();
GameObserver * g = player->getObserver();
float x0 = 10;
if (player == g->players[1])
x0 = 280;
+9 -10
View File
@@ -34,7 +34,7 @@ int ActionLayer::removeFromGame(ActionElement * e)
i = getIndexOf(e); //the destroy event might have changed the contents of mObjects, so we get the index again
if (i == -1)
return 0; //Should not happen, it means we deleted thesame object twice?
AbilityFactory af;
AbilityFactory af(observer);
if(MTGAbility * a = dynamic_cast<MTGAbility*>(e))
{
AManaProducer * manaObject = dynamic_cast<AManaProducer*>(af.getCoreAbility((MTGAbility*)e));
@@ -90,10 +90,9 @@ int ActionLayer::reactToTargetClick(ActionElement* ability, Targetable * card)
bool ActionLayer::CheckUserInput(JButton key)
{
GameObserver * g = GameObserver::GetInstance();
if (g->mExtraPayment && key == JGE_BTN_SEC)
if (observer->mExtraPayment && key == JGE_BTN_SEC)
{
g->mExtraPayment = NULL;
observer->mExtraPayment = NULL;
return 1;
}
if (menuObject)
@@ -121,7 +120,6 @@ void ActionLayer::Update(float dt)
return;
}
modal = 0;
GameObserver* game = GameObserver::GetInstance();
for (int i = (int)(mObjects.size()) - 1; i >= 0; i--)
{
//a dirty hack, there might be cases when the mObject array gets reshaped if an ability removes some of its children abilites
@@ -136,10 +134,10 @@ void ActionLayer::Update(float dt)
{
ActionElement * currentAction = (ActionElement *) mObjects[i];
if (currentAction->testDestroy())
game->removeObserver(currentAction);
observer->removeObserver(currentAction);
}
}
int newPhase = game->getCurrentGamePhase();
int newPhase = observer->getCurrentGamePhase();
for (size_t i = 0; i < mObjects.size(); i++)
{
if (mObjects[i] != NULL)
@@ -429,7 +427,7 @@ void ActionLayer::ButtonPressed(int controllerid, int controlid)
}
else if (controlid == kCancelMenuID)
{
GameObserver::GetInstance()->mLayers->stackLayer()->endOfInterruption();
observer->mLayers->stackLayer()->endOfInterruption();
menuObject = 0;
}
else
@@ -463,12 +461,13 @@ void ActionLayer::ButtonPressedOnMultipleChoice(int choice)
}
else if (currentMenuObject == kCancelMenuID)
{
GameObserver::GetInstance()->mLayers->stackLayer()->endOfInterruption();
observer->mLayers->stackLayer()->endOfInterruption();
}
menuObject = 0;
}
ActionLayer::ActionLayer()
ActionLayer::ActionLayer(GameObserver *observer)
: GuiLayer(observer)
{
menuObject = NULL;
abilitiesMenu = NULL;
+55 -62
View File
@@ -34,39 +34,35 @@ NextGamePhase requested by user
*/
int NextGamePhase::resolve()
{
GameObserver::GetInstance()->nextGamePhase();
observer->nextGamePhase();
return 1;
}
const string NextGamePhase::getDisplayName() const
{
std::ostringstream stream;
stream << "NextGamePhase. (Current phase is: " << PhaseRing::phaseName(GameObserver::GetInstance()->getCurrentGamePhase())
<< ")";
stream << "NextGamePhase. (Current phase is: " << observer->getCurrentGamePhaseName() << ")";
return stream.str();
}
void NextGamePhase::Render()
{
GameObserver * g = GameObserver::GetInstance();
int nextPhase = (g->getCurrentGamePhase() + 1) % Constants::MTG_PHASE_CLEANUP;
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200];
int playerId = 1;
if (g->currentActionPlayer == GameObserver::GetInstance()->players[1])
if (observer->currentActionPlayer == observer->players[1])
playerId = 2;
sprintf(buffer, "%s %i : -> %s", _("Player").c_str(), playerId, _(PhaseRing::phaseName(nextPhase)).c_str());
sprintf(buffer, "%s %i : -> %s", _("Player").c_str(), playerId, observer->getNextGamePhaseName());
mFont->DrawString(buffer, x + 30, y, JGETEXT_LEFT);
}
NextGamePhase::NextGamePhase(int id) :
Interruptible(id)
NextGamePhase::NextGamePhase(GameObserver* observer, int id) :
Interruptible(observer, id)
{
mHeight = 40;
type = ACTION_NEXTGAMEPHASE;
@@ -172,8 +168,8 @@ void StackAbility::Render()
Interruptible::Render(source, quad.get(), alt1, alt2, action);
}
StackAbility::StackAbility(int id, MTGAbility * _ability) :
Interruptible(id), ability(_ability)
StackAbility::StackAbility(GameObserver* observer, int id, MTGAbility * _ability) :
Interruptible(observer, id), ability(_ability)
{
type = ACTION_ABILITY;
}
@@ -197,8 +193,8 @@ const string StackAbility::getDisplayName() const
/* Spell Cast */
Spell::Spell(MTGCardInstance * _source) :
Interruptible(0)
Spell::Spell(GameObserver* observer, MTGCardInstance * _source) :
Interruptible(observer, 0)
{
source = _source;
mHeight = 40;
@@ -210,8 +206,8 @@ Interruptible(0)
source->castMethod = Constants::NOT_CAST;
}
Spell::Spell(int id, MTGCardInstance * _source, TargetChooser * tc, ManaCost * _cost, int payResult) :
Interruptible(id), tc(tc), cost(_cost), payResult(payResult)
Spell::Spell(GameObserver* observer, int id, MTGCardInstance * _source, TargetChooser * tc, ManaCost * _cost, int payResult) :
Interruptible(observer, id), tc(tc), cost(_cost), payResult(payResult)
{
if (!cost) cost = NEW ManaCost();
source = _source;
@@ -287,7 +283,6 @@ Spell::~Spell()
int Spell::resolve()
{
GameObserver * game = GameObserver::GetInstance();
if (!source->hasType(Subtypes::TYPE_INSTANT) && !source->hasType(Subtypes::TYPE_SORCERY))
{
Player * p = source->controller();
@@ -311,8 +306,8 @@ int Spell::resolve()
}
}
AbilityFactory af;
af.addAbilities(game->mLayers->actionLayer()->getMaxId(), this);
AbilityFactory af(observer);
af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), this);
return 1;
}
@@ -393,8 +388,8 @@ ostream& Spell::toString(ostream& out) const
/* Put a card in graveyard */
PutInGraveyard::PutInGraveyard(int id, MTGCardInstance * _card) :
Interruptible(id)
PutInGraveyard::PutInGraveyard(GameObserver* observer, int id, MTGCardInstance * _card) :
Interruptible(observer, id)
{
card = _card;
removeFromGame = 0;
@@ -403,9 +398,8 @@ Interruptible(id)
int PutInGraveyard::resolve()
{
GameObserver * g = GameObserver::GetInstance();
MTGGameZone * zone = card->getCurrentZone();
if (zone == g->players[0]->game->inPlay || zone == g->players[1]->game->inPlay)
if (zone == observer->players[0]->game->inPlay || zone == observer->players[1]->game->inPlay)
{
card->owner->game->putInZone(card, zone, card->owner->game->graveyard);
return 1;
@@ -447,8 +441,8 @@ ostream& PutInGraveyard::toString(ostream& out) const
}
/* Draw a Card */
DrawAction::DrawAction(int id, Player * _player, int _nbcards) :
Interruptible(id), nbcards(_nbcards), player(_player)
DrawAction::DrawAction(GameObserver* observer, int id, Player * _player, int _nbcards) :
Interruptible(observer, id), nbcards(_nbcards), player(_player)
{
}
@@ -468,7 +462,7 @@ void DrawAction::Render()
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200];
int playerId = 1;
if (player == GameObserver::GetInstance()->players[1])
if (player == observer->players[1])
playerId = 2;
sprintf(buffer, _("Player %i draws %i card").c_str(), playerId, nbcards);
mFont->DrawString(buffer, x + 35, y + GetVerticalTextOffset(), JGETEXT_LEFT);
@@ -480,8 +474,8 @@ ostream& DrawAction::toString(ostream& out) const
return out;
}
//////
LifeAction::LifeAction(int id, Damageable * _target, int amount) :
Interruptible(id), amount(amount),target(_target)
LifeAction::LifeAction(GameObserver* observer, int id, Damageable * _target, int amount) :
Interruptible(observer, id), amount(amount),target(_target)
{
}
@@ -514,16 +508,16 @@ ostream& LifeAction::toString(ostream& out) const
/* The Action Stack itself */
int ActionStack::addPutInGraveyard(MTGCardInstance * card)
{
PutInGraveyard * death = NEW PutInGraveyard(mObjects.size(), card);
PutInGraveyard * death = NEW PutInGraveyard(observer, mObjects.size(), card);
addAction(death);
return 1;
}
int ActionStack::addAbility(MTGAbility * ability)
{
StackAbility * stackAbility = NEW StackAbility(mObjects.size(), ability);
StackAbility * stackAbility = NEW StackAbility(observer, mObjects.size(), ability);
int result = addAction(stackAbility);
if (!game->players[0]->isAI() && ability->source->controller() == game->players[0] && 0
if (!observer->players[0]->isAI() && ability->source->controller() == observer->players[0] && 0
== options[Options::INTERRUPTMYABILITIES].number)
interruptDecision[0] = DONT_INTERRUPT;
return result;
@@ -531,21 +525,21 @@ int ActionStack::addAbility(MTGAbility * ability)
int ActionStack::addDraw(Player * player, int nb_cards)
{
DrawAction * draw = NEW DrawAction(mObjects.size(), player, nb_cards);
DrawAction * draw = NEW DrawAction(observer, mObjects.size(), player, nb_cards);
addAction(draw);
return 1;
}
int ActionStack::addLife(Damageable * _target, int amount)
{
LifeAction * life = NEW LifeAction(mObjects.size(), _target, amount);
LifeAction * life = NEW LifeAction(observer, mObjects.size(), _target, amount);
addAction(life);
return 1;
}
int ActionStack::addDamage(MTGCardInstance * _source, Damageable * _target, int _damage)
{
Damage * damage = NEW Damage(_source, _target, _damage);
Damage * damage = NEW Damage(observer, _source, _target, _damage);
addAction(damage);
_source->thatmuch = _damage;
_target->thatmuch = _damage;
@@ -557,10 +551,9 @@ int ActionStack::AddNextGamePhase()
if (getNext(NULL, NOT_RESOLVED))
return 0;
NextGamePhase * next = NEW NextGamePhase(mObjects.size());
NextGamePhase * next = NEW NextGamePhase(observer, mObjects.size());
addAction(next);
game->currentActionPlayer = game->GetInstance()->currentActionPlayer;
int playerId = (game->currentActionPlayer == game->players[1]) ? 1 : 0;
int playerId = (observer->currentActionPlayer == observer->players[1]) ? 1 : 0;
interruptDecision[playerId] = 1;
return 1;
}
@@ -570,7 +563,7 @@ int ActionStack::AddNextCombatStep()
if (getNext(NULL, NOT_RESOLVED))
return 0;
NextGamePhase * next = NEW NextGamePhase(mObjects.size());
NextGamePhase * next = NEW NextGamePhase(observer, mObjects.size());
addAction(next);
return 1;
}
@@ -586,16 +579,16 @@ int ActionStack::setIsInterrupting(Player * player)
}
// Is it a valid interruption request, or is uninterruptible stuff going on in the game?
if (game->getCurrentTargetChooser())
if (observer->getCurrentTargetChooser())
{
DebugTrace("ActionStack: WARNING - We were asked to interrupt, During Targetchoosing" << endl
<< "source: " << (game->getCurrentTargetChooser()->source ? game->getCurrentTargetChooser()->source->name : "None" ) << endl );
<< "source: " << (observer->getCurrentTargetChooser()->source ? observer->getCurrentTargetChooser()->source->name : "None" ) << endl );
return 0;
}
int playerId = (player == game->players[1]) ? 1 : 0;
int playerId = (player == observer->players[1]) ? 1 : 0;
interruptDecision[playerId] = -1;
game->isInterrupting = player;
observer->isInterrupting = player;
return 1;
}
@@ -606,7 +599,7 @@ int ActionStack::addAction(Interruptible * action)
interruptDecision[i] = 0;
}
Add(action);
lastActionController = game->currentlyActing();
lastActionController = observer->currentlyActing();
DebugTrace("Action added to stack: " << action->getDisplayName());
return 1;
@@ -620,9 +613,9 @@ Spell * ActionStack::addSpell(MTGCardInstance * _source, TargetChooser * tc, Man
{
mana = NULL;
}
Spell * spell = NEW Spell(mObjects.size(), _source, tc, mana, payResult);
Spell * spell = NEW Spell(observer, mObjects.size(), _source, tc, mana, payResult);
addAction(spell);
if (!game->players[0]->isAI() && _source->controller() == game->players[0] && 0 == options[Options::INTERRUPTMYSPELLS].number)
if (!observer->players[0]->isAI() && _source->controller() == observer->players[0] && 0 == options[Options::INTERRUPTMYSPELLS].number)
interruptDecision[0] = DONT_INTERRUPT;
return spell;
}
@@ -637,7 +630,7 @@ Interruptible * ActionStack::getAt(int id)
}
ActionStack::ActionStack(GameObserver* game)
: game(game)
: GuiLayer(game)
{
for (int i = 0; i < 2; i++)
interruptDecision[i] = 0;
@@ -840,9 +833,9 @@ void ActionStack::Update(float dt)
askIfWishesToInterrupt = NULL;
//modal = 0;
GameObserver * game = GameObserver::GetInstance();
TargetChooser * tc = game->getCurrentTargetChooser();
int newState = game->getCurrentGamePhase();
TargetChooser * tc = observer->getCurrentTargetChooser();
int newState = observer->getCurrentGamePhase();
currentState = newState;
if (!tc)
checked = 0;
@@ -894,33 +887,33 @@ void ActionStack::Update(float dt)
{
int currentPlayerId = 0;
int otherPlayerId = 1;
if (game->currentlyActing() != game->players[0])
if (observer->currentlyActing() != observer->players[0])
{
currentPlayerId = 1;
otherPlayerId = 0;
}
if (interruptDecision[currentPlayerId] == NOT_DECIDED)
{
askIfWishesToInterrupt = game->players[currentPlayerId];
game->isInterrupting = game->players[currentPlayerId];
askIfWishesToInterrupt = observer->players[currentPlayerId];
observer->isInterrupting = observer->players[currentPlayerId];
modal = 1;
}
else if (interruptDecision[currentPlayerId] == INTERRUPT)
{
game->isInterrupting = game->players[currentPlayerId];
observer->isInterrupting = observer->players[currentPlayerId];
}
else
{
if (interruptDecision[otherPlayerId] == NOT_DECIDED)
{
askIfWishesToInterrupt = game->players[otherPlayerId];
game->isInterrupting = game->players[otherPlayerId];
askIfWishesToInterrupt = observer->players[otherPlayerId];
observer->isInterrupting = observer->players[otherPlayerId];
modal = 1;
}
else if (interruptDecision[otherPlayerId] == INTERRUPT)
{
game->isInterrupting = game->players[otherPlayerId];
observer->isInterrupting = observer->players[otherPlayerId];
}
else
{
@@ -962,18 +955,18 @@ void ActionStack::Update(float dt)
void ActionStack::cancelInterruptOffer(int cancelMode)
{
int playerId = (game->isInterrupting == game->players[1]) ? 1 : 0;
int playerId = (observer->isInterrupting == observer->players[1]) ? 1 : 0;
interruptDecision[playerId] = cancelMode;
askIfWishesToInterrupt = NULL;
game->isInterrupting = NULL;
observer->isInterrupting = NULL;
timer = -1;
}
void ActionStack::endOfInterruption()
{
int playerId = (game->isInterrupting == game->players[1]) ? 1 : 0;
int playerId = (observer->isInterrupting == observer->players[1]) ? 1 : 0;
interruptDecision[playerId] = 0;
game->isInterrupting = NULL;
observer->isInterrupting = NULL;
}
bool ActionStack::CheckUserInput(JButton key)
@@ -1000,7 +993,7 @@ bool ActionStack::CheckUserInput(JButton key)
}
return true;
}
else if (game->isInterrupting)
else if (observer->isInterrupting)
{
if (JGE_BTN_SEC == key)
{
@@ -1045,7 +1038,7 @@ bool ActionStack::CheckUserInput(JButton key)
{
DebugTrace("ACTIONSTACK CLICKED mCurr = " << mCurr);
game->stackObjectClicked(((Interruptible *) mObjects[mCurr]));
observer->stackObjectClicked(((Interruptible *) mObjects[mCurr]));
return true;
}
return true; //Steal the input to other layers if we're visible
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -225,7 +225,7 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
{
match = NULL;
}
Player * p = controller()->opponent();
Player * p = card->controller()->opponent();//controller()->opponent();
if ((CDopponentDamaged == -1 && card->damageToOpponent && card->controller() == p) || (CDopponentDamaged == 1 && !card->damageToOpponent && card->controller() == p)
|| (CDopponentDamaged == -1 && card->damageToController && card->controller() == p->opponent()) || (CDopponentDamaged == 1 && !card->damageToController && card->controller() == p->opponent()))
{
+5 -5
View File
@@ -7,8 +7,8 @@
#include "MTGGameZones.h"
#include "GameObserver.h"
CardDisplay::CardDisplay() :
mId(0), game(GameObserver::GetInstance())
CardDisplay::CardDisplay(GameObserver* game) :
mId(0), PlayGuiObjectController(game)
{
tc = NULL;
listener = NULL;
@@ -21,7 +21,7 @@ CardDisplay::CardDisplay() :
CardDisplay::CardDisplay(int id, GameObserver* game, int _x, int _y, JGuiListener * _listener, TargetChooser * _tc,
int _nb_displayed_items) :
mId(id), game(game), x(_x), y(_y)
mId(id), PlayGuiObjectController(game), x(_x), y(_y)
{
tc = _tc;
listener = _listener;
@@ -119,7 +119,7 @@ bool CardDisplay::CheckUserInput(JButton key)
}
else
{
if (game) game->ButtonPressed(cardg);
if (observer) observer->ButtonPressed(cardg);
return true;
}
}
@@ -260,7 +260,7 @@ void CardDisplay::Render()
CardGui * cardg = ((CardGui *) mObjects[mCurr]);
Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 1.0, 0.0, 220);
int drawMode = DrawMode::kNormal;
if (game)
if (observer)
{
pos.actY = 150;
if (x < (CardGui::BigWidth / 2)) pos.actX = SCREEN_WIDTH - 10 - CardGui::BigWidth / 2;
+5 -3
View File
@@ -132,7 +132,7 @@ void CardGui::Render()
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
JRenderer * renderer = JRenderer::GetInstance();
GameObserver * game = GameObserver::GetInstance();
GameObserver * game = card->getObserver();
TargetChooser * tc = NULL;
if (game)
@@ -496,9 +496,11 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos)
}
for (int i = Constants::MTG_NB_COLORS - 2; i >= 1; --i)
{
for (int cost = manacost->getCost(i); cost > 0; --cost)
int cost;
for (cost = manacost->getCost(i); cost > 0; --cost)
{
renderer->RenderQuad(manaIcons[i].get(), x + (-12 * j + 75) * pos.actZ, pos.actY + (yOffset) * pos.actZ, 0, 0.4f
renderer->RenderQuad(manaIcons[i].get(), x + (-12 * j + 75) * pos.actZ, pos.actY + (yOffset) * pos.actZ, 0.0f, 0.4f
* pos.actZ, 0.4f * pos.actZ);
++j;
}
+4 -4
View File
@@ -74,8 +74,8 @@ CardSelector::SelectorMemory::SelectorMemory()
x = y = 0;
}
CardSelector::CardSelector(DuelLayers* duel) :
active(NULL), duel(duel), limitor(NULL), bigpos(300, 145, 1.0, 0.0, 220)
CardSelector::CardSelector(GameObserver *observer, DuelLayers* duel) :
CardSelectorBase(observer), active(NULL), duel(duel), limitor(NULL), bigpos(300, 145, 1.0, 0.0, 220)
{
}
@@ -195,11 +195,11 @@ bool CardSelector::CheckUserInput(JButton key)
switch (key)
{
case JGE_BTN_SEC:
GameObserver::GetInstance()->cancelCurrentAction();
observer->cancelCurrentAction();
goto switch_active;
break;
case JGE_BTN_OK:
GameObserver::GetInstance()->ButtonPressed(active);
observer->ButtonPressed(active);
goto switch_active;
break;
case JGE_BTN_LEFT:
+2 -3
View File
@@ -12,11 +12,10 @@ namespace CardSelectorSingleton
{
static CardSelectorBase* sCardSelectorInstance = NULL;
CardSelectorBase* Create(DuelLayers* inDuelLayers)
CardSelectorBase* Create(GameObserver* observer, DuelLayers* inDuelLayers)
{
if (sCardSelectorInstance == NULL)
sCardSelectorInstance = NEW CardSelector(inDuelLayers);
//sCardSelectorInstance = NEW Navigator(inDuelLayers);
sCardSelectorInstance = NEW CardSelector(observer, inDuelLayers);
return sCardSelectorInstance;
}
+3 -3
View File
@@ -73,7 +73,7 @@ Counters::~Counters()
int Counters::addCounter(const char * _name, int _power, int _toughness)
{
/*420.5n If a permanent has both a +1/+1 counter and a -1/-1 counter on it, N +1/+1 and N -1/-1 counters are removed from it, where N is the smaller of the number of +1/+1 and -1/-1 counters on it.*/
GameObserver *g = GameObserver::GetInstance();
GameObserver *g = target->getObserver();
WEvent * e = NEW WEventCounters(this,_name,_power,_toughness);
dynamic_cast<WEventCounters*>(e)->targetCard = this->target;
if (e == g->replacementEffects->replace(e))
@@ -144,14 +144,14 @@ int Counters::removeCounter(const char * _name, int _power, int _toughness)
return 0;
counters[i]->removed();
counters[i]->nb--;
GameObserver *g = GameObserver::GetInstance();
GameObserver *g = target->getObserver();
WEvent * e = NEW WEventCounters(this,_name,_power,_toughness,false,true);
dynamic_cast<WEventCounters*>(e)->targetCard = this->target;
g->receiveEvent(e);
//special case:if a card is suspended and no longer has a time counter when the last is removed, the card is cast.
if (target->suspended && !target->counters->hasCounter("time",0,0))
{
GameObserver * game = game->GetInstance();
GameObserver * game = target->getObserver();
MTGCardInstance * copy = target->controller()->game->putInZone(target, target->currentZone, target->controller()->game->stack);
game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, NULL,1, 0);
+13 -13
View File
@@ -29,6 +29,7 @@ Credits::Credits()
unlocked = -1;
p1 = NULL;
p2 = NULL;
observer = NULL;
}
Credits::~Credits()
@@ -39,15 +40,15 @@ Credits::~Credits()
bonus.clear();
}
void Credits::compute(Player * _p1, Player * _p2, GameApp * _app)
void Credits::compute(GameObserver* g, GameApp * _app)
{
p1 = _p1;
p2 = _p2;
app = _app;
showMsg = (WRand() % 3);
GameObserver * g = GameObserver::GetInstance();
if (!g->turn)
return;
p1 = g->players[0];
p2 = g->players[1];
observer = g;
app = _app;
showMsg = (WRand() % 3);
//no credits when the AI plays :)
if (p1->isAI())
@@ -105,7 +106,7 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app)
GameOptionAward * goa = NULL;
// <Tasks handling>
vector<Task*> finishedTasks;
playerdata->taskList->getDoneTasks(_p1, _p2, _app, &finishedTasks);
playerdata->taskList->getDoneTasks(g, _app, &finishedTasks);
char buffer[512];
@@ -243,7 +244,6 @@ void Credits::Render()
{
if (!p1)
return;
GameObserver * g = GameObserver::GetInstance();
JRenderer * r = JRenderer::GetInstance();
WFont * f = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
WFont * f2 = WResourceManager::Instance()->GetWFont(Fonts::MENU_FONT);
@@ -255,7 +255,7 @@ void Credits::Render()
f3->SetScale(1);
f3->SetColor(ARGB(255,255,255,255));
char buffer[512];
if (!g->turn)
if (!observer->turn)
{
sprintf(buffer, "%s", _("Please check your deck (not enough cards?)").c_str());
}
@@ -263,7 +263,7 @@ void Credits::Render()
{
if (!p1->isAI() && p2->isAI())
{
if (g->gameOver != p1)
if (observer->gameOver != p1)
{
sprintf(buffer, _("Congratulations! You earn %i credits").c_str(), value);
JQuadPtr unlockedQuad = GetUnlockedQuad(unlockedTextureName);
@@ -285,7 +285,7 @@ void Credits::Render()
else
{
int winner = 2;
if (g->gameOver != p1)
if (observer->gameOver != p1)
{
winner = 1;
}
@@ -308,9 +308,9 @@ void Credits::Render()
y += 15;
//!!
if (g->gameOver != p1)
if (observer->gameOver != p1)
{
sprintf(buffer, _("Game length: %i turns (%i seconds)").c_str(), g->turn, this->gameLength);
sprintf(buffer, _("Game length: %i turns (%i seconds)").c_str(), observer->turn, this->gameLength);
f->DrawString(buffer, 10, y);
y += 10;
sprintf(buffer, _("Credits per minute: %i").c_str(), (int) (60 * value / this->gameLength));
+57 -10
View File
@@ -8,12 +8,14 @@
#include "WResourceManager.h"
#include "GameObserver.h"
Damage::Damage(MTGCardInstance * source, Damageable * target)
Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * target)
: Interruptible(observer)
{
init(source, target, source->getPower(), DAMAGE_OTHER);
}
Damage::Damage(MTGCardInstance * source, Damageable * target, int damage, int _typeOfDamage)
Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * target, int damage, int _typeOfDamage)
: Interruptible(observer)
{
init(source, target, damage, _typeOfDamage);
}
@@ -36,16 +38,15 @@ int Damage::resolve()
if (damage < 0)
damage = 0; //Negative damages cannot happen
state = RESOLVED_OK;
GameObserver * g = GameObserver::GetInstance();
WEvent * e = NEW WEventDamage(this);
//Replacement Effects
e = g->replacementEffects->replace(e);
e = observer->replacementEffects->replace(e);
if (!e)
return 0;
WEventDamage * ev = dynamic_cast<WEventDamage*> (e);
if (!ev)
{
g->receiveEvent(e);
observer->receiveEvent(e);
return 0;
}
damage = ev->damage->damage;
@@ -193,13 +194,12 @@ int Damage::resolve()
}
target->lifeLostThisTurn += damage;
WEvent * lifed = NEW WEventLife((Player*)target,-damage);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(lifed);
observer->receiveEvent(lifed);
}
}
//Send (Damage/Replaced effect) event to listeners
g->receiveEvent(e);
observer->receiveEvent(e);
return a;
}
void Damage::Render()
@@ -241,7 +241,8 @@ ostream& Damage::toString(ostream& out) const
return out;
}
DamageStack::DamageStack()
DamageStack::DamageStack(GameObserver *observer)
: GuiLayer(observer), Interruptible(observer)
{
currentState = -1;
type = ACTION_DAMAGES;
@@ -261,7 +262,7 @@ int DamageStack::resolve()
if (damage->state == NOT_RESOLVED)
damage->resolve();
}
GameObserver::GetInstance()->receiveEvent(NEW WEventDamageStackResolved());
((Interruptible*)this)->getObserver()->receiveEvent(NEW WEventDamageStackResolved());
return 1;
}
@@ -300,3 +301,49 @@ ostream& DamageStack::toString(ostream& out) const
{
return (out << "DamageStack ::: currentState : " << currentState);
}
ostream& operator<<(ostream& out, const Damageable& p)
{
return out;
}
istream& operator>>(istream& in, Damageable& p)
{
string s;
streampos pos = in.tellg();
while(std::getline(in, s))
{
size_t limiter = s.find("=");
if (limiter == string::npos) limiter = s.find(":");
string areaS;
if (limiter != string::npos)
{
areaS = s.substr(0, limiter);
if (areaS.compare("life") == 0)
{
p.life = atoi((s.substr(limiter + 1)).c_str());
}
else if (areaS.compare("poisoncount") == 0)
{
p.poisonCount = atoi((s.substr(limiter + 1)).c_str());
}
else if (areaS.compare("damagecount") == 0)
{
p.damageCount = atoi((s.substr(limiter + 1)).c_str());
}
else if (areaS.compare("preventable") == 0)
{
p.preventable = atoi((s.substr(limiter + 1)).c_str());
}
else
{
in.seekg(pos);
break;
}
}
pos = in.tellg();
}
return in;
}
+1 -1
View File
@@ -43,7 +43,7 @@ void DamagerDamaged::addDamage(int damage, DamagerDamaged* source)
return;
}
if (0 < damage)
damages.push_back(Damage(source->card, card, damage, DAMAGE_COMBAT));
damages.push_back(Damage(card->getObserver(), source->card, card, damage, DAMAGE_COMBAT));
return;
}
+32 -35
View File
@@ -13,39 +13,36 @@
#include "Trash.h"
#include "DuelLayers.h"
void DuelLayers::init()
void DuelLayers::init(GameObserver* go)
{
GameObserver* go = GameObserver::GetInstance();
mCardSelector = CardSelectorSingleton::Create(this);
mCardSelector = CardSelectorSingleton::Create(go, this);
//1 Action Layer
action = NEW ActionLayer();
action->Add(NEW MTGGamePhase(action->getMaxId()));
action = NEW ActionLayer(go);
action->Add(NEW MTGGamePhase(go, action->getMaxId()));
//Add Magic Specific Rules
action->Add(NEW MTGEventBonus(-1));
action->Add(NEW MTGPutInPlayRule(-1));
action->Add(NEW MTGKickerRule(-1));
action->Add(NEW MTGAlternativeCostRule(-1));
action->Add(NEW MTGBuyBackRule(-1));
action->Add(NEW MTGFlashBackRule(-1));
action->Add(NEW MTGRetraceRule(-1));
action->Add(NEW MTGSuspendRule(-1));
action->Add(NEW MTGAttackRule(-1));
action->Add(NEW MTGBlockRule(-1));
action->Add(NEW MTGCombatTriggersRule(-1));
action->Add(NEW MTGLegendRule(-1));
action->Add(NEW MTGPlaneWalkerRule(-1));
action->Add(NEW MTGTokensCleanup(-1)); // needs to be before persist
action->Add(NEW MTGPersistRule(-1));
action->Add(NEW MTGVampireRule(-1));
action->Add(NEW MTGUnearthRule(-1));
action->Add(NEW MTGLifelinkRule(-1));
action->Add(NEW MTGDeathtouchRule(-1));
action->Add(NEW OtherAbilitiesEventReceiver(-1));
action->Add(NEW MTGMorphCostRule(-1));
action->Add(NEW MTGEventBonus(go, -1));
action->Add(NEW MTGPutInPlayRule(go, -1));
action->Add(NEW MTGKickerRule(go, -1));
action->Add(NEW MTGAlternativeCostRule(go, -1));
action->Add(NEW MTGBuyBackRule(go, -1));
action->Add(NEW MTGFlashBackRule(go, -1));
action->Add(NEW MTGRetraceRule(go, -1));
action->Add(NEW MTGSuspendRule(go, -1));
action->Add(NEW MTGAttackRule(go, -1));
action->Add(NEW MTGBlockRule(go, -1));
action->Add(NEW MTGCombatTriggersRule(go, -1));
action->Add(NEW MTGLegendRule(go, -1));
action->Add(NEW MTGPlaneWalkerRule(go, -1));
action->Add(NEW MTGTokensCleanup(go, -1)); // needs to be before persist
action->Add(NEW MTGPersistRule(go, -1));
action->Add(NEW MTGVampireRule(go, -1));
action->Add(NEW MTGUnearthRule(go, -1));
action->Add(NEW MTGLifelinkRule(go, -1));
action->Add(NEW MTGDeathtouchRule(go, -1));
action->Add(NEW OtherAbilitiesEventReceiver(go, -1));
action->Add(NEW MTGMorphCostRule(go, -1));
//Other display elements
action->Add(NEW HUDDisplay(-1));
action->Add(NEW HUDDisplay(go, -1));
Add(NEW GuiMana(20, 20, go->players[1]));
Add(NEW GuiMana(440, 20, go->players[0]));
@@ -53,13 +50,13 @@ void DuelLayers::init()
Add(combat = NEW GuiCombat(go));
Add(action);
Add(mCardSelector);
Add(hand = NEW GuiHandSelf(go->players[0]->game->hand));
Add(avatars = NEW GuiAvatars());
Add(NEW GuiHandOpponent(go->players[1]->game->hand));
Add(hand = NEW GuiHandSelf(go, go->players[0]->game->hand));
Add(avatars = NEW GuiAvatars(go));
Add(NEW GuiHandOpponent(go, go->players[1]->game->hand));
Add(NEW GuiPlay(go));
Add(NEW GuiPhaseBar());
Add(NEW GuiFrame());
Add(NEW GuiBackground());
Add(NEW GuiPhaseBar(go));
Add(NEW GuiFrame(go));
Add(NEW GuiBackground(go));
}
void DuelLayers::CheckUserInput(int isAI)
+5 -6
View File
@@ -215,7 +215,7 @@ int DiscardCost::doPay()
if (target)
{
WEvent * e = NEW WEventCardDiscard(target);
GameObserver * game = GameObserver::GetInstance();
GameObserver * game = target->owner->getObserver();
game->receiveEvent(e);
_target->controller()->game->putInGraveyard(_target);
target = NULL;
@@ -503,10 +503,9 @@ ExtraCost("Select unblocked attacker", _tc)
int Ninja::isPaymentSet()
{
GameObserver * g = GameObserver::GetInstance();
int currentPhase = g->getCurrentGamePhase();
if (target && ((target->isAttacker() && target->blocked) || target->isAttacker() < 1 || currentPhase
!= Constants::MTG_PHASE_COMBATBLOCKERS))
if (target && ((target->isAttacker() && target->blocked) ||
target->isAttacker() < 1 ||
target->getObserver()->getCurrentGamePhase() != Constants::MTG_PHASE_COMBATBLOCKERS))
{
tc->removeTarget(target);
target = NULL;
@@ -551,7 +550,7 @@ int SacrificeCost::doPay()
if (target)
{
WEvent * e = NEW WEventCardSacrifice(target);
GameObserver * game = GameObserver::GetInstance();
GameObserver * game = target->owner->getObserver();
game->receiveEvent(e);
target->controller()->game->putInGraveyard(target);
target = NULL;
+44 -39
View File
@@ -11,35 +11,18 @@
#include "MTGGamePhase.h"
#include "GuiPhaseBar.h"
GameObserver * GameObserver::mInstance = NULL;
GameObserver* GameObserver::GetInstance()
GameObserver::GameObserver()
{
return mInstance;
initialize();
}
void GameObserver::EndInstance()
void GameObserver::initialize()
{
SAFE_DELETE(mInstance);
}
void GameObserver::Init(Player * _players[], int _nbplayers)
{
mInstance = NEW GameObserver(_players, _nbplayers);
}
GameObserver::GameObserver(Player * _players[], int _nb_players)
{
for (int i = 0; i < _nb_players; i++)
{
players[i] = _players[i];
}
currentPlayer = NULL;
currentActionPlayer = NULL;
isInterrupting = NULL;
currentPlayerId = 0;
nbPlayers = _nb_players;
nbPlayers = 0;
currentGamePhase = -1;
targetChooser = NULL;
cardWaitingForTargets = NULL;
@@ -52,11 +35,37 @@ GameObserver::GameObserver(Player * _players[], int _nb_players)
connectRule = false;
}
void GameObserver::setPlayers(Player * _players[], int _nbplayers)
{
for (int i = 0; i < _nbplayers; i++)
{
players[i] = _players[i];
players[i]->setObserver(this);
}
nbPlayers = _nbplayers;
}
GameObserver::GameObserver(Player * _players[], int _nb_players)
{
initialize();
setPlayers(_players, _nb_players);
}
int GameObserver::getCurrentGamePhase()
{
return currentGamePhase;
}
const char* GameObserver::getCurrentGamePhaseName()
{
return phaseRing->phaseName(currentGamePhase);
}
const char* GameObserver::getNextGamePhaseName()
{
return phaseRing->phaseName((currentGamePhase + 1) % Constants::MTG_PHASE_CLEANUP);
}
Player * GameObserver::opponent()
{
int index = (currentPlayerId + 1) % nbPlayers;
@@ -130,8 +139,7 @@ void GameObserver::nextGamePhase()
while (currentPlayer->game->hand->nb_cards > currentPlayer->handsize && currentPlayer->nomaxhandsize == false)
{
WEvent * e = NEW WEventCardDiscard(currentPlayer->game->hand->cards[0]);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
receiveEvent(e);
currentPlayer->game->putInGraveyard(currentPlayer->game->hand->cards[0]);
}
mLayers->actionLayer()->Update(0);
@@ -249,19 +257,19 @@ void GameObserver::startGame(Rules * rules)
turn = 0;
mRules = rules;
if (rules)
rules->initPlayers();
rules->initPlayers(this);
options.automaticStyle(players[0], players[1]);
mLayers = NEW DuelLayers();
mLayers->init();
mLayers->init(this);
currentPlayerId = 0;
currentPlayer = players[0];
currentActionPlayer = currentPlayer;
phaseRing = NEW PhaseRing(players, nbPlayers);
phaseRing = NEW PhaseRing(this);
if (rules)
rules->initGame();
rules->initGame(this);
//Preload images from hand
if (!players[0]->isAI())
@@ -298,7 +306,7 @@ void GameObserver::startGame(Rules * rules)
if (card)
{
MTGCardInstance * copy = p->game->putInZone(card, p->game->library, p->game->stack);
Spell * spell = NEW Spell(copy);
Spell * spell = NEW Spell(this, copy);
spell->resolve();
delete spell;
}
@@ -455,7 +463,7 @@ void GameObserver::gameStateBasedEffects()
//////////////////////////
//forceDestroy over ride//
//////////////////////////
if(card->isInPlay())
if(card->isInPlay(this))
{
card->graveEffects = false;
card->exileEffects = false;
@@ -471,7 +479,7 @@ void GameObserver::gameStateBasedEffects()
check = card->childrenCards[wC];
for(size_t wCC = 0; wCC < card->childrenCards.size();wCC++)
{
if(check->isInPlay())
if(check->isInPlay(this))
{
if(check->getName() == card->childrenCards[wCC]->getName() && check != card->childrenCards[wCC])
{
@@ -559,7 +567,7 @@ void GameObserver::gameStateBasedEffects()
c->flanked -= 1;
}
c->fresh = 0;
if(c->wasDealtDamage && c->isInPlay())
if(c->wasDealtDamage && c->isInPlay(this))
c->wasDealtDamage = false;
c->damageToController = false;
c->damageToOpponent = false;
@@ -571,8 +579,7 @@ void GameObserver::gameStateBasedEffects()
if (c->has(Constants::TREASON))
{
WEvent * e = NEW WEventCardSacrifice(c);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
receiveEvent(e);
p->game->putInGraveyard(c);
}
@@ -632,8 +639,7 @@ void GameObserver::gameStateBasedEffects()
}
//Auto skip Phases
GameObserver * game = game->GetInstance();
int skipLevel = (game->currentPlayer->playMode == Player::MODE_TEST_SUITE) ? Constants::ASKIP_NONE
int skipLevel = (currentPlayer->playMode == Player::MODE_TEST_SUITE) ? Constants::ASKIP_NONE
: options[Options::ASPHASES].number;
int nrCreatures = currentPlayer->game->inPlay->countByType("Creature");
@@ -752,7 +758,7 @@ void GameObserver::Affinity()
int reduce = 0;
if(card->has(Constants::AFFINITYGREENCREATURES))
{
TargetChooserFactory tf;
TargetChooserFactory tf(this);
TargetChooser * tc = tf.createTargetChooser("creature[green]",NULL);
reduce = card->controller()->game->battlefield->countByCanTarget(tc);
SAFE_DELETE(tc);
@@ -968,8 +974,7 @@ int GameObserver::cardClick(MTGCardInstance * card, Targetable * object)
&& currentPlayer->game->hand->nb_cards > currentPlayer->handsize && currentPlayer->nomaxhandsize == false)
{
WEvent * e = NEW WEventCardDiscard(currentPlayer->game->hand->cards[0]);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
receiveEvent(e);
currentPlayer->game->putInGraveyard(card);
}
else if (reaction)
@@ -1093,7 +1098,7 @@ int GameObserver::targetListIsSet(MTGCardInstance * card)
{
if (targetChooser == NULL)
{
TargetChooserFactory tcf;
TargetChooserFactory tcf(this);
targetChooser = tcf.createTargetChooser(card);
if (targetChooser == NULL)
{
+19 -20
View File
@@ -210,7 +210,7 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, bool isAI, bool isNetwo
sprintf(deckFile, "%s/deck%i.txt", options.profileFile().c_str(), decknb);
char deckFileSmall[255];
sprintf(deckFileSmall, "player_deck%i", decknb);
mPlayers[playerId] = NEW HumanPlayer(deckFile, deckFileSmall);
mPlayers[playerId] = NEW HumanPlayer(game, deckFile, deckFileSmall);
#ifdef NETWORK_SUPPORT
if(isNetwork)
{
@@ -229,7 +229,7 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, bool isAI, bool isNetwo
AIPlayerFactory playerCreator;
Player * opponent = NULL;
if (playerId == 1) opponent = mPlayers[0];
mPlayers[playerId] = playerCreator.createAIPlayer(MTGCollection(), opponent, decknb);
mPlayers[playerId] = playerCreator.createAIPlayer(game, MTGCollection(), opponent, decknb);
}
}
else
@@ -239,11 +239,11 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, bool isAI, bool isNetwo
if (playerId == 1) opponent = mPlayers[0];
#ifdef AI_CHANGE_TESTING
if (mParent->players[0] == PLAYER_TYPE_CPU_TEST)
mPlayers[playerId] = playerCreator.createAIPlayerTest(MTGCollection(), opponent, playerId == 0 ? "ai/bakaA/" : "ai/bakaB/");
mPlayers[playerId] = playerCreator.createAIPlayerTest(game, MTGCollection(), opponent, playerId == 0 ? "ai/bakaA/" : "ai/bakaB/");
else
#endif
{
mPlayers[playerId] = playerCreator.createAIPlayer(MTGCollection(), opponent);
mPlayers[playerId] = playerCreator.createAIPlayer(game, MTGCollection(), opponent);
}
if (mParent->players[playerId] == PLAYER_TYPE_CPU_TEST)
@@ -264,18 +264,18 @@ void GameStateDuel::loadTestSuitePlayers()
if (!testSuite) return;
initRand(testSuite->seed);
SAFE_DELETE(game);
game = new GameObserver();
for (int i = 0; i < 2; i++)
{
mPlayers[i] = NEW TestSuiteAI(testSuite, i);
mPlayers[i] = new TestSuiteAI(game, testSuite, i);
}
game->setPlayers(mPlayers, 2);
mParent->gameType = testSuite->gameType;
GameObserver::Init(mPlayers, 2);
game = GameObserver::GetInstance();
game->startGame(mParent->rules);
if (mParent->gameType == GAME_TYPE_MOMIR)
{
game->addObserver(NEW MTGMomirRule(-1, MTGCollection()));
game->addObserver(NEW MTGMomirRule(game, -1, MTGCollection()));
}
}
#endif
@@ -296,9 +296,8 @@ void GameStateDuel::End()
else if ( !mPlayers[1] && mPlayers[0] )
// clean up player object
SAFE_DELETE( mPlayers[0] );
GameObserver::EndInstance(); // this will delete both player objects if a game has been played
game = NULL;
SAFE_DELETE(game);
premadeDeck = false;
for (int i = 0; i < 2; i++)
@@ -380,7 +379,7 @@ void GameStateDuel::Update(float dt)
{
loadTestSuitePlayers();
setGamePhase(DUEL_STATE_PLAY);
testSuite->initGame();
testSuite->initGame(game);
}
else
{
@@ -451,20 +450,19 @@ void GameStateDuel::Update(float dt)
case DUEL_STATE_PLAY:
if (!game)
{
GameObserver::Init(mPlayers, 2);
game = GameObserver::GetInstance();
game = new GameObserver(mPlayers, 2);
game->startGame(mParent->rules);
if (mParent->gameType == GAME_TYPE_MOMIR)
{
game->addObserver(NEW MTGMomirRule(-1, MTGCollection()));
game->addObserver(NEW MTGMomirRule(game, -1, MTGCollection()));
}
if (mParent->gameType == GAME_TYPE_STONEHEWER)
{
game->addObserver(NEW MTGStoneHewerRule(-1,MTGCollection()));
game->addObserver(NEW MTGStoneHewerRule(game, -1,MTGCollection()));
}
if (mParent->gameType == GAME_TYPE_HERMIT)
{
game->addObserver(NEW MTGHermitRule(-1));
game->addObserver(NEW MTGHermitRule(game, -1));
}
//start of in game music code
@@ -490,10 +488,10 @@ void GameStateDuel::Update(float dt)
game->Update(dt);
//run a "post update" init call in the rules. This is for things such as Manapool, which gets emptied in the update
// That's mostly because of a legacy bug, where we use the update sequence for some things when we should use events (such as phase changes)
mParent->rules->postUpdateInit();
mParent->rules->postUpdateInit(game);
if (game->gameOver)
{
if (game->players[1]->playMode != Player::MODE_TEST_SUITE) credits->compute(game->players[0], game->players[1], mParent);
if (game->players[1]->playMode != Player::MODE_TEST_SUITE) credits->compute(game, mParent);
setGamePhase(DUEL_STATE_END);
#ifdef TESTSUITE
if (mParent->players[1] == PLAYER_TYPE_TESTSUITE)
@@ -502,11 +500,12 @@ void GameStateDuel::Update(float dt)
{
loadTestSuitePlayers();
setGamePhase(DUEL_STATE_PLAY);
testSuite->initGame();
testSuite->initGame(game);
}
else
else {
setGamePhase(DUEL_STATE_END);
}
}
else
#endif
#ifdef AI_CHANGE_TESTING
+9 -9
View File
@@ -7,24 +7,24 @@
#define LIB_GRAVE_OFFSET 230
GuiAvatars::GuiAvatars() :
active(NULL)
GuiAvatars::GuiAvatars(GameObserver* observer) :
GuiLayer(observer), active(NULL)
{
Add(self = NEW GuiAvatar(SCREEN_WIDTH, SCREEN_HEIGHT, false, GameObserver::GetInstance()->players[0], GuiAvatar::BOTTOM_RIGHT, this));
Add(self = NEW GuiAvatar(SCREEN_WIDTH, SCREEN_HEIGHT, false, observer->players[0], GuiAvatar::BOTTOM_RIGHT, this));
self->zoom = 0.9f;
Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, GameObserver::GetInstance()->players[0], this));
Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, GameObserver::GetInstance()->players[0], this));
Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, observer->players[0], this));
Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, observer->players[0], this));
Add(opponent = NEW GuiAvatar(0, 0, false, GameObserver::GetInstance()->players[1], GuiAvatar::TOP_LEFT, this));
Add(opponent = NEW GuiAvatar(0, 0, false, observer->players[1], GuiAvatar::TOP_LEFT, this));
opponent->zoom = 0.9f;
//opponenthandveiw button
Add(opponentHand = NEW GuiOpponentHand(-30 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10,
false, GameObserver::GetInstance()->players[1], this));
false, observer->players[1], this));
//opponenthandveiwends
Add(opponentGraveyard = NEW GuiGraveyard(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5, false,
GameObserver::GetInstance()->players[1], this));
observer->players[1], this));
Add(opponentLibrary = NEW GuiLibrary(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5 + GuiGameZone::Height + 5, false,
GameObserver::GetInstance()->players[1], this));
observer->players[1], this));
CardSelectorSingleton::Instance()->Add(self);
CardSelectorSingleton::Instance()->Add(selfGraveyard);
+4 -4
View File
@@ -7,7 +7,8 @@
const std::string kBackdropFile = "backdrop.jpg";
GuiBackground::GuiBackground()
GuiBackground::GuiBackground(GameObserver* observer)
: GuiLayer(observer)
{
}
@@ -19,10 +20,9 @@ void GuiBackground::Render()
{
JRenderer* renderer = JRenderer::GetInstance();
JQuadPtr quad;
GameObserver * go = GameObserver::GetInstance();
if (go && go->mRules && go->mRules->bg.size())
if (observer && observer->mRules && observer->mRules->bg.size())
{
quad = WResourceManager::Instance()->RetrieveTempQuad(go->mRules->bg);
quad = WResourceManager::Instance()->RetrieveTempQuad(observer->mRules->bg);
}
if (!quad.get())
{
+22 -22
View File
@@ -34,7 +34,7 @@ struct Right: public Exp
JTexture* GuiCombat::ok_tex = NULL;
GuiCombat::GuiCombat(GameObserver* go) :
GuiLayer(), go(go), active(false), activeAtk(NULL), ok(SCREEN_WIDTH - MARGIN, 210, 1, 0, 255), enemy_avatar(SCREEN_WIDTH
GuiLayer(go), active(false), activeAtk(NULL), ok(SCREEN_WIDTH - MARGIN, 210, 1, 0, 255), enemy_avatar(SCREEN_WIDTH
- MARGIN, TOP_LINE, 2, 0, 255), cursor_pos(NONE), step(DAMAGE)
{
if (NULL == ok_tex)
@@ -104,10 +104,10 @@ void GuiCombat::validateDamage()
switch (step)
{
case FIRST_STRIKE:
go->nextCombatStep();
observer->nextCombatStep();
break;
case DAMAGE:
go->nextGamePhase();
observer->nextGamePhase();
break;
default:
cout << "COMBAT : Cannot validate damage in this phase" << endl;
@@ -172,7 +172,7 @@ bool GuiCombat::clickOK()
return false; // that should not happen
case ORDER:
go->nextGamePhase();
observer->nextGamePhase();
return true;
case FIRST_STRIKE:
return false;
@@ -198,7 +198,7 @@ bool GuiCombat::CheckUserInput(JButton key)
if (BLK == cursor_pos)
{
if (ORDER == step)
go->cardClick(active->card); // { activeAtk->card->raiseBlockerRankOrder(active->card); }
observer->cardClick(active->card); // { activeAtk->card->raiseBlockerRankOrder(active->card); }
else
{
signed damage = activeAtk->card->stepPower(step);
@@ -389,8 +389,8 @@ void GuiCombat::Render()
damage = 0;
if (activeAtk->card->has(Constants::TRAMPLE))
{
go->opponent()->mAvatar->SetHotSpot(18, 25);
enemy_avatar.Render(go->opponent()->mAvatar.get());
observer->opponent()->mAvatar->SetHotSpot(18, 25);
enemy_avatar.Render(observer->opponent()->mAvatar.get());
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
mFont->SetColor(ARGB(255, 255, 64, 0));
{
@@ -417,7 +417,7 @@ void GuiCombat::Render()
int GuiCombat::resolve() // Returns the number of damage objects dealt this turn.
{
DamageStack* stack = NEW DamageStack();
DamageStack* stack = NEW DamageStack(observer);
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
{
MTGCardInstance * attacker = (*it)->card;
@@ -430,15 +430,15 @@ int GuiCombat::resolve() // Returns the number of damage objects dealt this turn
}
if (dmg > 0 && ((!attacker->blocked) || attacker->has(Constants::TRAMPLE)))
stack->Add(NEW Damage((*it)->card, go->opponent(), dmg, DAMAGE_COMBAT));
stack->Add(NEW Damage(observer, (*it)->card, observer->opponent(), dmg, DAMAGE_COMBAT));
for (vector<Damage>::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d)
stack->Add(NEW Damage(*d));
}
int v = stack->mObjects.size();
if (v > 0)
{
go->mLayers->stackLayer()->Add(stack);
go->mLayers->stackLayer()->resolve(); // This will delete the damage stack which will in turn delete the Damage it contains
observer->mLayers->stackLayer()->Add(stack);
observer->mLayers->stackLayer()->resolve(); // This will delete the damage stack which will in turn delete the Damage it contains
}
else
SAFE_DELETE(stack);
@@ -506,7 +506,7 @@ int GuiCombat::receiveEventPlus(WEvent* e)
int GuiCombat::receiveEventMinus(WEvent* e)
{
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e))
if (go->players[0]->game->inPlay == event->from || go->players[1]->game->inPlay == event->from)
if (observer->players[0]->game->inPlay == event->from || observer->players[1]->game->inPlay == event->from)
{
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
if ((*it)->card == event->card->previous || (*it)->card == event->card)
@@ -578,9 +578,9 @@ int GuiCombat::receiveEventMinus(WEvent* e)
{
if (ORDER == step)
return 0; // Why do I take this twice ? >.>
if (!go->currentPlayer->displayStack())
if (!observer->currentPlayer->displayStack())
{
go->nextCombatStep();
observer->nextCombatStep();
return 1;
}
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
@@ -608,7 +608,7 @@ int GuiCombat::receiveEventMinus(WEvent* e)
step = ORDER;
}
else
go->nextGamePhase();
observer->nextGamePhase();
return 1;
}
case FIRST_STRIKE:
@@ -616,22 +616,22 @@ int GuiCombat::receiveEventMinus(WEvent* e)
for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker)
if ((*attacker)->card->has(Constants::FIRSTSTRIKE) || (*attacker)->card->has(Constants::DOUBLESTRIKE))
goto DAMAGE;
go->nextCombatStep();
observer->nextCombatStep();
break;
case END_FIRST_STRIKE:
step = END_FIRST_STRIKE;
for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker)
autoaffectDamage(*attacker, FIRST_STRIKE);
if (0 == resolve())
go->nextCombatStep();
observer->nextCombatStep();
//else go->mLayers->stackLayer()->AddNextGamePhase(); //uncomment to add "interrupt" offer after first strike, rather than giving priority to current player
return 1;
case DAMAGE:
DAMAGE: step = event->step;
if (!go->currentPlayer->displayStack())
if (!observer->currentPlayer->displayStack())
{
((AIPlayer *) go->currentPlayer)->affectCombatDamages(step);
go->nextGamePhase();
((AIPlayer *) observer->currentPlayer)->affectCombatDamages(step);
observer->nextGamePhase();
return 1;
}
for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker)
@@ -656,12 +656,12 @@ int GuiCombat::receiveEventMinus(WEvent* e)
cursor_pos = ATK;
}
else
go->nextCombatStep();
observer->nextCombatStep();
return 1;
case END_DAMAGE:
step = END_DAMAGE;
if (0 == resolve())
go->nextGamePhase();
observer->nextGamePhase();
return 1;
}
return 0;
+2 -1
View File
@@ -3,7 +3,8 @@
#include "GameApp.h"
#include "GuiFrame.h"
GuiFrame::GuiFrame()
GuiFrame::GuiFrame(GameObserver* observer)
: GuiLayer(observer)
{
if (WResourceManager::Instance()->GetTexture("wood.png"))
wood = WResourceManager::Instance()->RetrieveQuad("wood.png", 0, 0, SCREEN_WIDTH, 28);
+6 -6
View File
@@ -32,8 +32,8 @@ HandLimitor::HandLimitor(GuiHand* hand) :
{
}
GuiHand::GuiHand(MTGHand* hand) :
GuiLayer(), hand(hand)
GuiHand::GuiHand(GameObserver* observer, MTGHand* hand) :
GuiLayer(observer), hand(hand)
{
back = WResourceManager::Instance()->RetrieveTempQuad("handback.png");
if (back.get())
@@ -61,8 +61,8 @@ bool GuiHand::isInHand(CardView* card)
return (it != cards.end());
}
GuiHandOpponent::GuiHandOpponent(MTGHand* hand) :
GuiHand(hand)
GuiHandOpponent::GuiHandOpponent(GameObserver* observer, MTGHand* hand) :
GuiHand(observer, hand)
{
}
@@ -81,8 +81,8 @@ void GuiHandOpponent::Render()
}
}
GuiHandSelf::GuiHandSelf(MTGHand* hand) :
GuiHand(hand), state(Closed), backpos(ClosedX, SCREEN_HEIGHT - 250, 1.0, 0, 255)
GuiHandSelf::GuiHandSelf(GameObserver* observer, MTGHand* hand) :
GuiHand(observer, hand), state(Closed), backpos(ClosedX, SCREEN_HEIGHT - 250, 1.0, 0, 255)
{
limitor = NEW HandLimitor(this);
if (OptionHandDirection::HORIZONTAL == options[Options::HANDDIRECTION].number)
+4 -3
View File
@@ -4,7 +4,8 @@
#include "Player.h"
#include "AllAbilities.h"
GuiLayer::GuiLayer()
GuiLayer::GuiLayer(GameObserver *observer)
: observer(observer)
{
modal = 0;
hasFocus = false;
@@ -20,7 +21,7 @@ GuiLayer::~GuiLayer()
void GuiLayer::Add(JGuiObject *object)
{
mObjects.push_back(object);
AbilityFactory af;
AbilityFactory af(observer);
if(MTGAbility * a = dynamic_cast<MTGAbility*>(object))
{
AManaProducer * manaObject = dynamic_cast<AManaProducer*>(af.getCoreAbility((MTGAbility*)object));
@@ -34,7 +35,7 @@ void GuiLayer::Add(JGuiObject *object)
int GuiLayer::Remove(JGuiObject *object)
{
AbilityFactory af;
AbilityFactory af(observer);
if(MTGAbility * a = dynamic_cast<MTGAbility*>(object))
{
AManaProducer * manaObject = dynamic_cast<AManaProducer*>(af.getCoreAbility((MTGAbility*)object));
+1 -1
View File
@@ -226,7 +226,7 @@ void ManaIcon::Drop()
}
GuiMana::GuiMana(float x, float y, Player *p) :
x(x), y(y), owner(p)
GuiLayer(p->getObserver()), x(x), y(y), owner(p)
{
}
+7 -8
View File
@@ -41,8 +41,8 @@ namespace
}
}
GuiPhaseBar::GuiPhaseBar() :
PlayGuiObject(0, 0, 106, 0, false),
GuiPhaseBar::GuiPhaseBar(GameObserver* observer) :
PlayGuiObject(0, 0, 106, 0, false), GuiLayer(observer),
phase(NULL), angle(0.0f), zoomFactor(ICONSCALE)
{
JQuadPtr quad = WResourceManager::Instance()->GetQuad("phasebar");
@@ -96,7 +96,6 @@ bool GuiPhaseBar::Leaving(JButton key)
void GuiPhaseBar::Render()
{
GameObserver * g = GameObserver::GetInstance();
JQuadPtr quad = WResourceManager::Instance()->GetQuad("phasebar");
JRenderer::GetInstance()->DrawLine(0, CENTER, SCREEN_WIDTH, CENTER, ARGB(255, 255, 255, 255));
@@ -133,18 +132,18 @@ void GuiPhaseBar::Render()
WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
string currentP = _("your turn");
string interrupt = "";
if (g->currentPlayer == g->players[1])
if (observer->currentPlayer == observer->players[1])
{
currentP = _("opponent's turn");
}
font->SetColor(ARGB(255, 255, 255, 255));
if (g->currentlyActing() && g->currentlyActing()->isAI())
if (observer->currentlyActing() && observer->currentlyActing()->isAI())
{
font->SetColor(ARGB(255, 128, 128, 128));
}
if (g->currentlyActing() != g->currentPlayer)
if (observer->currentlyActing() != observer->currentPlayer)
{
if (g->currentPlayer == g->players[0])
if (observer->currentPlayer == observer->players[0])
{
interrupt = _(" - ") + _("opponent plays");
}
@@ -155,7 +154,7 @@ void GuiPhaseBar::Render()
}
char buf[64];
sprintf(buf, _("(%s%s) %s").c_str(), currentP.c_str(), interrupt.c_str(), _(PhaseRing::phaseName(phase->id)).c_str());
sprintf(buf, _("(%s%s) %s").c_str(), currentP.c_str(), interrupt.c_str(), observer->phaseRing->phaseName(phase->id));
font->DrawString(buf, SCREEN_WIDTH - 5, 2, JGETEXT_RIGHT);
}
+16 -18
View File
@@ -122,15 +122,13 @@ void GuiPlay::BattleField::reset(float x, float y)
}
void GuiPlay::BattleField::EnstackAttacker(CardView* card)
{
GameObserver* game = GameObserver::GetInstance();
card->x = currentAttacker * (HORZWIDTH - 20) / (attackers + 1);
card->y = baseY + (game->players[0] == card->card->controller() ? 20 + y : -20 - y);
card->y = baseY + (card->card->getObserver()->players[0] == card->card->controller() ? 20 + y : -20 - y);
++currentAttacker;
// JRenderer::GetInstance()->RenderQuad(WResourceManager::Instance()->GetQuad("BattleIcon"), card->actX, card->actY, 0, 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()), 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()));
}
void GuiPlay::BattleField::EnstackBlocker(CardView* card)
{
GameObserver* game = GameObserver::GetInstance();
MTGCardInstance * c = card->card;
if (!c)
return;
@@ -140,7 +138,7 @@ void GuiPlay::BattleField::EnstackBlocker(CardView* card)
offset = c->defenser->getDefenserRank(c);
card->x = c->defenser->view->x + 5 * offset;
}
card->y = baseY + (game->players[0] == card->card->controller() ? 20 + y + 6 * offset : -20 - y + 6 * offset);
card->y = baseY + (card->card->getObserver()->players[0] == card->card->controller() ? 20 + y + 6 * offset : -20 - y + 6 * offset);
}
void GuiPlay::BattleField::Update(float dt)
{
@@ -165,7 +163,7 @@ void GuiPlay::BattleField::Render()
}
GuiPlay::GuiPlay(GameObserver* game) :
game(game)
GuiLayer(game)
{
end_spells = cards.end();
}
@@ -194,7 +192,7 @@ void GuiPlay::Replace()
{
if(!(*it)->card->hasSubtype(Subtypes::TYPE_AURA) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER))
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
++selfSpellsN;
else
++opponentSpellsN;
@@ -208,14 +206,14 @@ void GuiPlay::Replace()
++battleFieldAttackersN;
else if ((*it)->card->isDefenser())
++battleFieldBlockersN;
else if (game->players[0] == (*it)->card->controller())
else if (observer->players[0] == (*it)->card->controller())
++selfCreaturesN;
else
++opponentCreaturesN;
}
else if ((*it)->card->isLand() || (*it)->card->hasType(Subtypes::TYPE_PLANESWALKER))
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
++selfLandsN;
else
++opponentLandsN;
@@ -230,7 +228,7 @@ void GuiPlay::Replace()
{
if(!(*it)->card->hasSubtype(Subtypes::TYPE_AURA) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER))
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
selfSpells.Enstack(*it);
else
opponentSpells.Enstack(*it);
@@ -254,14 +252,14 @@ void GuiPlay::Replace()
battleField.EnstackAttacker(*it);
else if ((*it)->card->isDefenser())
battleField.EnstackBlocker(*it);
else if (game->players[0] == (*it)->card->controller())
else if (observer->players[0] == (*it)->card->controller())
selfCreatures.Enstack(*it);
else
opponentCreatures.Enstack(*it);
}
else if ((*it)->card->isLand())
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
selfLands.Enstack(*it);
else
opponentLands.Enstack(*it);
@@ -273,7 +271,7 @@ void GuiPlay::Replace()
{
if ((*it)->card->hasType(Subtypes::TYPE_PLANESWALKER))
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
selfLands.Enstack(*it);
else
opponentLands.Enstack(*it);
@@ -288,14 +286,14 @@ void GuiPlay::Render()
for (iterator it = cards.begin(); it != cards.end(); ++it)
if ((*it)->card->isLand())
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
selfLands.Render(*it, cards.begin(), end_spells);
else
opponentLands.Render(*it, cards.begin(), end_spells);
}
else if ((*it)->card->isCreature())
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
selfCreatures.Render(*it, cards.begin(), end_spells);
else
opponentCreatures.Render(*it, cards.begin(), end_spells);
@@ -304,7 +302,7 @@ void GuiPlay::Render()
{
if (!(*it)->card->target)
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
selfSpells.Render(*it, cards.begin(), end_spells);
else
opponentSpells.Render(*it, cards.begin(), end_spells);
@@ -314,7 +312,7 @@ void GuiPlay::Render()
{
if (!(*it)->card->target)
{
if (game->players[0] == (*it)->card->controller())
if (observer->players[0] == (*it)->card->controller())
selfPlaneswalker.Render(*it, cards.begin(), end_spells);
else
opponentPlaneswalker.Render(*it, cards.begin(), end_spells);
@@ -333,7 +331,7 @@ int GuiPlay::receiveEventPlus(WEvent * e)
{
if (WEventZoneChange *event = dynamic_cast<WEventZoneChange*>(e))
{
if ((game->players[0]->inPlay() == event->to) || (game->players[1]->inPlay() == event->to))
if ((observer->players[0]->inPlay() == event->to) || (observer->players[1]->inPlay() == event->to))
{
CardView * card;
if (event->card->view)
@@ -413,7 +411,7 @@ int GuiPlay::receiveEventMinus(WEvent * e)
{
if (WEventZoneChange *event = dynamic_cast<WEventZoneChange*>(e))
{
if ((game->players[0]->inPlay() == event->from) || (game->players[1]->inPlay() == event->from))
if ((observer->players[0]->inPlay() == event->from) || (observer->players[1]->inPlay() == event->from))
for (iterator it = cards.begin(); it != cards.end(); ++it)
if (event->card->previous == (*it)->card || event->card == (*it)->card)
{
+5 -6
View File
@@ -28,7 +28,6 @@ GuiAvatar::GuiAvatar(float x, float y, bool hasFocus, Player * player, Corner co
void GuiAvatar::Render()
{
GameObserver * game = GameObserver::GetInstance();
JRenderer * r = JRenderer::GetInstance();
int life = player->life;
int poisonCount = player->poisonCount;
@@ -88,11 +87,11 @@ void GuiAvatar::Render()
avatarRed = 255;
}
if (game->currentPlayer == player)
if (player->getObserver()->currentPlayer == player)
r->DrawRect(x0 - 1, y0 - 1, 36 * actZ, 51 * actZ, ARGB((int)actA, 0, 255, 0));
else if (game->currentActionPlayer == player)
else if (player->getObserver()->currentActionPlayer == player)
r->DrawRect(x0, y0, 34 * actZ, 49 * actZ, ARGB((int)actA, 0, 0, 255));
if (game->isInterrupting == player)
if (player->getObserver()->isInterrupting == player)
r->DrawRect(x0, y0, 34 * actZ, 49 * actZ, ARGB((int)actA, 255, 0, 0));
//Life
@@ -189,7 +188,7 @@ void GuiGameZone::Render()
void GuiGameZone::ButtonPressed(int controllerId, int controlId)
{
GameObserver::GetInstance()->ButtonPressed(this);
zone->owner->getObserver()->ButtonPressed(this);
}
bool GuiGameZone::CheckUserInput(JButton key)
@@ -223,7 +222,7 @@ void GuiGameZone::Update(float dt)
GuiGameZone::GuiGameZone(float x, float y, bool hasFocus, MTGGameZone* zone, GuiAvatars* parent) :
GuiStatic(static_cast<float> (GuiGameZone::Height), x, y, hasFocus, parent), zone(zone)
{
cd = NEW CardDisplay(0, GameObserver::GetInstance(), static_cast<int> (x), static_cast<int> (y), this);
cd = NEW CardDisplay(0, zone->owner->getObserver(), static_cast<int> (x), static_cast<int> (y), this);
cd->zone = zone;
showCards = 0;
}
File diff suppressed because it is too large Load Diff
+32 -47
View File
@@ -22,12 +22,12 @@ MTGCardInstance MTGCardInstance::NoCard = MTGCardInstance();
MTGCardInstance MTGCardInstance::ExtraRules[] = { MTGCardInstance(), MTGCardInstance() };
MTGCardInstance::MTGCardInstance() :
CardPrimitive(), MTGCard(), Damageable(0), view(NULL)
CardPrimitive(), MTGCard(), Damageable(0, 0), view(NULL)
{
initMTGCI();
}
MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to) :
CardPrimitive(card->data), MTGCard(card), Damageable(card->data->getToughness()), view(NULL)
CardPrimitive(card->data), MTGCard(card), Damageable((arg_belongs_to->owner)?arg_belongs_to->owner->getObserver():0, card->data->getToughness()), view(NULL)
{
initMTGCI();
model = card;
@@ -78,10 +78,10 @@ void MTGCardInstance::copy(MTGCardInstance * card)
//Now this is dirty...
int backupid = mtgid;
mtgid = source->getId();
Spell * spell = NEW Spell(this);
AbilityFactory af;
GameObserver * g = GameObserver::GetInstance();
af.addAbilities(g->mLayers->actionLayer()->getMaxId(), spell);
Spell * spell = NEW Spell(observer, this);
observer = card->observer;
AbilityFactory af(observer);
af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), spell);
delete spell;
mtgid = backupid;
}
@@ -220,9 +220,8 @@ void MTGCardInstance::addType(int type)
setName(Subtypes::subtypesList->find(type));
WEvent * e = NEW WEventCardChangeType(this, type, before, true);
GameObserver * go = GameObserver::GetInstance();
if (go)
go->receiveEvent(e);
if (observer)
observer->receiveEvent(e);
else
SAFE_DELETE(e);
}
@@ -264,17 +263,15 @@ int MTGCardInstance::removeType(int id, int removeAll)
setName("");
}
WEvent * e = NEW WEventCardChangeType(this, id, before, after);
GameObserver * go = GameObserver::GetInstance();
if (go)
go->receiveEvent(e);
if (observer)
observer->receiveEvent(e);
else
SAFE_DELETE(e);
return result;
}
int MTGCardInstance::isInPlay()
int MTGCardInstance::isInPlay(GameObserver* game)
{
GameObserver * game = GameObserver::GetInstance();
for (int i = 0; i < 2; i++)
{
MTGGameZone * zone = game->players[i]->game->inPlay;
@@ -291,7 +288,7 @@ int MTGCardInstance::afterDamage()
doDamageTest = 0;
if (!isCreature())
return 0;
if (life <= 0 && isInPlay())
if (life <= 0 && isInPlay(observer))
{
return destroy();
}
@@ -344,16 +341,14 @@ void MTGCardInstance::eventattacked()
{
didattacked = 1;
WEvent * e = NEW WEventCardAttacked(this);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
observer->receiveEvent(e);
}
//sets card as attacked alone and sends events
void MTGCardInstance::eventattackedAlone()
{
WEvent * e = NEW WEventCardAttackedAlone(this);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
observer->receiveEvent(e);
}
//sets card as attacked and sends events
@@ -361,8 +356,7 @@ void MTGCardInstance::eventattackednotblocked()
{
didattacked = 1;
WEvent * e = NEW WEventCardAttackedNotBlocked(this);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
observer->receiveEvent(e);
}
//sets card as attacked and sends events
@@ -370,8 +364,7 @@ void MTGCardInstance::eventattackedblocked(MTGCardInstance * opponent)
{
didattacked = 1;
WEvent * e = NEW WEventCardAttackedBlocked(this,opponent);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
observer->receiveEvent(e);
}
//sets card as blocking and sends events
@@ -379,8 +372,7 @@ void MTGCardInstance::eventblocked(MTGCardInstance * opponent)
{
didblocked = 1;
WEvent * e = NEW WEventCardBlocked(this,opponent);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
observer->receiveEvent(e);
}
//Taps the card
@@ -390,8 +382,7 @@ void MTGCardInstance::tap()
return;
tapped = 1;
WEvent * e = NEW WEventCardTap(this, 0, 1);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
observer->receiveEvent(e);
}
void MTGCardInstance::untap()
@@ -400,8 +391,7 @@ void MTGCardInstance::untap()
return;
tapped = 0;
WEvent * e = NEW WEventCardTap(this, 1, 0);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
observer->receiveEvent(e);
}
void MTGCardInstance::setUntapping()
@@ -471,8 +461,7 @@ int MTGCardInstance::initAttackersDefensers()
int MTGCardInstance::cleanup()
{
initAttackersDefensers();
GameObserver * game = GameObserver::GetInstance();
if (!game || game->currentPlayer == controller())
if (!observer || observer->currentPlayer == controller())
{
summoningSickness = 0;
}
@@ -489,11 +478,11 @@ int MTGCardInstance::cleanup()
int MTGCardInstance::stillInUse()
{
GameObserver * game = GameObserver::GetInstance();
if (game->mLayers->actionLayer()->stillInUse(this))
if (observer->mLayers->actionLayer()->stillInUse(this))
return 1;
if (!previous)
return 0;
return previous->stillInUse();
}
@@ -540,7 +529,7 @@ int MTGCardInstance::canAttack()
return 0;
if (!isCreature())
return 0;
if (!isInPlay())
if (!isInPlay(observer))
return 0;
return 1;
}
@@ -569,7 +558,7 @@ int MTGCardInstance::canBlock()
return 0;
if (!isCreature())
return 0;
if (!isInPlay())
if (!isInPlay(observer))
return 0;
return 1;
}
@@ -717,9 +706,8 @@ int MTGCardInstance::setAttacker(int value)
previousTarget = p;
attacker = value;
WEvent * e = NEW WEventCreatureAttacker(this, previousTarget, target);
GameObserver * go = GameObserver::GetInstance();
if (go)
go->receiveEvent(e);
if (observer)
observer->receiveEvent(e);
else
SAFE_DELETE(e);
return 1;
@@ -775,9 +763,8 @@ int MTGCardInstance::raiseBlockerRankOrder(MTGCardInstance * blocker)
std::iter_swap(it1, it2);
WEvent* e = NEW WEventCreatureBlockerRank(*it1, *it2, this);
GameObserver * go = GameObserver::GetInstance();
if (go)
go->receiveEvent(e);
if (observer)
observer->receiveEvent(e);
else
SAFE_DELETE(e);
//delete(e);
@@ -817,13 +804,12 @@ int MTGCardInstance::addBlocker(MTGCardInstance * blocker)
//Returns opponents to this card for this turn. This * should * take into account banding
MTGCardInstance * MTGCardInstance::getNextOpponent(MTGCardInstance * previous)
{
GameObserver * game = GameObserver::GetInstance();
int foundprevious = 0;
if (!previous)
foundprevious = 1;
if (attacker)
{
MTGInPlay * inPlay = game->opponent()->game->inPlay;
MTGInPlay * inPlay = observer->opponent()->game->inPlay;
for (int i = 0; i < inPlay->nb_cards; i++)
{
MTGCardInstance * current = inPlay->cards[i];
@@ -843,7 +829,7 @@ MTGCardInstance * MTGCardInstance::getNextOpponent(MTGCardInstance * previous)
}
else if (defenser)
{
MTGInPlay * inPlay = game->currentPlayer->game->inPlay;
MTGInPlay * inPlay = observer->currentPlayer->game->inPlay;
for (int i = 0; i < inPlay->nb_cards; i++)
{
MTGCardInstance * current = inPlay->cards[i];
@@ -865,10 +851,9 @@ MTGCardInstance * MTGCardInstance::getNextOpponent(MTGCardInstance * previous)
int MTGCardInstance::setDefenser(MTGCardInstance * opponent)
{
GameObserver * g = GameObserver::GetInstance();
if (defenser)
{
if (g->players[0]->game->battlefield->hasCard(defenser) || g->players[1]->game->battlefield->hasCard(defenser))
if (observer->players[0]->game->battlefield->hasCard(defenser) || observer->players[1]->game->battlefield->hasCard(defenser))
{
defenser->removeBlocker(this);
}
@@ -880,7 +865,7 @@ int MTGCardInstance::setDefenser(MTGCardInstance * opponent)
if (defenser)
defenser->addBlocker(this);
if (e)
g->receiveEvent(e);
observer->receiveEvent(e);
return 1;
}
+5 -6
View File
@@ -5,8 +5,8 @@
MTGGamePhase* MTGGamePhase::instance = 0;
MTGGamePhase::MTGGamePhase(int id) :
ActionElement(id)
MTGGamePhase::MTGGamePhase(GameObserver* g, int id) :
ActionElement(id), observer(g)
{
animation = 0;
currentState = -1;
@@ -18,7 +18,7 @@ MTGGamePhase::MTGGamePhase(int id) :
void MTGGamePhase::Update(float dt)
{
int newState = GameObserver::GetInstance()->getCurrentGamePhase();
int newState = observer->getCurrentGamePhase();
if (newState != currentState)
{
activeState = ACTIVE;
@@ -41,13 +41,12 @@ void MTGGamePhase::Update(float dt)
bool MTGGamePhase::NextGamePhase()
{
GameObserver * game = GameObserver::GetInstance();
if (activeState == INACTIVE)
{
if (game->currentActionPlayer == game->currentlyActing())
if (observer->currentActionPlayer == observer->currentlyActing())
{
activeState = ACTIVE;
game->userRequestNextGamePhase();
observer->userRequestNextGamePhase();
return true;
}
}
+112 -24
View File
@@ -7,6 +7,9 @@
#include "MTGDeck.h"
#include "Subtypes.h"
#include "Rules.h"
#include "Token.h"
#if defined (WIN32) || defined (LINUX)
#include <time.h>
#endif
@@ -15,14 +18,17 @@
//------------------------------
MTGPlayerCards::MTGPlayerCards()
: owner(0)
{
init();
}
MTGPlayerCards::MTGPlayerCards(int * idList, int idListSize)
MTGPlayerCards::MTGPlayerCards(Player* player, int * idList, int idListSize)
: owner(player)
{
init();
int i;
for (i = 0; i < idListSize; i++)
{
MTGCard * card = MTGCollection()->getCardById(idList[i]);
@@ -35,6 +41,7 @@ MTGPlayerCards::MTGPlayerCards(int * idList, int idListSize)
}
MTGPlayerCards::MTGPlayerCards(MTGDeck * deck)
: owner(0)
{
init();
initDeck(deck);
@@ -116,7 +123,7 @@ void MTGPlayerCards::initGame(int shuffle, int draw)
void MTGPlayerCards::OptimizedHand(Player * who,int amount, int lands, int creatures, int othercards)
{
//give the Ai hand adventage to insure a challanging match.
GameObserver * game = game->GetInstance();
GameObserver * game = who->getObserver();
game->currentPlayerId = game->currentPlayerId;
game->currentPlayer = game->currentPlayer;
@@ -231,7 +238,7 @@ void MTGPlayerCards::drawFromLibrary()
}
if (cantlosers < 1)
{
GameObserver::GetInstance()->gameOver = library->owner;
library->owner->getObserver()->gameOver = library->owner;
}
return;
}
@@ -315,7 +322,7 @@ MTGCardInstance * MTGPlayerCards::putInHand(MTGCardInstance * card)
MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone * from, MTGGameZone * to)
{
MTGCardInstance * copy = NULL;
GameObserver *g = GameObserver::GetInstance();
GameObserver *g = owner->getObserver();
if (!from || !to)
return card; //Error check
@@ -387,7 +394,7 @@ void MTGPlayerCards::discardRandom(MTGGameZone * from, MTGCardInstance * source)
return;
int r = WRand() % (from->nb_cards);
WEvent * e = NEW WEventCardDiscard(from->cards[r]);
GameObserver * game = GameObserver::GetInstance();
GameObserver * game = owner->getObserver();
game->receiveEvent(e);
putInZone(from->cards[r], from, graveyard);
}
@@ -419,7 +426,7 @@ MTGGameZone::MTGGameZone() :
MTGGameZone::~MTGGameZone()
{
for (int i = 0; i < nb_cards; i++)
for (int i = 0; i < cards.size(); i++)
{
SAFE_DELETE( cards[i] );
}
@@ -439,6 +446,7 @@ void MTGGameZone::setOwner(Player * player)
{
cards[i]->owner = player;
cards[i]->lastController = player;
cards[i]->setObserver(player->getObserver());
}
owner = player;
}
@@ -647,7 +655,7 @@ int MTGGameZone::seenThisTurn(TargetChooser * tc, int castMethod)
int MTGGameZone::seenThisTurn(string targetChooserDefinition, int castMethod)
{
TargetChooserFactory tcf;
TargetChooserFactory tcf(owner->getObserver());
TargetChooser *tc = tcf.createTargetChooser(targetChooserDefinition, NULL);
int result = seenThisTurn(tc, castMethod);
delete(tc);
@@ -828,10 +836,10 @@ MTGGameZone * MTGGameZone::intToZone(int zoneId, Player * p, Player * p2)
}
}
MTGGameZone * MTGGameZone::intToZone(int zoneId, MTGCardInstance * source, MTGCardInstance * target)
MTGGameZone * MTGGameZone::intToZone(GameObserver *g, int zoneId, MTGCardInstance * source, MTGCardInstance * target)
{
Player *p, *p2;
GameObserver * g = GameObserver::GetInstance();
if (!source)
p = g->currentlyActing();
else
@@ -956,9 +964,9 @@ int MTGGameZone::zoneStringToId(string zoneName)
return 0;
}
MTGGameZone * MTGGameZone::stringToZone(string zoneName, MTGCardInstance * source, MTGCardInstance * target)
MTGGameZone * MTGGameZone::stringToZone(GameObserver *g, string zoneName, MTGCardInstance * source, MTGCardInstance * target)
{
return intToZone(zoneStringToId(zoneName), source, target);
return intToZone(g, zoneStringToId(zoneName), source, target);
}
ostream& MTGGameZone::toString(ostream& out) const
@@ -993,6 +1001,7 @@ ostream& operator<<(ostream& out, const MTGGameZone& z)
{
return z.toString(out);
}
ostream& operator<<(ostream& out, const MTGPlayerCards& z)
{
out << z.library->nb_cards << " ";
@@ -1002,28 +1011,107 @@ ostream& operator<<(ostream& out, const MTGPlayerCards& z)
return out;
}
istream& operator>>(istream& in, MTGPlayerCards& z)
istream& operator>>(istream& in, MTGGameZone& z)
{
int nb, mtgid;
in >> nb;
for (int i = 0; i < z.library->nb_cards; i++)
for (int i = 0; i < z.nb_cards; i++)
{
SAFE_DELETE( z.library->cards[i] );
SAFE_DELETE( z.cards[i] );
}
z.library->cards.clear();
z.library->cardsMap.clear();
z.cards.clear();
z.cardsMap.clear();
for (int i = 0; i < nb; i++)
string s;
while(std::getline(in, s))
{
in >> mtgid;
MTGCard * card = MTGCollection()->getCardById(mtgid);
while(s.size())
{
size_t limiter = s.find(",");
MTGCard * card = 0;
string toFind;
if (limiter != string::npos)
{
toFind = trim(s.substr(0, limiter));
s = s.substr(limiter + 1);
}
else
{
toFind = trim(s);
s = "";
}
card = MTGCollection()->getCardByName(toFind);
int id = Rules::getMTGId(toFind);
if (card)
{
MTGCardInstance * newCard = NEW MTGCardInstance(card, &z);
z.library->addCard(newCard);
/* For the moment we add the card directly in the final zone.
This is not the normal way and this prevents to resolve spells.
We'll need a fusion operation afterward to cast relevant spells */
MTGCardInstance * newCard = NEW MTGCardInstance(card, z.owner->game);
z.addCard(newCard);
}
else
{
if(toFind == "*")
z.nb_cards++;
else if ( id < 0 )
{
// For the moment, we create a dummy Token to please the testsuite
Token* myToken = new Token(id);
z.addCard(myToken);
}
else
{
DebugTrace("Card unfound " << toFind << " " << id);
}
}
}
}
return in;
}
istream& operator>>(istream& in, MTGPlayerCards& z)
{
string s;
streampos pos = in.tellg();
while(std::getline(in, s))
{
size_t limiter = s.find("=");
if (limiter == string::npos) limiter = s.find(":");
string areaS;
if (limiter != string::npos)
{
areaS = s.substr(0, limiter);
if (areaS.compare("graveyard") == 0)
{
istringstream stream(s.substr(limiter+1));
stream >> (*z.graveyard);
}
else if (areaS.compare("library") == 0)
{
istringstream stream(s.substr(limiter+1));
stream >> (*z.library);
}
else if (areaS.compare("hand") == 0)
{
istringstream stream(s.substr(limiter+1));
stream >> (*z.hand);
}
else if (areaS.compare("inplay") == 0 || areaS.compare("battlefield") == 0)
{
istringstream stream(s.substr(limiter+1));
stream >> (*z.battlefield);
}
else
{
in.seekg(pos);
break;
}
}
pos = in.tellg();
}
return in;
}
+65 -67
View File
@@ -7,8 +7,8 @@
#include "Credits.h"
#include "AllAbilities.h"
MTGEventBonus::MTGEventBonus(int _id) :
MTGAbility(_id,NULL)
MTGEventBonus::MTGEventBonus(GameObserver* observer, int _id) :
MTGAbility(observer, _id,NULL)
{
textAlpha = 0;
text = "";
@@ -277,8 +277,8 @@ MTGEventBonus * MTGEventBonus::clone() const
}
//
MTGPutInPlayRule::MTGPutInPlayRule(int _id) :
MTGAbility(_id, NULL)
MTGPutInPlayRule::MTGPutInPlayRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
aType = MTGAbility::PUT_INTO_PLAY;
}
@@ -300,7 +300,7 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
if (card->basicAbilities[(int)Constants::LEYLINE])
{
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp);
Spell * spell = NEW Spell(copy);
Spell * spell = NEW Spell(game, copy);
spell->resolve();
delete spell;
}
@@ -421,7 +421,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card)
if (card->isLand())
{
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp);
Spell * spell = NEW Spell(0,copy,NULL,NULL, payResult);
Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, payResult);
spell->resolve();
delete spellCost;
delete spell;
@@ -478,8 +478,8 @@ MTGPutInPlayRule * MTGPutInPlayRule::clone() const
//kicker
MTGKickerRule::MTGKickerRule(int _id) :
MTGPutInPlayRule(_id)
MTGKickerRule::MTGKickerRule(GameObserver* observer, int _id) :
MTGPutInPlayRule(observer, _id)
{
aType = MTGAbility::PUT_INTO_PLAY_WITH_KICKER;
}
@@ -559,7 +559,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
if (card->isLand())
{
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp);
Spell * spell = NEW Spell(0,copy,NULL,NULL, ManaCost::MANA_PAID_WITH_KICKER);
Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, ManaCost::MANA_PAID_WITH_KICKER);
spell->resolve();
delete spellCost;
delete spell;
@@ -624,8 +624,8 @@ MTGKickerRule * MTGKickerRule::clone() const
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
MTGAlternativeCostRule::MTGAlternativeCostRule(int _id) :
MTGAbility(_id, NULL)
MTGAlternativeCostRule::MTGAlternativeCostRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
aType = MTGAbility::ALTERNATIVE_COST;
}
@@ -723,7 +723,7 @@ int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card, ManaCost *alter
if (card->isLand())
{
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp);
Spell * spell = NEW Spell(0,copy,NULL,NULL, alternateCostType);
Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, alternateCostType);
copy->alternateCostPaid[alternateCostType] = 1;
spell->resolve();
SAFE_DELETE(spell);
@@ -781,8 +781,8 @@ MTGAlternativeCostRule * MTGAlternativeCostRule::clone() const
//-------------------------------------------------------------------------
//buyback follows its own resolving rules
MTGBuyBackRule::MTGBuyBackRule(int _id) :
MTGAlternativeCostRule(_id)
MTGBuyBackRule::MTGBuyBackRule(GameObserver* observer, int _id) :
MTGAlternativeCostRule(observer, _id)
{
aType = MTGAbility::BUYBACK_COST;
}
@@ -832,8 +832,8 @@ MTGBuyBackRule * MTGBuyBackRule::clone() const
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//flashback follows its own resolving rules
MTGFlashBackRule::MTGFlashBackRule(int _id) :
MTGAlternativeCostRule(_id)
MTGFlashBackRule::MTGFlashBackRule(GameObserver* observer, int _id) :
MTGAlternativeCostRule(observer, _id)
{
aType = MTGAbility::FLASHBACK_COST;
}
@@ -880,8 +880,8 @@ MTGFlashBackRule * MTGFlashBackRule::clone() const
//-------------------------------------------------------------------------
//retrace
MTGRetraceRule::MTGRetraceRule(int _id) :
MTGAlternativeCostRule(_id)
MTGRetraceRule::MTGRetraceRule(GameObserver* observer, int _id) :
MTGAlternativeCostRule(observer, _id)
{
aType = MTGAbility::RETRACE_COST;
}
@@ -934,8 +934,8 @@ MTGRetraceRule * MTGRetraceRule::clone() const
//-------------------------------------------------------------------------
//Suspend
MTGSuspendRule::MTGSuspendRule(int _id) :
MTGAlternativeCostRule(_id)
MTGSuspendRule::MTGSuspendRule(GameObserver* observer, int _id) :
MTGAlternativeCostRule(observer, _id)
{
aType = MTGAbility::SUSPEND_COST;
}
@@ -1051,8 +1051,8 @@ MTGSuspendRule * MTGSuspendRule::clone() const
//-------------------------------------------------------------------------
MTGMorphCostRule::MTGMorphCostRule(int _id) :
MTGAbility(_id, NULL)
MTGMorphCostRule::MTGMorphCostRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
aType = MTGAbility::MORPH_COST;
}
@@ -1195,8 +1195,8 @@ bool MTGAttackRule::greyout(Target* t)
return true;
}
MTGAttackRule::MTGAttackRule(int _id) :
MTGAbility(_id, NULL)
MTGAttackRule::MTGAttackRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
aType = MTGAbility::MTG_ATTACK_RULE;
}
@@ -1276,8 +1276,8 @@ MTGAttackRule * MTGAttackRule::clone() const
}
//this rules handles returning cards to combat triggers for activations.
MTGCombatTriggersRule::MTGCombatTriggersRule(int _id) :
MTGAbility(_id, NULL)
MTGCombatTriggersRule::MTGCombatTriggersRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
aType = MTGAbility::MTG_COMBATTRIGGERS_RULE;
}
@@ -1394,8 +1394,8 @@ MTGCombatTriggersRule * MTGCombatTriggersRule::clone() const
}
///------------
OtherAbilitiesEventReceiver::OtherAbilitiesEventReceiver(int _id) :
MTGAbility(_id, NULL)
OtherAbilitiesEventReceiver::OtherAbilitiesEventReceiver(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
@@ -1405,14 +1405,13 @@ int OtherAbilitiesEventReceiver::receiveEvent(WEvent *e)
{
if (event->to && (event->to != event->from))
{
GameObserver * g = GameObserver::GetInstance();
for (int i = 0; i < 2; ++i)
{
if (event->to == g->players[i]->game->inPlay)
if (event->to == game->players[i]->game->inPlay)
return 0;
}
AbilityFactory af;
af.magicText(g->mLayers->actionLayer()->getMaxId(), NULL, event->card, 1, 0, event->to);
AbilityFactory af(game);
af.magicText(game->mLayers->actionLayer()->getMaxId(), NULL, event->card, 1, 0, event->to);
return 1;
}
}
@@ -1429,8 +1428,8 @@ OtherAbilitiesEventReceiver * OtherAbilitiesEventReceiver::clone() const
return NEW OtherAbilitiesEventReceiver(*this);
}
MTGBlockRule::MTGBlockRule(int _id) :
MTGAbility(_id, NULL)
MTGBlockRule::MTGBlockRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
aType = MTGAbility::MTG_BLOCK_RULE;
}
@@ -1494,8 +1493,8 @@ MTGBlockRule * MTGBlockRule::clone() const
int MTGMomirRule::initialized = 0;
vector<int> MTGMomirRule::pool[20];
MTGMomirRule::MTGMomirRule(int _id, MTGAllCards * _collection) :
MTGAbility(_id, NULL)
MTGMomirRule::MTGMomirRule(GameObserver* observer, int _id, MTGAllCards * _collection) :
MTGAbility(observer, _id, NULL)
{
collection = _collection;
if (!initialized)
@@ -1558,7 +1557,7 @@ int MTGMomirRule::reactToClick(MTGCardInstance * card_to_discard, int cardId)
player->game->putInZone(card_to_discard, player->game->hand, player->game->graveyard);
player->game->stack->addCard(card);
Spell * spell = NEW Spell(card);
Spell * spell = NEW Spell(game, card);
spell->resolve();
spell->source->isToken = 1;
delete spell;
@@ -1649,8 +1648,8 @@ MTGMomirRule * MTGMomirRule::clone() const
int MTGStoneHewerRule::initialized = 0;
vector<int> MTGStoneHewerRule::pool[20];
MTGStoneHewerRule::MTGStoneHewerRule(int _id, MTGAllCards * _collection) :
MTGAbility(_id, NULL)
MTGStoneHewerRule::MTGStoneHewerRule(GameObserver* observer, int _id, MTGAllCards * _collection) :
MTGAbility(observer, _id, NULL)
{
collection = _collection;
if (!initialized)
@@ -1682,13 +1681,12 @@ int MTGStoneHewerRule::receiveEvent(WEvent * event)
if(card)
{
game->currentlyActing()->game->temp->addCard(card);
Spell * spell = NEW Spell(card);
Spell * spell = NEW Spell(game, card);
spell->resolve();
spell->source->isToken = 1;
GameObserver * g = g->GetInstance();
for (size_t i = 1; i < g->mLayers->actionLayer()->mObjects.size(); i++)
for (size_t i = 1; i < game->mLayers->actionLayer()->mObjects.size(); i++)
{
MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->mObjects[i]);
MTGAbility * a = ((MTGAbility *) game->mLayers->actionLayer()->mObjects[i]);
AEquip * eq = dynamic_cast<AEquip*> (a);
if (eq && eq->source == spell->source)
{
@@ -1750,8 +1748,8 @@ MTGStoneHewerRule * MTGStoneHewerRule::clone() const
//------------------
//Hermit druid mode places a random land from your deck into play during each of your upkeeps
MTGHermitRule::MTGHermitRule(int _id) :
MTGAbility(_id, NULL)
MTGHermitRule::MTGHermitRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
@@ -1773,7 +1771,7 @@ int MTGHermitRule::receiveEvent(WEvent * event)
if(lcard)
{
MTGCardInstance * copy = game->currentPlayer->game->putInZone(lcard,game->currentPlayer->game->library, game->currentPlayer->game->temp);
Spell * spell = NEW Spell(copy);
Spell * spell = NEW Spell(game, copy);
spell->resolve();
delete spell;
}
@@ -1887,8 +1885,8 @@ void HUDDisplay::Render()
i++;
}
}
HUDDisplay::HUDDisplay(int _id) :
MTGAbility(_id, NULL)
HUDDisplay::HUDDisplay(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
timestamp = 0;
popdelay = 2;
@@ -1913,8 +1911,8 @@ HUDDisplay * HUDDisplay::clone() const
}
/* Persist */
MTGPersistRule::MTGPersistRule(int _id) :
MTGAbility(_id, NULL)
MTGPersistRule::MTGPersistRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
;
@@ -1947,7 +1945,7 @@ int MTGPersistRule::receiveEvent(WEvent * event)
DebugTrace("MTGRULES: couldn't move card for persist");
return 0;
}
Spell * spell = NEW Spell(copy);
Spell * spell = NEW Spell(game, copy);
spell->resolve();
spell->source->counters->addCounter(-1, -1);
delete spell;
@@ -1976,8 +1974,8 @@ MTGPersistRule * MTGPersistRule::clone() const
//vampires rule
//handled seperately as a rule since we only want one object to send out events that a card was "vampired".
//otherwise vampire event is sent per instance of @vampired on the battlefield, multipling the results.
MTGVampireRule::MTGVampireRule(int _id) :
MTGAbility(_id, NULL)
MTGVampireRule::MTGVampireRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
;
@@ -2051,8 +2049,8 @@ MTGVampireRule * MTGVampireRule::clone() const
/////////////////////////////////////////////////
//unearth rule----------------------------------
//if the card leaves play, exile it instead.
MTGUnearthRule::MTGUnearthRule(int _id) :
MTGAbility(_id, NULL)
MTGUnearthRule::MTGUnearthRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
;
@@ -2111,8 +2109,8 @@ MTGUnearthRule * MTGUnearthRule::clone() const
return NEW MTGUnearthRule(*this);
}
//token clean up
MTGTokensCleanup::MTGTokensCleanup(int _id) :
MTGAbility(_id, NULL)
MTGTokensCleanup::MTGTokensCleanup(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
@@ -2144,8 +2142,8 @@ MTGTokensCleanup * MTGTokensCleanup::clone() const
}
/* Legend Rule */
MTGLegendRule::MTGLegendRule(int _id) :
ListMaintainerAbility(_id)
MTGLegendRule::MTGLegendRule(GameObserver* observer, int _id) :
ListMaintainerAbility(observer, _id)
{
}
;
@@ -2201,8 +2199,8 @@ MTGLegendRule * MTGLegendRule::clone() const
}
/* PlaneWalker Rule */
MTGPlaneWalkerRule::MTGPlaneWalkerRule(int _id) :
ListMaintainerAbility(_id)
MTGPlaneWalkerRule::MTGPlaneWalkerRule(GameObserver* observer, int _id) :
ListMaintainerAbility(observer, _id)
{
}
;
@@ -2258,8 +2256,8 @@ MTGPlaneWalkerRule * MTGPlaneWalkerRule::clone() const
}
/* Lifelink */
MTGLifelinkRule::MTGLifelinkRule(int _id) :
MTGAbility(_id, NULL)
MTGLifelinkRule::MTGLifelinkRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
;
@@ -2296,8 +2294,8 @@ MTGLifelinkRule * MTGLifelinkRule::clone() const
}
/* Deathtouch */
MTGDeathtouchRule::MTGDeathtouchRule(int _id) :
MTGAbility(_id, NULL)
MTGDeathtouchRule::MTGDeathtouchRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
;
@@ -2340,8 +2338,8 @@ MTGDeathtouchRule * MTGDeathtouchRule::clone() const
}
//
//kai mod
ParentChildRule::ParentChildRule(int _id) :
MTGAbility(_id, NULL)
ParentChildRule::ParentChildRule(GameObserver* observer, int _id) :
MTGAbility(observer, _id, NULL)
{
}
;
+11 -9
View File
@@ -16,6 +16,7 @@ SUPPORT_OBJECT_ANALYTICS(ManaCost)
ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstance * c)
{
ManaCost * manaCost;
GameObserver* g = c?c->getObserver():NULL;
if (_manaCost)
{
manaCost = _manaCost;
@@ -75,9 +76,8 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan
}
else
{
//Parse target for extraCosts
TargetChooserFactory tcf;
TargetChooserFactory tcf(g);
TargetChooser * tc = NULL;
size_t target_start = value.find("(");
size_t target_end = value.find(")");
@@ -143,10 +143,12 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan
manaCost->addExtraCost(NEW MillCost(tc));
break;
case 'n': //return unblocked attacker cost
TargetChooserFactory tcf;
{
TargetChooserFactory tcf(g);
tc = tcf.createTargetChooser("creature|myBattlefield", c);
manaCost->addExtraCost(NEW Ninja(tc));
break;
}
case 'p' :
{
SAFE_DELETE(tc);
@@ -165,7 +167,7 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan
{
size_t counter_start = value.find("(");
size_t counter_end = value.find(")", counter_start);
AbilityFactory abf;
AbilityFactory abf(g);
string counterString = value.substr(counter_start + 1, counter_end - counter_start - 1);
Counter * counter = abf.parseCounter(counterString, c);
size_t separator = value.find(",", counter_start);
@@ -786,7 +788,7 @@ void ManaPool::init()
{
ManaCost::init();
WEvent * e = NEW WEventEmptyManaPool(this);
GameObserver::GetInstance()->receiveEvent(e);
player->getObserver()->receiveEvent(e);
}
ManaPool::ManaPool(Player * player) :
@@ -805,7 +807,7 @@ int ManaPool::remove(int color, int value)
for (int i = 0; i < value; ++i)
{
WEvent * e = NEW WEventConsumeMana(color, this);
GameObserver::GetInstance()->receiveEvent(e);
player->getObserver()->receiveEvent(e);
}
return result;
}
@@ -816,7 +818,7 @@ int ManaPool::add(int color, int value, MTGCardInstance * source)
for (int i = 0; i < value; ++i)
{
WEvent * e = NEW WEventEngageMana(color, source, this);
GameObserver::GetInstance()->receiveEvent(e);
player->getObserver()->receiveEvent(e);
}
return result;
}
@@ -831,7 +833,7 @@ int ManaPool::add(ManaCost * _cost, MTGCardInstance * source)
for (int j = 0; j < _cost->getCost(i); j++)
{
WEvent * e = NEW WEventEngageMana(i, source, this);
GameObserver::GetInstance()->receiveEvent(e);
player->getObserver()->receiveEvent(e);
}
}
return result;
@@ -852,7 +854,7 @@ int ManaPool::pay(ManaCost * _cost)
for (int j = 0; j < value; j++)
{
WEvent * e = NEW WEventConsumeMana(i, this);
GameObserver::GetInstance()->receiveEvent(e);
player->getObserver()->receiveEvent(e);
}
}
+12 -12
View File
@@ -28,27 +28,28 @@ int PhaseRing::phaseStrToInt(string s)
}
/* Creates a New phase ring with the default rules */
PhaseRing::PhaseRing(Player* players[], int nbPlayers)
PhaseRing::PhaseRing(GameObserver* observer)
:observer(observer)
{
for (int i = 0; i < nbPlayers; i++)
for (int i = 0; i < observer->getPlayersNumber(); i++)
{
if(players[i]->phaseRing.size())
if(observer->players[i]->phaseRing.size())
{
addPhase(NEW Phase(Constants::MTG_PHASE_BEFORE_BEGIN, players[i]));
vector<string>customRing = split(players[i]->phaseRing,',');
addPhase(NEW Phase(Constants::MTG_PHASE_BEFORE_BEGIN, observer->players[i]));
vector<string>customRing = split(observer->players[i]->phaseRing,',');
for (unsigned int k = 0;k < customRing.size(); k++)
{
int customOrder = phaseStrToInt(customRing[k]);
Phase * phase = NEW Phase(customOrder, players[i]);
Phase * phase = NEW Phase(customOrder, observer->players[i]);
addPhase(phase);
}
addPhase( NEW Phase(Constants::MTG_PHASE_AFTER_EOT, players[i]));
addPhase( NEW Phase(Constants::MTG_PHASE_AFTER_EOT, observer->players[i]));
}
else
{
for (int j = 0; j < Constants::NB_MTG_PHASES; j++)
{
Phase * phase = NEW Phase(j, players[i]);
Phase * phase = NEW Phase(j, observer->players[i]);
addPhase(phase);
}
}
@@ -69,12 +70,11 @@ PhaseRing::~PhaseRing()
//Tells if next phase will be another Damage phase rather than combat ends
bool PhaseRing::extraDamagePhase(int id)
{
GameObserver * g = GameObserver::GetInstance();
if (id != Constants::MTG_PHASE_COMBATEND) return false;
if (g->combatStep != END_FIRST_STRIKE) return false;
if (observer->combatStep != END_FIRST_STRIKE) return false;
for (int j = 0; j < 2; ++j)
{
MTGGameZone * z = g->players[j]->game->inPlay;
MTGGameZone * z = observer->players[j]->game->inPlay;
for (int i = 0; i < z->nb_cards; ++i)
{
MTGCardInstance * card = z->cards[i];
@@ -110,7 +110,7 @@ Phase * PhaseRing::forward(bool sendEvents)
{
//Warn the layers about the phase Change
WEvent * e = NEW WEventPhaseChange(cPhaseOld, *current);
GameObserver::GetInstance()->receiveEvent(e);
observer->receiveEvent(e);
}
return *current;
+71 -16
View File
@@ -5,10 +5,14 @@
#include "DeckStats.h"
#include "ManaCost.h"
Player::Player(string file, string fileSmall, MTGDeck * deck) :
Damageable(20)
#ifdef TESTSUITE
#include "TestSuiteAI.h"
#endif
Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * deck) :
Damageable(observer, 20), mAvatarName("")
{
if(deck == NULL && file != "testsuite" && file != "remote")
if(deck == NULL && file != "testsuite" && file != "remote" && file != "")
deck = NEW MTGDeck(file.c_str(), MTGCollection());
game = NULL;
@@ -32,10 +36,17 @@ Damageable(20)
mDeck = deck;
}
void Player::setObserver(GameObserver*g)
{
observer = g;
// fix card instances direct pointer
game->setOwner(this);
}
/*Method to call at the end of a game, before all objects involved in the game are destroyed */
void Player::End()
{
DeckStats::GetInstance()->saveStats(this, opponent(), GameObserver::GetInstance());
DeckStats::GetInstance()->saveStats(this, opponent(), observer);
}
Player::~Player()
@@ -61,8 +72,7 @@ void Player::loadAvatar(string file)
const string Player::getDisplayName() const
{
GameObserver * g = GameObserver::GetInstance();
if (this == g->players[0]) return "Player 1";
if (this == observer->players[0]) return "Player 1";
return "Player 2";
}
@@ -73,10 +83,9 @@ MTGInPlay * Player::inPlay()
int Player::getId()
{
GameObserver * game = GameObserver::GetInstance();
for (int i = 0; i < 2; i++)
{
if (game->players[i] == this) return i;
if (observer->players[i] == this) return i;
}
return -1;
}
@@ -88,13 +97,12 @@ JQuadPtr Player::getIcon()
Player * Player::opponent()
{
GameObserver * game = GameObserver::GetInstance();
if (!game) return NULL;
return this == game->players[0] ? game->players[1] : game->players[0];
if (!observer) return NULL;
return this == observer->players[0] ? observer->players[1] : observer->players[0];
}
HumanPlayer::HumanPlayer(string file, string fileSmall, MTGDeck * deck) :
Player(file, fileSmall, deck)
HumanPlayer::HumanPlayer(GameObserver *observer, string file, string fileSmall, MTGDeck * deck) :
Player(observer, file, fileSmall, deck)
{
loadAvatar("avatar.jpg");
playMode = MODE_HUMAN;
@@ -119,8 +127,7 @@ int Player::gainOrLoseLife(int value)
//Send life event to listeners
WEvent * lifed = NEW WEventLife(this,value);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(lifed);
observer->receiveEvent(lifed);
return value;
}
@@ -203,13 +210,61 @@ ostream& operator<<(ostream& out, const Player& p)
istream& operator>>(istream& in, Player& p)
{
string s;
streampos pos = in.tellg();
in >> *((Damageable*)&p);
while(std::getline(in, s))
{
size_t limiter = s.find("=");
if (limiter == string::npos) limiter = s.find(":");
string areaS;
if (limiter != string::npos)
{
areaS = s.substr(0, limiter);
if (areaS.compare("manapool") == 0)
{
SAFE_DELETE(p.manaPool);
p.manaPool = new ManaPool(&p);
ManaCost::parseManaCost(s.substr(limiter + 1), p.manaPool);
}
else if (areaS.compare("avatar") == 0)
{ // We don't load directly for now
p.mAvatarName = s.substr(limiter + 1);
}
else if (areaS.compare("customphasering") == 0)
{
p.phaseRing = s.substr(limiter + 1);
}
else if (areaS.compare("offerinterruptonphase") == 0)
{
for (int i = 0; i < Constants::NB_MTG_PHASES; i++)
{
string phaseStr = Constants::MTGPhaseCodeNames[i];
if (s.find(phaseStr) != string::npos)
{
p.offerInterruptOnPhase = PhaseRing::phaseStrToInt(phaseStr);
break;
}
}
}
else
{
in.seekg(pos);
break;
}
}
pos = in.tellg();
}
if(!p.game)
{
p.game = new MTGPlayerCards();
p.game->setOwner(&p);
}
in >> *(p.game);
p.game->setOwner(&p);
return in;
}
+55 -156
View File
@@ -73,9 +73,8 @@ int Rules::getMTGId(string cardName)
return 0;
}
MTGCardInstance * Rules::getCardByMTGId(int mtgid)
MTGCardInstance * Rules::getCardByMTGId(GameObserver* g, int mtgid)
{
GameObserver * g = GameObserver::GetInstance();
for (int i = 0; i < 2; i++)
{
Player * p = g->players[i];
@@ -95,27 +94,13 @@ MTGCardInstance * Rules::getCardByMTGId(int mtgid)
}
RulesPlayerData::RulesPlayerData()
: player(0)
{
life = 20;
poisonCount = 0;
damageCount = 0;
preventable = 0;
manapool = NEW ManaCost();
avatar = "";
}
RulesPlayerData::~RulesPlayerData()
{
SAFE_DELETE(manapool);
}
RulesPlayerZone::RulesPlayerZone()
{
}
void RulesPlayerZone::add(int cardId)
{
cards.push_back(cardId);
SAFE_DELETE(player);
}
RulesState::RulesState()
@@ -126,79 +111,19 @@ RulesState::RulesState()
void RulesState::parsePlayerState(int playerId, string s)
{
stringstream stream(s);
stream >> *(playerData[playerId].player);
while(std::getline(stream, s))
{
size_t limiter = s.find("=");
if (limiter == string::npos) limiter = s.find(":");
string areaS;
int area = -1;
if (limiter != string::npos)
{
areaS = s.substr(0, limiter);
if (areaS.compare("graveyard") == 0)
{
area = 0;
}
else if (areaS.compare("library") == 0)
{
area = 1;
}
else if (areaS.compare("hand") == 0)
{
area = 2;
}
else if (areaS.compare("inplay") == 0 || areaS.compare("battlefield") == 0)
{
area = 3;
}
else if (areaS.compare("life") == 0)
{
playerData[playerId].life = atoi((s.substr(limiter + 1)).c_str());
return;
}
else if (areaS.compare("poisoncount") == 0)
{
playerData[playerId].poisonCount = atoi((s.substr(limiter + 1)).c_str());
return;
}
else if (areaS.compare("damagecount") == 0)
{
playerData[playerId].damageCount = atoi((s.substr(limiter + 1)).c_str());
return;
}
else if (areaS.compare("preventable") == 0)
{
playerData[playerId].preventable = atoi((s.substr(limiter + 1)).c_str());
return;
}
else if (areaS.compare("avatar") == 0)
{
playerData[playerId].avatar = s.substr(limiter + 1);
return;
}
else if (areaS.compare("manapool") == 0)
{
SAFE_DELETE(playerData[playerId].manapool);
playerData[playerId].manapool = ManaCost::parseManaCost(s.substr(limiter + 1));
return;
}
else if (areaS.compare("customphasering") == 0)
{
playerData[playerId].phaseRing = s.substr(limiter + 1);
return;
}
else if (areaS.compare("offerinterruptonphase") == 0)
{
for (int i = 0; i < Constants::NB_MTG_PHASES; i++)
{
string phaseStr = Constants::MTGPhaseCodeNames[i];
if (s.find(phaseStr) != string::npos)
{
playerData[playerId].offerInterruptOnPhase = PhaseRing::phaseStrToInt(phaseStr);
break;
}
}
return;
}
else if (areaS.compare("auto") == 0)
if (areaS.compare("auto") == 0)
{
playerData[playerId].extraRules.push_back(s.substr(limiter + 1));
return;
@@ -207,34 +132,16 @@ void RulesState::parsePlayerState(int playerId, string s)
{
return; // ERROR
}
s = s.substr(limiter + 1);
while (s.size())
{
unsigned int value;
limiter = s.find(",");
if (limiter != string::npos)
{
value = Rules::getMTGId(s.substr(0, limiter));
s = s.substr(limiter + 1);
}
else
{
value = Rules::getMTGId(s);
s = "";
}
if (value) playerData[playerId].zones[area].add(value);
}
}
else
{
//ERROR
}
}
}
void Rules::addExtraRules()
void Rules::addExtraRules(GameObserver* g)
{
GameObserver * g = GameObserver::GetInstance();
int id = g->mLayers->actionLayer()->getMaxId();
for (int i = 0; i < 2; ++i)
{
@@ -244,7 +151,7 @@ void Rules::addExtraRules()
MTGCardInstance::ExtraRules[i].lastController = p;
for (size_t j = 0; j < initState.playerData[i].extraRules.size(); ++j)
{
AbilityFactory af;
AbilityFactory af(g);
MTGPlayerCards * hand = NULL;
int handsize = 7;
int difficultyRating = 0;
@@ -309,7 +216,7 @@ void Rules::addExtraRules()
for (size_t j = 0; j < extraRules.size(); ++j)
{
AbilityFactory af;
AbilityFactory af(g);
MTGAbility * a = af.parseMagicLine(extraRules[j], id++, NULL, &MTGCardInstance::ExtraRules[0]);
if (a)
{
@@ -327,7 +234,7 @@ void Rules::addExtraRules()
}
Player * Rules::loadPlayerMomir(int isAI)
Player * Rules::loadPlayerMomir(GameObserver* observer, int isAI)
{
string deckFileSmall = "momir";
char empty[] = "";
@@ -341,14 +248,14 @@ Player * Rules::loadPlayerMomir(int isAI)
Player *player = NULL;
if (!isAI) // Human Player
player = NEW HumanPlayer(options.profileFile("momir.txt", "", true).c_str(), deckFileSmall, tempDeck);
player = NEW HumanPlayer(observer, options.profileFile("momir.txt", "", true).c_str(), deckFileSmall, tempDeck);
else
player = NEW AIMomirPlayer(options.profileFile("momir.txt", "", true).c_str(), deckFileSmall, empty, tempDeck);
player = NEW AIMomirPlayer(observer, options.profileFile("momir.txt", "", true).c_str(), deckFileSmall, empty, tempDeck);
return player;
}
Player * Rules::loadPlayerRandom(int isAI, int mode)
Player * Rules::loadPlayerRandom(GameObserver* observer, int isAI, int mode)
{
int color1 = 1 + WRand() % 5;
int color2 = 1 + WRand() % 5;
@@ -375,16 +282,15 @@ Player * Rules::loadPlayerRandom(int isAI, int mode)
Player *player = NULL;
if (!isAI) // Human Player
player = NEW HumanPlayer(deckFile, deckFileSmall, tempDeck);
player = NEW HumanPlayer(observer, deckFile, deckFileSmall, tempDeck);
else
player = NEW AIPlayerBaka(deckFile, deckFileSmall, "", tempDeck);
player = NEW AIPlayerBaka(observer, deckFile, deckFileSmall, "", tempDeck);
return player;
}
Player * Rules::initPlayer(int playerId)
Player * Rules::initPlayer(GameObserver *g, int playerId)
{
GameObserver * g = GameObserver::GetInstance();
Player * p = g->players[playerId];
if (!p)
{
@@ -393,17 +299,17 @@ Player * Rules::initPlayer(int playerId)
switch (gamemode)
{
case GAME_TYPE_MOMIR:
return loadPlayerMomir(isAI);
return loadPlayerMomir(g, isAI);
case GAME_TYPE_CLASSIC:
return NULL; //Error for the time being
case GAME_TYPE_RANDOM1:
return loadPlayerRandom(isAI, GAME_TYPE_RANDOM1);
return loadPlayerRandom(g, isAI, GAME_TYPE_RANDOM1);
case GAME_TYPE_RANDOM2:
return loadPlayerRandom(isAI, GAME_TYPE_RANDOM2);
return loadPlayerRandom(g, isAI, GAME_TYPE_RANDOM2);
}
}
p->phaseRing = initState.playerData[playerId].phaseRing;
p->offerInterruptOnPhase = initState.playerData[playerId].offerInterruptOnPhase;
p->phaseRing = initState.playerData[playerId].player->phaseRing;
p->offerInterruptOnPhase = initState.playerData[playerId].player->offerInterruptOnPhase;
return p;
}
@@ -411,11 +317,17 @@ MTGDeck * Rules::buildDeck(int playerId)
{
int nbcards = 0;
MTGDeck * deck = NEW MTGDeck(MTGCollection());
MTGGameZone * loadedPlayerZones[] = { initState.playerData[playerId].player->game->graveyard,
initState.playerData[playerId].player->game->library,
initState.playerData[playerId].player->game->hand,
initState.playerData[playerId].player->game->inPlay };
for (int j = 0; j < 4; j++)
{
for (size_t k = 0; k < initState.playerData[playerId].zones[j].cards.size(); k++)
for (size_t k = 0; k < loadedPlayerZones[j]->cards.size(); k++)
{
int cardid = initState.playerData[playerId].zones[j].cards[k];
int cardid = loadedPlayerZones[j]->cards[k]->getId();
deck->add(cardid);
nbcards++;
}
@@ -428,12 +340,11 @@ MTGDeck * Rules::buildDeck(int playerId)
return deck;
}
void Rules::initPlayers()
void Rules::initPlayers(GameObserver *g)
{
GameObserver * g = GameObserver::GetInstance();
for (int i = 0; i < 2; i++)
{
Player * p = initPlayer(i);
Player * p = initPlayer(g, i);
g->players[i] = p;
MTGDeck * deck = buildDeck(i);
if (deck)
@@ -445,10 +356,8 @@ void Rules::initPlayers()
}
}
void Rules::initGame()
void Rules::initGame(GameObserver *g)
{
//Put the GameObserver in the initial state
GameObserver * g = GameObserver::GetInstance();
DebugTrace("RULES Init Game\n");
//Set the current player/phase
@@ -469,27 +378,31 @@ void Rules::initGame()
for (int i = 0; i < 2; i++)
{
Player * p = g->players[i];
p->life = initState.playerData[i].life;
p->poisonCount = initState.playerData[i].poisonCount;
p->damageCount = initState.playerData[i].damageCount;
p->preventable = initState.playerData[i].preventable;
if (initState.playerData[i].avatar.size())
p->life = initState.playerData[i].player->life;
p->poisonCount = initState.playerData[i].player->poisonCount;
p->damageCount = initState.playerData[i].player->damageCount;
p->preventable = initState.playerData[i].player->preventable;
if (initState.playerData[i].player->mAvatarName.size())
{
p->loadAvatar(initState.playerData[i].avatar);
p->loadAvatar(initState.playerData[i].player->mAvatarName);
}
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay };
MTGGameZone * loadedPlayerZones[] = { initState.playerData[i].player->game->graveyard,
initState.playerData[i].player->game->library,
initState.playerData[i].player->game->hand,
initState.playerData[i].player->game->inPlay };
for (int j = 0; j < 4; j++)
{
MTGGameZone * zone = playerZones[j];
for (size_t k = 0; k < initState.playerData[i].zones[j].cards.size(); k++)
for (size_t k = 0; k < loadedPlayerZones[j]->cards.size(); k++)
{
MTGCardInstance * card = getCardByMTGId(initState.playerData[i].zones[j].cards[k]);
MTGCardInstance * card = getCardByMTGId(g, loadedPlayerZones[j]->cards[k]->getId());
if (card && zone != p->game->library)
{
if (zone == p->game->inPlay)
{
MTGCardInstance * copy = p->game->putInZone(card, p->game->library, p->game->stack);
Spell * spell = NEW Spell(copy);
Spell * spell = NEW Spell(g, copy);
spell->resolve();
delete spell;
}
@@ -512,7 +425,7 @@ void Rules::initGame()
}
}
}
addExtraRules();
addExtraRules(g);
postUpdateInitDone = false;
DebugTrace("RULES Init Game Done !\n");
@@ -521,34 +434,20 @@ DebugTrace("RULES Init Game Done !\n");
//This function has all iitialization that can't be done in the "real" init function,
// because the first update call messes things up.
//It's a hack, ideally, the first update call shouldn't mess the init parameters...
void Rules::postUpdateInit()
void Rules::postUpdateInit(GameObserver* observer)
{
if (postUpdateInitDone)
return;
for (int i = 0; i < 2; ++ i)
GameObserver::GetInstance()->players[i]->getManaPool()->add(initState.playerData[i].manapool);
observer->players[i]->getManaPool()->add(initState.playerData[i].player->getManaPool());
// GameObserver::GetInstance()->players[i]->getManaPool()->copy(initState.playerData[i].manapool);
postUpdateInitDone = true;
}
void RulesPlayerZone::cleanup()
{
cards.clear();
}
void RulesPlayerData::cleanup()
{
if (manapool) delete manapool;
manapool = NULL;
manapool = NEW ManaCost();
for (int i = 0; i < 5; i++)
{
zones[i].cleanup();
}
life = 20;
poisonCount = 0;
damageCount = 0;
preventable = 0;
SAFE_DELETE(player);
player = new Player(NULL, "", "");
}
void RulesState::cleanup()
+6 -8
View File
@@ -310,19 +310,19 @@ void StoryDuel::init()
sprintf(deckFile, "%s/deck.txt", folder);
sprintf(deckFileSmall, "campaign_%s", mParent->folder.c_str());
players[0] = NEW HumanPlayer(deckFile, deckFileSmall);
players[0] = NEW HumanPlayer(0, deckFile, deckFileSmall);
sprintf(deckFile, "%s/opponent_deck.txt", folder);
sprintf(deckFileSmall, "campaign_ennemy_%s_%s", mParent->folder.c_str(), pageId.c_str());
players[1] = NEW AIPlayerBaka(deckFile, deckFileSmall, "baka.jpg");
players[1] = NEW AIPlayerBaka(0, deckFile, deckFileSmall, "baka.jpg");
string rulesFile = folder;
rulesFile.append("/rules.txt");
rules = NEW Rules(bg);
rules->load(rulesFile);
GameObserver::Init(players, 2);
game = GameObserver::GetInstance();
game = new GameObserver(players, 2);
rules->gamemode = GAME_TYPE_STORY;
game->startGame(rules);
}
@@ -364,8 +364,7 @@ StoryDuel::StoryDuel(TiXmlElement* root, StoryFlow * mParent) :
StoryDuel::~StoryDuel()
{
SAFE_DELETE(rules);
if (game) GameObserver::EndInstance();
game = NULL;
SAFE_DELETE(game);
}
void StoryDuel::Update(float dt)
@@ -378,8 +377,7 @@ void StoryDuel::Update(float dt)
mParent->gotoPage(onWin);
else
mParent->gotoPage(onLose);
GameObserver::EndInstance();
game = NULL;
SAFE_DELETE(game);
}
}
+56 -53
View File
@@ -23,7 +23,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
{
MTGCardInstance * target = card->target;
if (ability) target = (MTGCardInstance *) (ability->target);
return NEW CardTargetChooser(target, card);
return NEW CardTargetChooser(observer, target, card);
};
found = s.find("opponent");
@@ -31,7 +31,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
{
int maxtargets = 1;
Player * opponent = card->controller()->opponent();
return NEW PlayerTargetChooser(card, maxtargets, opponent);
return NEW PlayerTargetChooser(observer, card, maxtargets, opponent);
};
found = s.find("controller");
@@ -39,7 +39,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
{
int maxtargets = 1;
Player * controller = card->controller();
return NEW PlayerTargetChooser(card, maxtargets, controller);
return NEW PlayerTargetChooser(observer, card, maxtargets, controller);
};
found = s.find("other ");
@@ -55,10 +55,10 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
if (s.length() > 7 && s.find("[") == 7)
{
string s1 = s.substr(7, s.find("]"));
if (s1.find("to") != string::npos) return NEW TriggerTargetChooser(WEvent::TARGET_TO);
if (s1.find("from") != string::npos) return NEW TriggerTargetChooser(WEvent::TARGET_FROM);
if (s1.find("to") != string::npos) return NEW TriggerTargetChooser(observer, WEvent::TARGET_TO);
if (s1.find("from") != string::npos) return NEW TriggerTargetChooser(observer, WEvent::TARGET_FROM);
}
return NEW TriggerTargetChooser(1);
return NEW TriggerTargetChooser(observer, 1);
}
found = s.find("player");
@@ -68,15 +68,15 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
size_t several = s.find("<anyamount>");
if (several != string::npos) maxtargets = TargetChooser::UNLITMITED_TARGETS;
found = s.find("creature");
if (found != string::npos) return NEW DamageableTargetChooser(card, maxtargets, other); //Any Damageable target (player, creature)
return NEW PlayerTargetChooser(card, maxtargets); //Any player
if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other); //Any Damageable target (player, creature)
return NEW PlayerTargetChooser(observer, card, maxtargets); //Any player
}
found = s.find("proliferation");
if (found != string::npos)
{
int maxtargets = TargetChooser::UNLITMITED_TARGETS;
return NEW ProliferateChooser(card, maxtargets); //Any player
return NEW ProliferateChooser(observer, card, maxtargets); //Any player
}
string s1;
@@ -202,11 +202,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
TargetChooser * deeperTc = NULL;
if(s1.find("[") != string::npos)
{
AbilityFactory af;
AbilityFactory af(observer);
vector<string>deepTc = parseBetween(s1,"[","]");
deeperTc = createTargetChooser(deepTc[1],card);
}
return NEW ParentChildChooser(card, maxtargets,deeperTc,s1.find("parents") != string::npos?2:1);
return NEW ParentChildChooser(observer, card, maxtargets,deeperTc,s1.find("parents") != string::npos?2:1);
}
while (s1.size())
@@ -528,7 +528,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
size_t start = attribute.find("{");
size_t end = attribute.find("}");
string counterString = attribute.substr(start + 1, end - start - 1);
AbilityFactory abf;
AbilityFactory abf(observer);
Counter * counter = abf.parseCounter(counterString, card);
if (counter)
{
@@ -603,7 +603,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
{
if (typeName.compare("*") != 0) cd->setSubtype(typeName);
tc = NEW DescriptorTargetChooser(cd, zones, nbzones, card, maxtargets, other, targetMin);
tc = NEW DescriptorTargetChooser(observer, cd, zones, nbzones, card, maxtargets, other, targetMin);
}
else
{
@@ -617,15 +617,15 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
{
if (typeName.compare("*") == 0)
{
return NEW TargetZoneChooser(zones, nbzones, card, maxtargets, other, targetMin);
return NEW TargetZoneChooser(observer, zones, nbzones, card, maxtargets, other, targetMin);
}
else if (typeName.compare("this") == 0)
{
return NEW CardTargetChooser(card, card, zones, nbzones);
return NEW CardTargetChooser(observer, card, card, zones, nbzones);
}
else
{
tc = NEW TypeTargetChooser(typeName.c_str(), zones, nbzones, card, maxtargets, other, targetMin);
tc = NEW TypeTargetChooser(observer, typeName.c_str(), zones, nbzones, card, maxtargets, other, targetMin);
}
}
else
@@ -660,7 +660,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(MTGCardInstance * card
#if defined (WIN32) || defined (LINUX)
DebugTrace("Counter Spell !\n");
#endif
return NEW SpellTargetChooser(card);
return NEW SpellTargetChooser(observer, card);
}
//Spell Or Permanent
case 1282: //ChaosLace
@@ -669,22 +669,22 @@ TargetChooser * TargetChooserFactory::createTargetChooser(MTGCardInstance * card
case 1227: //ThoughLace
case 1257: //Lifelace
{
return NEW SpellOrPermanentTargetChooser(card);
return NEW SpellOrPermanentTargetChooser(observer, card);
}
//Red Spell or Permanent
case 1191: //Blue Elemental Blast
{
return NEW SpellOrPermanentTargetChooser(card, Constants::MTG_COLOR_RED);
return NEW SpellOrPermanentTargetChooser(observer, card, Constants::MTG_COLOR_RED);
}
//Blue Spell or Permanent
case 1312: //Red Elemental Blast
{
return NEW SpellOrPermanentTargetChooser(card, Constants::MTG_COLOR_BLUE);
return NEW SpellOrPermanentTargetChooser(observer, card, Constants::MTG_COLOR_BLUE);
}
//Damage History
case 1344: //Eye for an Eye
{
return NEW DamageTargetChooser(card, -1, 1, RESOLVED_OK);
return NEW DamageTargetChooser(observer, card, -1, 1, RESOLVED_OK);
}
default:
{
@@ -693,8 +693,8 @@ TargetChooser * TargetChooserFactory::createTargetChooser(MTGCardInstance * card
}
}
TargetChooser::TargetChooser(MTGCardInstance * card, int _maxtargets, bool _other,bool _targetMin) :
TargetsList()
TargetChooser::TargetChooser(GameObserver *observer, MTGCardInstance * card, int _maxtargets, bool _other,bool _targetMin) :
TargetsList(), observer(observer)
{
forceTargetListReady = 0;
source = card;
@@ -706,6 +706,8 @@ TargetChooser::TargetChooser(MTGCardInstance * card, int _maxtargets, bool _othe
attemptsToFill = 0;
if(source)
Owner = source->controller();
else
Owner = 0;
}
//Default targetter : every card can be targetted, unless it is protected from the targetter card
@@ -730,7 +732,7 @@ bool TargetChooser::canTarget(Targetable * target,bool withoutProtections)
//this is kinda cheating but by default we let auras and equipments always continue to target a phased creature.
else if(card->isPhased)
return false;
if (source && targetter && card->isInPlay() && !withoutProtections)
if (source && targetter && card->isInPlay(observer) && !withoutProtections)
{
if (card->has(Constants::SHROUD)) return false;
if (card->protectedAgainst(targetter)) return false;
@@ -795,7 +797,7 @@ bool TargetChooser::validTargetsExist(int maxTargets)
for (int i = 0; i < 2; ++i)
{
int maxAmount = 0;
Player *p = GameObserver::GetInstance()->players[i];
Player *p = observer->players[i];
if (canTarget(p)) return true;
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile, p->game->stack };
for (int k = 0; k < 6; k++)
@@ -820,7 +822,7 @@ int TargetChooser::countValidTargets()
int result = 0;
for (int i = 0; i < 2; ++i)
{
Player *p = GameObserver::GetInstance()->players[i];
Player *p = observer->players[i];
if(canTarget(p))
result++;
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile };
@@ -850,8 +852,8 @@ bool TargetChooser::equals(TargetChooser * tc)
/**
a specific Card
**/
CardTargetChooser::CardTargetChooser(MTGCardInstance * _card, MTGCardInstance * source, int * _zones, int _nbzones) :
TargetZoneChooser(_zones, _nbzones, source)
CardTargetChooser::CardTargetChooser(GameObserver *observer, MTGCardInstance * _card, MTGCardInstance * source, int * _zones, int _nbzones) :
TargetZoneChooser(observer, _zones, _nbzones, source)
{
validTarget = _card;
}
@@ -894,8 +896,8 @@ bool CardTargetChooser::equals(TargetChooser * tc)
/**
Choose anything that has a given list of types
**/
TypeTargetChooser::TypeTargetChooser(const char * _type, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetZoneChooser(card, _maxtargets, other,targetMin)
TypeTargetChooser::TypeTargetChooser(GameObserver *observer, const char * _type, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetZoneChooser(observer, card, _maxtargets, other,targetMin)
{
int id = Subtypes::subtypesList->find(_type);
nbtypes = 0;
@@ -904,9 +906,9 @@ TypeTargetChooser::TypeTargetChooser(const char * _type, MTGCardInstance * card,
init(default_zones, 2);
}
TypeTargetChooser::TypeTargetChooser(const char * _type, int * _zones, int nbzones, MTGCardInstance * card, int _maxtargets,
TypeTargetChooser::TypeTargetChooser(GameObserver *observer, const char * _type, int * _zones, int nbzones, MTGCardInstance * card, int _maxtargets,
bool other,bool targetMin) :
TargetZoneChooser(card, _maxtargets, other,targetMin)
TargetZoneChooser(observer, card, _maxtargets, other,targetMin)
{
int id = Subtypes::subtypesList->find(_type);
nbtypes = 0;
@@ -1006,17 +1008,17 @@ bool TypeTargetChooser ::equals(TargetChooser * tc)
/**
A Target Chooser associated to a Card Descriptor object, for fine tuning of targets description
**/
DescriptorTargetChooser::DescriptorTargetChooser(CardDescriptor * _cd, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetZoneChooser(card, _maxtargets, other,targetMin)
DescriptorTargetChooser::DescriptorTargetChooser(GameObserver *observer, CardDescriptor * _cd, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetZoneChooser(observer, card, _maxtargets, other,targetMin)
{
int default_zones[] = { MTGGameZone::MY_BATTLEFIELD, MTGGameZone::OPPONENT_BATTLEFIELD };
init(default_zones, 2);
cd = _cd;
}
DescriptorTargetChooser::DescriptorTargetChooser(CardDescriptor * _cd, int * _zones, int nbzones, MTGCardInstance * card,
DescriptorTargetChooser::DescriptorTargetChooser(GameObserver *observer, CardDescriptor * _cd, int * _zones, int nbzones, MTGCardInstance * card,
int _maxtargets, bool other,bool targetMin) :
TargetZoneChooser(card, _maxtargets, other,targetMin)
TargetZoneChooser(observer, card, _maxtargets, other,targetMin)
{
if (nbzones == 0)
{
@@ -1077,14 +1079,14 @@ bool DescriptorTargetChooser::equals(TargetChooser * tc)
}
/* TargetzoneChooser targets everything in a given zone */
TargetZoneChooser::TargetZoneChooser(MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetChooser(card, _maxtargets, other,targetMin)
TargetZoneChooser::TargetZoneChooser(GameObserver *observer, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetChooser(observer, card, _maxtargets, other,targetMin)
{
init(NULL, 0);
}
TargetZoneChooser::TargetZoneChooser(int * _zones, int _nbzones, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetChooser(card, _maxtargets, other,targetMin)
TargetZoneChooser::TargetZoneChooser(GameObserver *observer, int * _zones, int _nbzones, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
TargetChooser(observer, card, _maxtargets, other,targetMin)
{
init(_zones, _nbzones);
}
@@ -1116,7 +1118,7 @@ bool TargetZoneChooser::canTarget(Targetable * target,bool withoutProtections)
for (int i = 0; i < nbzones; i++)
{
if (zones[i] == MTGGameZone::ALL_ZONES) return true;
if (MTGGameZone::intToZone(zones[i], source, card)->hasCard(card)) return true;
if (MTGGameZone::intToZone(observer, zones[i], source, card)->hasCard(card)) return true;
}
}
else if (target->typeAsTarget() == TARGET_STACKACTION)
@@ -1128,7 +1130,7 @@ bool TargetZoneChooser::canTarget(Targetable * target,bool withoutProtections)
Spell * spell = (Spell *) action;
MTGCardInstance * card = spell->source;
for (int i = 0; i < nbzones; i++)
if (MTGGameZone::intToZone(zones[i], source, card)->hasCard(card)) return true;
if (MTGGameZone::intToZone(Owner->getObserver(), zones[i], source, card)->hasCard(card)) return true;
}
}
return false;
@@ -1137,7 +1139,7 @@ bool TargetZoneChooser::canTarget(Targetable * target,bool withoutProtections)
bool TargetZoneChooser::targetsZone(MTGGameZone * z)
{
for (int i = 0; i < nbzones; i++)
if (MTGGameZone::intToZone(zones[i], source) == z) return true;
if (MTGGameZone::intToZone(Owner->getObserver(), zones[i], source) == z) return true;
return false;
}
bool TargetZoneChooser::targetsZone(MTGGameZone * z,MTGCardInstance * mSource)
@@ -1145,7 +1147,7 @@ bool TargetZoneChooser::targetsZone(MTGGameZone * z,MTGCardInstance * mSource)
if(mSource)
source = mSource;
for (int i = 0; i < nbzones; i++)
if (MTGGameZone::intToZone(zones[i], source) == z) return true;
if (MTGGameZone::intToZone(source->owner->getObserver(), zones[i], source) == z) return true;
return false;
}
@@ -1185,8 +1187,8 @@ bool TargetZoneChooser::equals(TargetChooser * tc)
}
/* Player Target */
PlayerTargetChooser::PlayerTargetChooser(MTGCardInstance * card, int _maxtargets, Player *p) :
TargetChooser(card, _maxtargets), p(p)
PlayerTargetChooser::PlayerTargetChooser(GameObserver *observer, MTGCardInstance * card, int _maxtargets, Player *p) :
TargetChooser(observer, card, _maxtargets), p(p)
{
}
@@ -1260,8 +1262,8 @@ bool DamageableTargetChooser::equals(TargetChooser * tc)
/*Spell */
SpellTargetChooser::SpellTargetChooser(MTGCardInstance * card, int _color, int _maxtargets, bool other,bool targetMin) :
TargetChooser(card, _maxtargets, other,targetMin)
SpellTargetChooser::SpellTargetChooser(GameObserver *observer, MTGCardInstance * card, int _color, int _maxtargets, bool other,bool targetMin) :
TargetChooser(observer, card, _maxtargets, other,targetMin)
{
color = _color;
}
@@ -1303,8 +1305,8 @@ bool SpellTargetChooser::equals(TargetChooser * tc)
}
/*Spell or Permanent */
SpellOrPermanentTargetChooser::SpellOrPermanentTargetChooser(MTGCardInstance * card, int _color, int _maxtargets, bool other,bool targetMin) :
TargetZoneChooser(card, _maxtargets, other,targetMin)
SpellOrPermanentTargetChooser::SpellOrPermanentTargetChooser(GameObserver *observer, MTGCardInstance * card, int _color, int _maxtargets, bool other,bool targetMin) :
TargetZoneChooser(observer, card, _maxtargets, other,targetMin)
{
int default_zones[] = { MTGGameZone::MY_BATTLEFIELD, MTGGameZone::OPPONENT_BATTLEFIELD };
init(default_zones, 2);
@@ -1352,8 +1354,8 @@ bool SpellOrPermanentTargetChooser::equals(TargetChooser * tc)
}
/*Damage */
DamageTargetChooser::DamageTargetChooser(MTGCardInstance * card, int _color, int _maxtargets, int _state) :
TargetChooser(card, _maxtargets)
DamageTargetChooser::DamageTargetChooser(GameObserver *observer, MTGCardInstance * card, int _color, int _maxtargets, int _state) :
TargetChooser(observer, card, _maxtargets)
{
color = _color;
state = _state;
@@ -1394,7 +1396,8 @@ bool DamageTargetChooser::equals(TargetChooser * tc)
return TargetChooser::equals(tc);
}
TriggerTargetChooser::TriggerTargetChooser(int _triggerTarget)
TriggerTargetChooser::TriggerTargetChooser(GameObserver *observer, int _triggerTarget)
: TargetChooser(observer)
{
triggerTarget = _triggerTarget;
target = NULL;
+1 -3
View File
@@ -20,8 +20,7 @@ int TargetsList::addTarget(Targetable * target)
{
if (!alreadyHasTarget(target))
{
GameObserver * state = state->GetInstance();
TargetChooser * tc = state->getCurrentTargetChooser();
TargetChooser * tc = target->getObserver()->getCurrentTargetChooser();
if(!tc || (tc && tc->maxtargets == 1))
{
//because this was originally coded with targets as an array
@@ -39,7 +38,6 @@ int TargetsList::addTarget(Targetable * target)
}
}
return 0;
}
int TargetsList::alreadyHasTarget(Targetable * target)
+22 -29
View File
@@ -431,13 +431,13 @@ void TaskList::passOneDay()
}
}
void TaskList::getDoneTasks(Player * _p1, Player * _p2, GameApp * _app, vector<Task*>* result)
void TaskList::getDoneTasks(GameObserver* observer, GameApp * _app, vector<Task*>* result)
{
result->clear();
// TODO: Return only accepted tasks
for (vector<Task*>::iterator it = tasks.begin(); it != tasks.end(); it++)
{
if ((*it)->isDone(_p1, _p2, _app))
if ((*it)->isDone(observer, _app))
{
result->push_back(*it);
}
@@ -615,11 +615,10 @@ string TaskWinAgainst::getShortDesc()
return result;
}
bool TaskWinAgainst::isDone(Player * _p1, Player * _p2, GameApp * _app)
bool TaskWinAgainst::isDone(GameObserver* observer, GameApp * _app)
{
GameObserver * g = GameObserver::GetInstance();
AIPlayerBaka * baka = (AIPlayerBaka*) _p2;
return ((baka) && (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
AIPlayerBaka * baka = (AIPlayerBaka*) observer->players[1];
return ((baka) && (!observer->players[0]->isAI()) && (observer->players[1]->isAI()) && (observer->gameOver != observer->players[0]) // Human player wins
&& (baka->deckId == opponent));
}
@@ -670,9 +669,9 @@ string TaskSlaughter::getShortDesc()
return buffer;
}
bool TaskSlaughter::isDone(Player * _p1, Player * _p2, GameApp * _app)
bool TaskSlaughter::isDone(GameObserver* observer, GameApp * _app)
{
return TaskWinAgainst::isDone(_p1, _p2, _app) && (_p2->life <= targetLife);
return TaskWinAgainst::isDone(observer, _app) && (observer->players[1]->life <= targetLife);
}
void TaskSlaughter::storeCustomAttribs()
@@ -756,10 +755,9 @@ string TaskDelay::getShortDesc()
return buffer;
}
bool TaskDelay::isDone(Player * _p1, Player * _p2, GameApp * _app)
bool TaskDelay::isDone(GameObserver* observer, GameApp * _app)
{
GameObserver * g = GameObserver::GetInstance();
return TaskWinAgainst::isDone(_p1, _p2, _app) && (afterTurn ? (g->turn >= turn) : (g->turn <= turn));
return TaskWinAgainst::isDone(observer, _app) && (afterTurn ? (observer->turn >= turn) : (observer->turn <= turn));
}
void TaskDelay::storeCustomAttribs()
@@ -824,11 +822,10 @@ string TaskImmortal::getShortDesc()
return buffer;
}
bool TaskImmortal::isDone(Player * _p1, Player * _p2, GameApp * _app)
bool TaskImmortal::isDone(GameObserver *observer, GameApp * _app)
{
GameObserver * g = GameObserver::GetInstance();
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
&& (_p1->life >= targetLife);
return (!observer->players[0]->isAI()) && (observer->players[1]->isAI()) && (observer->gameOver != observer->players[0]) // Human player wins
&& (observer->players[1]->life >= targetLife);
}
void TaskImmortal::storeCustomAttribs()
@@ -920,10 +917,10 @@ string TaskMassiveBurial::getShortDesc()
return buffer;
}
bool TaskMassiveBurial::isDone(Player * _p1, Player * _p2, GameApp * _app)
bool TaskMassiveBurial::isDone(GameObserver* observer, GameApp * _app)
{
int countColor = 0;
vector<MTGCardInstance *> cards = _p2->game->graveyard->cards;
vector<MTGCardInstance *> cards = observer->players[1]->game->graveyard->cards;
for (vector<MTGCardInstance *>::iterator it = cards.begin(); it != cards.end(); it++)
{
@@ -1013,11 +1010,10 @@ string TaskWisdom::getShortDesc()
return buffer;
}
bool TaskWisdom::isDone(Player * _p1, Player * _p2, GameApp * _app)
bool TaskWisdom::isDone(GameObserver* observer, GameApp * _app)
{
GameObserver * g = GameObserver::GetInstance();
int countColor = 0;
vector<MTGCardInstance *> cards = _p1->game->hand->cards;
vector<MTGCardInstance *> cards = observer->players[0]->game->hand->cards;
for (vector<MTGCardInstance *>::iterator it = cards.begin(); it != cards.end(); it++)
{
@@ -1027,7 +1023,7 @@ bool TaskWisdom::isDone(Player * _p1, Player * _p2, GameApp * _app)
}
}
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
return (!observer->players[0]->isAI()) && (observer->players[1]->isAI()) && (observer->gameOver != observer->players[0]) // Human player wins
&& (countColor >= cardCount);
}
@@ -1095,11 +1091,10 @@ string TaskPacifism::getShortDesc()
return buffer;
}
bool TaskPacifism::isDone(Player * _p1, Player * _p2, GameApp * _app)
bool TaskPacifism::isDone(GameObserver* observer, GameApp * _app)
{
GameObserver * g = GameObserver::GetInstance();
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
&& (_p2->life >= lifeSlashCardMin) && ((int) _p2->game->library->cards.size() >= lifeSlashCardMin);
return (!observer->players[0]->isAI()) && (observer->players[1]->isAI()) && (observer->gameOver != observer->players[0]) // Human player wins
&& (observer->players[1]->life >= lifeSlashCardMin) && ((int) observer->players[1]->game->library->cards.size() >= lifeSlashCardMin);
}
void TaskPacifism::storeCustomAttribs()
@@ -1154,11 +1149,9 @@ void TaskPacifism::randomize()
return buffer;
}
bool TaskXX::isDone(Player * _p1, Player * _p2, GameApp * _app) {
GameObserver * g = GameObserver::GetInstance();
bool TaskXX::isDone(GameObserver* observer, GameApp * _app) {
// TODO: Implement
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
&& ;
return (!observer->players[0]->isAI()) && (observer->players[1]->isAI()) && (observer->gameOver != _p1) // Human player wins
}
void TaskXX::storeCustomAttribs() {
+103 -172
View File
@@ -15,11 +15,12 @@ using std::string;
// NULL is sent in place of a MTGDeck since there is no way to create a MTGDeck without a proper deck file.
// TestSuiteAI will be responsible for managing its own deck state.
TestSuiteAI::TestSuiteAI(TestSuite * _suite, int playerId) :
AIPlayerBaka("testsuite", "testsuite", "baka.jpg", NULL)
TestSuiteAI::TestSuiteAI(GameObserver *observer, TestSuite * _suite, int playerId) :
AIPlayerBaka(observer, "testsuite", "testsuite", "baka.jpg", NULL)
{
this->game = _suite->buildDeck(playerId);
game = _suite->buildDeck(this, playerId);
game->setOwner(this);
suite = _suite;
timer = 0;
playMode = MODE_TEST_SUITE;
@@ -29,14 +30,13 @@ TestSuiteAI::TestSuiteAI(TestSuite * _suite, int playerId) :
MTGCardInstance * TestSuiteAI::getCard(string action)
{
int mtgid = Rules::getMTGId(action);
if (mtgid) return Rules::getCardByMTGId(mtgid);
if (mtgid) return Rules::getCardByMTGId(observer, mtgid);
//This mostly handles tokens
GameObserver * g = GameObserver::GetInstance();
std::transform(action.begin(), action.end(), action.begin(), ::tolower);
for (int i = 0; i < 2; i++)
{
Player * p = g->players[i];
Player * p = observer->players[i];
MTGGameZone * zones[] = { p->game->library, p->game->hand, p->game->inPlay, p->game->graveyard };
for (int j = 0; j < 4; j++)
{
@@ -54,9 +54,9 @@ MTGCardInstance * TestSuiteAI::getCard(string action)
return NULL;
}
Interruptible * TestSuite::getActionByMTGId(int mtgid)
Interruptible * TestSuite::getActionByMTGId(GameObserver* observer, int mtgid)
{
ActionStack * as = GameObserver::GetInstance()->mLayers->stackLayer();
ActionStack * as = observer->mLayers->stackLayer();
Interruptible * action = NULL;
while ((action = as->getNext(action, 0, 0, 1)))
{
@@ -76,14 +76,13 @@ int TestSuiteAI::displayStack()
int TestSuiteAI::Act(float dt)
{
GameObserver * g = GameObserver::GetInstance();
g->gameOver = NULL; // Prevent draw rule from losing the game
observer->gameOver = NULL; // Prevent draw rule from losing the game
//Last bits of initialization require to be done here, after the first "update" call of the game
if (suite->currentAction == 0)
{
for (int i = 0; i < 2; ++ i)
g->players[i]->getManaPool()->copy(suite->initState.playerData[i].manapool);
observer->players[i]->getManaPool()->copy(suite->initState.players[i]->getManaPool());
}
if (playMode == MODE_AI && suite->aiMaxCalls)
@@ -94,7 +93,7 @@ int TestSuiteAI::Act(float dt)
}
if (playMode == MODE_HUMAN)
{
g->mLayers->CheckUserInput(0);
observer->mLayers->CheckUserInput(0);
suite->currentAction++; //hack to avoid repeating the initialization of manapool
return 1;
}
@@ -104,14 +103,14 @@ int TestSuiteAI::Act(float dt)
timer = 0;
string action = suite->getNextAction();
g->mLayers->stackLayer()->Dump();
observer->mLayers->stackLayer()->Dump();
DebugTrace("TESTSUITE command: " << action);
if (g->mLayers->stackLayer()->askIfWishesToInterrupt == this)
if (observer->mLayers->stackLayer()->askIfWishesToInterrupt == this)
{
if (action.compare("no") != 0 && action.compare("yes") != 0)
{
g->mLayers->stackLayer()->cancelInterruptOffer();
observer->mLayers->stackLayer()->cancelInterruptOffer();
suite->currentAction--;
return 1;
}
@@ -120,16 +119,16 @@ int TestSuiteAI::Act(float dt)
if (action == "")
{
//end of game
suite->assertGame();
g->gameOver = g->players[0];
suite->assertGame(observer);
observer->gameOver = observer->players[0];
DebugTrace("================================ END OF TEST =======================\n");
return 1;
}
if (action.compare("eot") == 0)
{
if (g->getCurrentGamePhase() != Constants::MTG_PHASE_CLEANUP) suite->currentAction--;
g->userRequestNextGamePhase();
if (observer->getCurrentGamePhase() != Constants::MTG_PHASE_CLEANUP) suite->currentAction--;
observer->userRequestNextGamePhase();
}
else if (action.compare("human") == 0)
{
@@ -157,60 +156,61 @@ int TestSuiteAI::Act(float dt)
phaseToGo = i;
}
}
if(g->currentGamePhase != phaseToGo)
if(observer->currentGamePhase != phaseToGo)
suite->currentAction--;
else
{
return 1;
}
GuiCombat * gc = g->mLayers->combatLayer();
if (ORDER == g->combatStep || DAMAGE == g->combatStep)
GuiCombat * gc = observer->mLayers->combatLayer();
if (ORDER == observer->combatStep || DAMAGE == observer->combatStep)
{
gc->clickOK();
}
else
{
g->userRequestNextGamePhase();
observer->userRequestNextGamePhase();
}
}
else
{
GuiCombat * gc = g->mLayers->combatLayer();
if (ORDER == g->combatStep || DAMAGE == g->combatStep)
GuiCombat * gc = observer->mLayers->combatLayer();
if (ORDER == observer->combatStep || DAMAGE == observer->combatStep)
gc->clickOK();
else
g->userRequestNextGamePhase();
observer->userRequestNextGamePhase();
}
}
else if (action.compare("yes") == 0)
g->mLayers->stackLayer()->setIsInterrupting(this);
observer->mLayers->stackLayer()->setIsInterrupting(this);
else if (action.compare("endinterruption") == 0)
g->mLayers->stackLayer()->endOfInterruption();
observer->mLayers->stackLayer()->endOfInterruption();
else if (action.compare("no") == 0)
{
if (g->mLayers->stackLayer()->askIfWishesToInterrupt == this) g->mLayers->stackLayer()->cancelInterruptOffer();
if (observer->mLayers->stackLayer()->askIfWishesToInterrupt == this)
observer->mLayers->stackLayer()->cancelInterruptOffer();
}
else if (action.find("choice ") != string::npos)
{
DebugTrace("TESTSUITE choice !!!");
int choice = atoi(action.substr(action.find("choice ") + 7).c_str());
g->mLayers->actionLayer()->doReactTo(choice);
observer->mLayers->actionLayer()->doReactTo(choice);
}
else if (action.find(" -momir- ") != string::npos)
{
int start = action.find(" -momir- ");
int cardId = Rules::getMTGId(action.substr(start + 9).c_str());
int cardIdHand = Rules::getMTGId(action.substr(0, start).c_str());
MTGMomirRule * a = ((MTGMomirRule *) g->mLayers->actionLayer()->getAbility(MTGAbility::MOMIR));
a->reactToClick(Rules::getCardByMTGId(cardIdHand), cardId);
g->mLayers->actionLayer()->stuffHappened = 1;
MTGMomirRule * a = ((MTGMomirRule *) observer->mLayers->actionLayer()->getAbility(MTGAbility::MOMIR));
a->reactToClick(Rules::getCardByMTGId(observer, cardIdHand), cardId);
observer->mLayers->actionLayer()->stuffHappened = 1;
}
else if (action.find("p1") != string::npos || action.find("p2") != string::npos)
{
Player * p = g->players[1];
Player * p = observer->players[1];
size_t start = action.find("p1");
if (start != string::npos) p = g->players[0];
g->cardClick(NULL, p);
if (start != string::npos) p = observer->players[0];
observer->cardClick(NULL, p);
}
else
{
@@ -219,12 +219,12 @@ int TestSuiteAI::Act(float dt)
if (mtgid)
{
DebugTrace("TESTSUITE CARD ID:" << mtgid);
toInterrupt = suite->getActionByMTGId(mtgid);
toInterrupt = suite->getActionByMTGId(observer, mtgid);
}
if (toInterrupt)
{
g->stackObjectClicked(toInterrupt);
observer->stackObjectClicked(toInterrupt);
return 1;
}
@@ -233,8 +233,8 @@ int TestSuiteAI::Act(float dt)
{
DebugTrace("TESTSUITE Clicking ON: " << card->name);
card->currentZone->needShuffle = true; //mimic library shuffle
g->cardClick(card, card);
g->forceShuffleLibraries(); //mimic library shuffle
observer->cardClick(card, card);
observer->forceShuffleLibraries(); //mimic library shuffle
return 1;
}
}
@@ -252,97 +252,20 @@ void TestSuiteActions::add(string s)
nbitems++;
}
TestSuitePlayerData::TestSuitePlayerData()
{
life = 20;
manapool = NEW ManaCost();
}
TestSuitePlayerData::~TestSuitePlayerData()
{
SAFE_DELETE(manapool);
}
TestSuitePlayerZone::TestSuitePlayerZone()
{
nbitems = 0;
}
void TestSuitePlayerZone::add(int cardId)
{
cards[nbitems] = cardId;
nbitems++;
}
TestSuiteState::TestSuiteState()
{
players[0] = 0;
players[1] = 0;
}
void TestSuiteState::parsePlayerState(int playerId, string s)
{
size_t limiter = s.find(":");
string areaS;
int area;
if (limiter != string::npos)
{
areaS = s.substr(0, limiter);
if (areaS.compare("graveyard") == 0)
{
area = 0;
}
else if (areaS.compare("library") == 0)
{
area = 1;
}
else if (areaS.compare("hand") == 0)
{
area = 2;
}
else if (areaS.compare("inplay") == 0 || areaS.compare("battlefield") == 0)
{
area = 3;
}
else if (areaS.compare("life") == 0)
{
playerData[playerId].life = atoi((s.substr(limiter + 1)).c_str());
return;
}
else if (areaS.compare("manapool") == 0)
{
SAFE_DELETE(playerData[playerId].manapool);
playerData[playerId].manapool = ManaCost::parseManaCost(s.substr(limiter + 1));
return;
}
else
{
return; // ERROR
}
s = s.substr(limiter + 1);
while (s.size())
{
unsigned int value;
limiter = s.find(",");
if (limiter != string::npos)
{
string ss = s.substr(0, limiter); // ss is needed because trim requires a non-const reference,
value = Rules::getMTGId(trim(ss)); // while in g++ functions cannot take non-const references from temporary values
s = s.substr(limiter + 1);
}
else
{
value = Rules::getMTGId(trim(s));
s = "";
}
if (value) playerData[playerId].zones[area].add(value);
}
}
else
{
//ERROR
}
stringstream stream(s);
stream >> *players[playerId];
}
string TestSuite::getNextAction()
{
currentAction++;
@@ -353,24 +276,38 @@ string TestSuite::getNextAction()
return "";
}
MTGPlayerCards * TestSuite::buildDeck(int playerId)
MTGPlayerCards * TestSuite::buildDeck(Player* player, int playerId)
{
int list[100];
int nbcards = 0;
MTGPlayerCards * deck = NULL;
if(initState.players[playerId])
{
MTGGameZone * loadedPlayerZones[] = { initState.players[playerId]->game->graveyard,
initState.players[playerId]->game->library,
initState.players[playerId]->game->hand,
initState.players[playerId]->game->inPlay };
for (int j = 0; j < 4; j++)
{
for (int k = 0; k < initState.playerData[playerId].zones[j].nbitems; k++)
for (int k = 0; k < loadedPlayerZones[j]->cards.size(); k++)
{
int cardid = initState.playerData[playerId].zones[j].cards[k];
int cardid = loadedPlayerZones[j]->cards[k]->getId();
list[nbcards] = cardid;
nbcards++;
}
}
MTGPlayerCards * deck = NEW MTGPlayerCards(list, nbcards);
deck = NEW MTGPlayerCards(player, list, nbcards);
}
else
{
deck = NEW MTGPlayerCards();
}
return deck;
}
void TestSuite::initGame()
void TestSuite::initGame(GameObserver* g)
{
//The first test runs slowly, the other ones run faster.
//This way a human can see what happens when testing a specific file,
@@ -384,8 +321,7 @@ void TestSuite::initGame()
{
timerLimit = 3;
}
//Put the GameObserver in the initial state
GameObserver * g = GameObserver::GetInstance();
DebugTrace("TESTSUITE Init Game");
g->phaseRing->goToPhase(initState.phase, g->players[0]);
g->currentGamePhase = initState.phase;
@@ -393,20 +329,24 @@ void TestSuite::initGame()
{
AIPlayerBaka * p = (AIPlayerBaka *) (g->players[i]);
p->forceBestAbilityUse = forceAbility;
p->life = initState.playerData[i].life;
p->life = initState.players[i]->life;
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay };
MTGGameZone * loadedPlayerZones[] = { initState.players[i]->game->graveyard,
initState.players[i]->game->library,
initState.players[i]->game->hand,
initState.players[i]->game->inPlay };
for (int j = 0; j < 4; j++)
{
MTGGameZone * zone = playerZones[j];
for (int k = 0; k < initState.playerData[i].zones[j].nbitems; k++)
for (int k = 0; k < loadedPlayerZones[j]->cards.size(); k++)
{
MTGCardInstance * card = Rules::getCardByMTGId(initState.playerData[i].zones[j].cards[k]);
MTGCardInstance * card = Rules::getCardByMTGId(g, loadedPlayerZones[j]->cards[k]->getId());
if (card && zone != p->game->library)
{
if (zone == p->game->inPlay)
{
MTGCardInstance * copy = p->game->putInZone(card, p->game->library, p->game->stack);
Spell * spell = NEW Spell(copy);
Spell * spell = NEW Spell(g, copy);
spell->resolve();
if (!summoningSickness && p->game->inPlay->nb_cards > k) p->game->inPlay->cards[k]->summoningSickness = 0;
delete spell;
@@ -431,8 +371,9 @@ void TestSuite::initGame()
zone->cardsSeenThisTurn.clear(); //don't consider those cards as having moved in this area during this turn
}
p->game->stack->cardsSeenThisTurn.clear(); //don't consider those cards as having moved in this area during this turn
}
DebugTrace("TESTUITE Init Game Done !");
DebugTrace("TESTUITE Init Game Done !");
}
int TestSuite::Log(const char * text)
{
@@ -448,7 +389,7 @@ int TestSuite::Log(const char * text)
return 1;
}
int TestSuite::assertGame()
int TestSuite::assertGame(GameObserver* g)
{
//compare the game state with the results
char result[4096];
@@ -458,7 +399,6 @@ int TestSuite::assertGame()
int error = 0;
bool wasAI = false;
GameObserver * g = GameObserver::GetInstance();
if (g->currentGamePhase != endState.phase)
{
sprintf(result, "<span class=\"error\">==phase problem. Expected [ %s ](%i), got [ %s ](%i)==</span><br />",
@@ -472,27 +412,27 @@ int TestSuite::assertGame()
TestSuiteAI * p = (TestSuiteAI *) (g->players[i]);
if (p->playMode == Player::MODE_AI) wasAI = true;
if (p->life != endState.playerData[i].life)
if (p->life != endState.players[i]->life)
{
sprintf(result, "<span class=\"error\">==life problem for player %i. Expected %i, got %i==</span><br />", i,
endState.playerData[i].life, p->life);
endState.players[i]->life, p->life);
Log(result);
error++;
}
if (!p->getManaPool()->canAfford(endState.playerData[i].manapool))
if (!p->getManaPool()->canAfford(endState.players[i]->getManaPool()))
{
sprintf(result, "<span class=\"error\">==Mana problem. Was expecting %i but got %i for player %i==</span><br />",
endState.playerData[i].manapool->getConvertedCost(), p->getManaPool()->getConvertedCost(), i);
endState.players[i]->getManaPool()->getConvertedCost(), p->getManaPool()->getConvertedCost(), i);
Log(result);
error++;
}
if (!endState.playerData[i].manapool->canAfford(p->getManaPool()))
if (!endState.players[i]->getManaPool()->canAfford(p->getManaPool()))
{
sprintf(result, "<span class=\"error\">==Mana problem. Was expecting %i but got %i for player %i==</span><br />",
endState.playerData[i].manapool->getConvertedCost(), p->getManaPool()->getConvertedCost(), i);
endState.players[i]->getManaPool()->getConvertedCost(), p->getManaPool()->getConvertedCost(), i);
Log(result);
if ( endState.playerData[i].manapool->getConvertedCost() == p->getManaPool()->getConvertedCost())
if ( endState.players[i]->getManaPool()->getConvertedCost() == p->getManaPool()->getConvertedCost())
{
sprintf(result, "<span class=\"error\">====(Apparently Mana Color issues since converted cost is the same)==</span><br />");
Log(result);
@@ -501,27 +441,31 @@ int TestSuite::assertGame()
}
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay };
MTGGameZone * endstateZones[] = { endState.players[i]->game->graveyard,
endState.players[i]->game->library,
endState.players[i]->game->hand,
endState.players[i]->game->inPlay };
for (int j = 0; j < 4; j++)
{
MTGGameZone * zone = playerZones[j];
if (zone->nb_cards != endState.playerData[i].zones[j].nbitems)
if (zone->nb_cards != endstateZones[j]->nb_cards)
{
sprintf(
result,
"<span class=\"error\">==Card number not the same in player %i's %s==, expected %i, got %i</span><br />",
i, zone->getName(), endState.playerData[i].zones[j].nbitems, zone->nb_cards);
i, zone->getName(), endstateZones[j]->nb_cards, zone->nb_cards);
Log(result);
error++;
}
for (int k = 0; k < endState.playerData[i].zones[j].nbitems; k++)
for (int k = 0; k < endstateZones[j]->nb_cards; k++)
{
int cardid = endState.playerData[i].zones[j].cards[k];
if (cardid != -1)
MTGCardInstance* cardToCheck = (k<endstateZones[j]->cards.size())?endstateZones[j]->cards[k]:0;
if(cardToCheck)
{ // Can be NULL if used "*" in the testcase.
MTGCardInstance* card = Rules::getCardByMTGId(g, cardToCheck->getId());
if (card != 0 && !zone->hasCard(card))
{
MTGCardInstance * card = Rules::getCardByMTGId(cardid);
if (!card || !zone->hasCard(card))
{
sprintf(result, "<span class=\"error\">==Card ID not the same. Didn't find %i</span><br />", cardid);
sprintf(result, "<span class=\"error\">==Card ID not the same. Didn't find %i</span><br />", card->getId());
Log(result);
error++;
}
@@ -637,36 +581,23 @@ void TestSuiteActions::cleanup()
nbitems = 0;
}
void TestSuitePlayerZone::cleanup()
{
nbitems = 0;
}
void TestSuitePlayerData::cleanup()
{
if (manapool) delete manapool;
manapool = NULL;
manapool = NEW ManaCost();
for (int i = 0; i < 5; i++)
{
zones[i].cleanup();
}
life = 20;
}
void TestSuiteState::cleanup()
void TestSuiteState::cleanup(TestSuite* suite)
{
for (int i = 0; i < 2; i++)
{
playerData[i].cleanup();
SAFE_DELETE(players[i]);
}
players[0] = new TestSuiteAI(0, suite, 0);
players[1] = new TestSuiteAI(0, suite, 1);;
}
void TestSuite::cleanup()
{
currentAction = 0;
initState.cleanup();
endState.cleanup();
initState.cleanup(this);
endState.cleanup(this);
actions.cleanup();
loadRandValues("");
}
+2 -2
View File
@@ -31,7 +31,7 @@ int ThisDescriptor::matchValue(int value)
return 0;
}
ThisDescriptor * ThisDescriptorFactory::createThisDescriptor(string s)
ThisDescriptor * ThisDescriptorFactory::createThisDescriptor(GameObserver* observer, string s)
{
size_t found;
@@ -116,7 +116,7 @@ ThisDescriptor * ThisDescriptorFactory::createThisDescriptor(string s)
size_t start = s.find("{");
size_t end = s.find("}");
string counterString = s.substr(start + 1, end - start - 1);
AbilityFactory abf;
AbilityFactory abf(observer);
Counter * counter = abf.parseCounter(counterString, NULL);
if (counter)
{
+8
View File
@@ -26,3 +26,11 @@ Token::Token(string _name, MTGCardInstance * source, int _power, int _toughness)
defenser = NULL;
banding = NULL;
}
Token::Token(int id) :
MTGCardInstance()
{
isToken = true;
name = "dummyToken";
setMTGId(id);
}