diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index 3d3d56f25..970b07f3c 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -1,4 +1,4 @@ -OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/Blocker.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/ConstraintResolver.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DamageResolverLayer.o objs/DeckDataWrapper.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateDuel.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GuiCardsController.o objs/GuiLayers.o objs/GuiPhaseBar.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGGuiHand.o objs/MTGGuiPlay.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/PriceList.o objs/ReplacementEffects.o objs/ShopItem.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/TexturesCache.o objs/Token.o objs/Translate.o objs/utils.o objs/WEvent.o +OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/Blocker.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardSelector.o objs/ConstraintResolver.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DamageResolverLayer.o objs/DeckDataWrapper.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateDuel.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGGuiHand.o objs/MTGGuiPlay.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PriceList.o objs/ReplacementEffects.o objs/ShopItem.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/TexturesCache.o objs/Token.o objs/Translate.o objs/utils.o objs/WEvent.o DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS)) RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache) diff --git a/projects/mtg/bin/Res/graphics/BattleIcon.png b/projects/mtg/bin/Res/graphics/BattleIcon.png new file mode 100644 index 000000000..00e10971f Binary files /dev/null and b/projects/mtg/bin/Res/graphics/BattleIcon.png differ diff --git a/projects/mtg/bin/Res/graphics/DefenderIcon.png b/projects/mtg/bin/Res/graphics/DefenderIcon.png new file mode 100644 index 000000000..1c4d6c26e Binary files /dev/null and b/projects/mtg/bin/Res/graphics/DefenderIcon.png differ diff --git a/projects/mtg/bin/Res/graphics/gold.png b/projects/mtg/bin/Res/graphics/gold.png new file mode 100644 index 000000000..bf09620eb Binary files /dev/null and b/projects/mtg/bin/Res/graphics/gold.png differ diff --git a/projects/mtg/bin/Res/graphics/goldglow.png b/projects/mtg/bin/Res/graphics/goldglow.png new file mode 100644 index 000000000..765da4755 Binary files /dev/null and b/projects/mtg/bin/Res/graphics/goldglow.png differ diff --git a/projects/mtg/bin/Res/graphics/handback.png b/projects/mtg/bin/Res/graphics/handback.png new file mode 100644 index 000000000..3dada1cb5 Binary files /dev/null and b/projects/mtg/bin/Res/graphics/handback.png differ diff --git a/projects/mtg/bin/Res/graphics/mana.psi b/projects/mtg/bin/Res/graphics/mana.psi index 6c14812a9..34a5ab2f6 100644 Binary files a/projects/mtg/bin/Res/graphics/mana.psi and b/projects/mtg/bin/Res/graphics/mana.psi differ diff --git a/projects/mtg/bin/Res/graphics/manablack.psi b/projects/mtg/bin/Res/graphics/manablack.psi index 61db33ea1..6d192146d 100644 Binary files a/projects/mtg/bin/Res/graphics/manablack.psi and b/projects/mtg/bin/Res/graphics/manablack.psi differ diff --git a/projects/mtg/bin/Res/graphics/manablue.psi b/projects/mtg/bin/Res/graphics/manablue.psi index 5e0beeaea..e4f1afc69 100644 Binary files a/projects/mtg/bin/Res/graphics/manablue.psi and b/projects/mtg/bin/Res/graphics/manablue.psi differ diff --git a/projects/mtg/bin/Res/graphics/managreen.psi b/projects/mtg/bin/Res/graphics/managreen.psi index 48522d417..441bbe060 100644 Binary files a/projects/mtg/bin/Res/graphics/managreen.psi and b/projects/mtg/bin/Res/graphics/managreen.psi differ diff --git a/projects/mtg/bin/Res/graphics/manared.psi b/projects/mtg/bin/Res/graphics/manared.psi index f85f6f434..aa3af4301 100644 Binary files a/projects/mtg/bin/Res/graphics/manared.psi and b/projects/mtg/bin/Res/graphics/manared.psi differ diff --git a/projects/mtg/bin/Res/graphics/manawhite.psi b/projects/mtg/bin/Res/graphics/manawhite.psi index 600d6a58b..9fbe3e471 100644 Binary files a/projects/mtg/bin/Res/graphics/manawhite.psi and b/projects/mtg/bin/Res/graphics/manawhite.psi differ diff --git a/projects/mtg/bin/Res/graphics/menuside2.png b/projects/mtg/bin/Res/graphics/menuside2.png new file mode 100644 index 000000000..6f6919760 Binary files /dev/null and b/projects/mtg/bin/Res/graphics/menuside2.png differ diff --git a/projects/mtg/bin/Res/graphics/phasebar.png b/projects/mtg/bin/Res/graphics/phasebar.png index cc3797de2..a11640e0c 100644 Binary files a/projects/mtg/bin/Res/graphics/phasebar.png and b/projects/mtg/bin/Res/graphics/phasebar.png differ diff --git a/projects/mtg/bin/Res/graphics/shadow.png b/projects/mtg/bin/Res/graphics/shadow.png new file mode 100644 index 000000000..ae3e064cc Binary files /dev/null and b/projects/mtg/bin/Res/graphics/shadow.png differ diff --git a/projects/mtg/bin/Res/graphics/shop.jpg b/projects/mtg/bin/Res/graphics/shop.jpg index 50026a3da..fbb7267c9 100644 Binary files a/projects/mtg/bin/Res/graphics/shop.jpg and b/projects/mtg/bin/Res/graphics/shop.jpg differ diff --git a/projects/mtg/bin/Res/graphics/simon_pink.png b/projects/mtg/bin/Res/graphics/simon_pink.png new file mode 100644 index 000000000..1cda1af09 Binary files /dev/null and b/projects/mtg/bin/Res/graphics/simon_pink.png differ diff --git a/projects/mtg/bin/Res/graphics/wood.png b/projects/mtg/bin/Res/graphics/wood.png new file mode 100644 index 000000000..c5811a1f9 Binary files /dev/null and b/projects/mtg/bin/Res/graphics/wood.png differ diff --git a/projects/mtg/bin/Res/sets/black.jpg b/projects/mtg/bin/Res/sets/black.jpg new file mode 100644 index 000000000..ae6fadb43 Binary files /dev/null and b/projects/mtg/bin/Res/sets/black.jpg differ diff --git a/projects/mtg/bin/Res/sets/black_thumb.jpg b/projects/mtg/bin/Res/sets/black_thumb.jpg new file mode 100644 index 000000000..3bc2572d6 Binary files /dev/null and b/projects/mtg/bin/Res/sets/black_thumb.jpg differ diff --git a/projects/mtg/bin/Res/sets/blue.jpg b/projects/mtg/bin/Res/sets/blue.jpg new file mode 100644 index 000000000..805475927 Binary files /dev/null and b/projects/mtg/bin/Res/sets/blue.jpg differ diff --git a/projects/mtg/bin/Res/sets/blue_thumb.jpg b/projects/mtg/bin/Res/sets/blue_thumb.jpg new file mode 100644 index 000000000..ccaf91ab1 Binary files /dev/null and b/projects/mtg/bin/Res/sets/blue_thumb.jpg differ diff --git a/projects/mtg/bin/Res/sets/green.jpg b/projects/mtg/bin/Res/sets/green.jpg new file mode 100644 index 000000000..8c5ab4845 Binary files /dev/null and b/projects/mtg/bin/Res/sets/green.jpg differ diff --git a/projects/mtg/bin/Res/sets/green_thumb.jpg b/projects/mtg/bin/Res/sets/green_thumb.jpg new file mode 100644 index 000000000..399005bb2 Binary files /dev/null and b/projects/mtg/bin/Res/sets/green_thumb.jpg differ diff --git a/projects/mtg/bin/Res/sets/red.jpg b/projects/mtg/bin/Res/sets/red.jpg new file mode 100644 index 000000000..95eba7994 Binary files /dev/null and b/projects/mtg/bin/Res/sets/red.jpg differ diff --git a/projects/mtg/bin/Res/sets/red_thumb.jpg b/projects/mtg/bin/Res/sets/red_thumb.jpg new file mode 100644 index 000000000..06333cf12 Binary files /dev/null and b/projects/mtg/bin/Res/sets/red_thumb.jpg differ diff --git a/projects/mtg/bin/Res/sets/white.jpg b/projects/mtg/bin/Res/sets/white.jpg new file mode 100644 index 000000000..058288d3b Binary files /dev/null and b/projects/mtg/bin/Res/sets/white.jpg differ diff --git a/projects/mtg/bin/Res/sets/white_thumb.jpg b/projects/mtg/bin/Res/sets/white_thumb.jpg new file mode 100644 index 000000000..943bbdbc1 Binary files /dev/null and b/projects/mtg/bin/Res/sets/white_thumb.jpg differ diff --git a/projects/mtg/include/AIMomirPlayer.h b/projects/mtg/include/AIMomirPlayer.h index 5c839b816..bc86657c4 100644 --- a/projects/mtg/include/AIMomirPlayer.h +++ b/projects/mtg/include/AIMomirPlayer.h @@ -1,17 +1,17 @@ -#ifndef _AIMOMIRPLAYER_H_ -#define _AIMOMIRPLAYER_H_ - -#include "AIPlayer.h" - - -class AIMomirPlayer:public AIPlayerBaka{ -public: - AIMomirPlayer(MTGPlayerCards * _deck, char * file, const char * fileSmall, char * avatarFile); - int getEfficiency(AIAction * action); - int momir(); - int computeActions(); - static MTGAbility * momirAbility; - static MTGAbility * getMomirAbility(); -}; - -#endif \ No newline at end of file +#ifndef _AIMOMIRPLAYER_H_ +#define _AIMOMIRPLAYER_H_ + +#include "AIPlayer.h" + + +class AIMomirPlayer:public AIPlayerBaka{ +public: + AIMomirPlayer(MTGPlayerCards * deck, string file, string fileSmall, string avatarFile); + int getEfficiency(AIAction * action); + int momir(); + int computeActions(); + static MTGAbility * momirAbility; + static MTGAbility * getMomirAbility(); +}; + +#endif diff --git a/projects/mtg/include/AIPlayer.h b/projects/mtg/include/AIPlayer.h index 6976dcede..b8aee1adf 100644 --- a/projects/mtg/include/AIPlayer.h +++ b/projects/mtg/include/AIPlayer.h @@ -61,11 +61,11 @@ class AIPlayer: public Player{ int getCreaturesInfo(Player * player, int neededInfo = INFO_NBCREATURES , int untapMode = 0, int canAttack = 0); AIStats * getStats(); public: - void End(){}; + void End(){}; virtual int displayStack(){return 0;}; AIStats * stats; ManaCost * getPotentialMana(); - AIPlayer(MTGPlayerCards * _deck, string deckFile, string deckFileSmall); + AIPlayer(MTGPlayerCards * deck, string deckFile, string deckFileSmall); virtual ~AIPlayer(); virtual MTGCardInstance * chooseCard(TargetChooser * tc, MTGCardInstance * source, int random = 0); virtual int chooseTarget(TargetChooser * tc = NULL); @@ -86,7 +86,7 @@ class AIPlayerBaka: public AIPlayer{ float timer; MTGCardInstance * FindCardToPlay(ManaCost * potentialMana, const char * type); public: - AIPlayerBaka(MTGPlayerCards * _deck, char * deckFile, const char * deckfileSmall, char * avatarFile); + AIPlayerBaka(MTGPlayerCards * deck, string deckFile, string deckfileSmall, string avatarFile); virtual int Act(float dt); void initTimer(); virtual int computeActions(); diff --git a/projects/mtg/include/ActionLayer.h b/projects/mtg/include/ActionLayer.h index 278b63466..80cbd7797 100644 --- a/projects/mtg/include/ActionLayer.h +++ b/projects/mtg/include/ActionLayer.h @@ -25,12 +25,12 @@ class ActionLayer: public GuiLayer, public JGuiListener{ virtual void Update(float dt); int unstoppableRenderInProgress(); bool CheckUserInput(u32 key); - ActionLayer(int id, GameObserver* _game):GuiLayer(id, _game){ menuObject = NULL; abilitiesMenu = NULL; stuffHappened = 0;}; + ActionLayer(){ menuObject = NULL; abilitiesMenu = NULL; stuffHappened = 0;}; ~ActionLayer(); int cancelCurrentAction(); ActionElement * isWaitingForAnswer(); int isReactingToTargetClick(Targetable * card); - int receiveEvent(WEvent * event); + int receiveEventPlus(WEvent * event); int reactToTargetClick(Targetable * card); int isReactingToClick(MTGCardInstance * card); int reactToClick(MTGCardInstance * card); diff --git a/projects/mtg/include/ActionStack.h b/projects/mtg/include/ActionStack.h index cab1f31cc..662cb2307 100644 --- a/projects/mtg/include/ActionStack.h +++ b/projects/mtg/include/ActionStack.h @@ -45,6 +45,9 @@ class TargetChooser; class Interruptible: public PlayGuiObject, public Targetable{ public: + //TODO : remove these when they are back in PlayGuiObject + float x, y; + int state, display; MTGCardInstance * source; virtual void Entering(){mHasFocus = true;}; @@ -53,8 +56,8 @@ class Interruptible: public PlayGuiObject, public Targetable{ virtual int resolve(){return 0;}; virtual void Render(){}; int typeAsTarget(){return TARGET_STACKACTION;}; - Interruptible(int id,bool hasFocus = false):PlayGuiObject(id,40,x,y,hasFocus){state=NOT_RESOLVED;display=0;source=NULL;}; - virtual const char *getDisplayName(){return "stack object";}; + Interruptible(bool hasFocus = false):PlayGuiObject(40,x,y,hasFocus){state=NOT_RESOLVED;display=0;source=NULL;}; + virtual const string getDisplayName(){return "stack object";}; #if defined (WIN32) || defined (LINUX) virtual void Dump(); #endif @@ -79,7 +82,7 @@ class Spell: public Interruptible { ~Spell(); int resolve(); void Render(); - const char *getDisplayName(); + const string getDisplayName(); virtual ostream& toString(ostream& out) const; MTGCardInstance * getNextCardTarget(MTGCardInstance * previous = 0); Player * getNextPlayerTarget(Player * previous = 0); @@ -123,6 +126,7 @@ class DrawAction: public Interruptible { class ActionStack :public GuiLayer{ protected: + GameObserver* game; int interruptDecision[2]; float timer; int currentState; @@ -165,7 +169,7 @@ class ActionStack :public GuiLayer{ void Update(float dt); bool CheckUserInput(u32 key); virtual void Render(); - ActionStack(int id, GameObserver* _game); + ActionStack(GameObserver* game); int resolve(); int CombatDamages(); int CombatDamages(int firststrike); diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 15b9156a2..34c5671fc 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -12,6 +12,7 @@ #include "Token.h" #include "Counters.h" #include "WEvent.h" +#include "GuiStatic.h" #include #include @@ -29,8 +30,7 @@ class TrCardAddedToZone:public TriggeredAbility{ public: TargetChooser * toTc; TargetZoneChooser * fromTc; - TrCardAddedToZone(int id,MTGCardInstance * source, TargetChooser * toTc, TargetZoneChooser * fromTc = NULL):TriggeredAbility(id,source), toTc(toTc),fromTc(fromTc){ - } + TrCardAddedToZone(int id, MTGCardInstance * source, TargetChooser * toTc, TargetZoneChooser * fromTc = NULL):TriggeredAbility(id,source), toTc(toTc), fromTc(fromTc){} int resolve(){ return 0; //This is a trigger, this function should not be called @@ -63,8 +63,8 @@ class AACounter: public ActivatedAbility{ int nb; int power; int toughness; - AACounter(int id, MTGCardInstance * _source, MTGCardInstance * _target, int _power, int _toughness, int nb,ManaCost * cost=NULL, int doTap = 0):ActivatedAbility(id,_source,cost,0,doTap),nb(nb),power(_power),toughness(_toughness){ - target=_target; + AACounter(int id, MTGCardInstance * source, MTGCardInstance * target, int power, int toughness, int nb, ManaCost * cost = NULL, int doTap = 0) : ActivatedAbility(id, source, cost, 0, doTap), nb(nb), power(power), toughness(toughness) { + target = target; } @@ -1962,10 +1962,10 @@ class AAladdinsLamp: public TargetAbility{ int nbcards; int init; - AAladdinsLamp(int _id, MTGCardInstance * card):TargetAbility(_id,card){ + AAladdinsLamp(int id, MTGCardInstance * card) : TargetAbility(id,card) { cost = NEW ManaCost(); cost->x(); - cd = CardDisplay(1,game,SCREEN_WIDTH/2, SCREEN_HEIGHT/2,NULL); + cd = CardDisplay(1, game, SCREEN_WIDTH/2, SCREEN_HEIGHT/2, NULL); int zones[] = {MTGGameZone::MY_LIBRARY}; tc = NEW TargetZoneChooser(zones,1,source); nbcards = 0; @@ -2485,7 +2485,7 @@ class AGlassesOfUrza:public MTGAbility{ CardDisplay * display; bool isActive; AGlassesOfUrza(int _id, MTGCardInstance * _source):MTGAbility(_id, _source),isActive(false){ - display = NEW CardDisplay(0, game,SCREEN_WIDTH/2, SCREEN_HEIGHT/2,NULL); + display = NEW CardDisplay(0, game, SCREEN_WIDTH/2, SCREEN_HEIGHT/2,NULL); } void Update(float dt){ @@ -2979,7 +2979,7 @@ class APestilence: public ActivatedAbility{ for (int i = 0; i < 2 ; i++){ MTGInPlay * inplay = game->players[i]->game->inPlay; for (int j = inplay->nb_cards - 1 ; j >=0; j--){ - if (inplay->cards[j]->isACreature()) game->mLayers->stackLayer()->addDamage(source,inplay->cards[j],1); + if (inplay->cards[j]->isCreature()) game->mLayers->stackLayer()->addDamage(source,inplay->cards[j],1); } game->mLayers->stackLayer()->addDamage(source,game->players[i],1); } @@ -3489,7 +3489,7 @@ class ASoulNet:public ActivatedAbility{ int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL){ newDead = ((PutInGraveyard *) GameObserver::GetInstance()->mLayers->stackLayer()->getPrevious(NULL,ACTION_PUTINGRAVEYARD,RESOLVED_OK)); - if (newDead && newDead != latest && newDead->card->isACreature()) + if (newDead && newDead != latest && newDead->card->isCreature()) return ActivatedAbility::isReactingToClick(card,mana); return 0; } diff --git a/projects/mtg/include/CardDisplay.h b/projects/mtg/include/CardDisplay.h index 7a00520b2..f8a33c334 100644 --- a/projects/mtg/include/CardDisplay.h +++ b/projects/mtg/include/CardDisplay.h @@ -8,12 +8,14 @@ class MTGGameZone; class MTGCardInstance; class CardDisplay:public PlayGuiObjectController{ + int mId; + GameObserver* game; public: int x, y , start_item, nb_displayed_items; TargetChooser * tc; JGuiListener * listener; CardDisplay(); - CardDisplay(int id, GameObserver* _game, int _x, int _y, JGuiListener * _listener = NULL, TargetChooser * _tc = NULL, int _nb_displayed_items = 7 ); + CardDisplay(int id, GameObserver* game, int x, int y, JGuiListener * listener = NULL, TargetChooser * tc = NULL, int nb_displayed_items = 7); void AddCard(MTGCardInstance * _card); void rotateLeft(); void rotateRight(); @@ -27,7 +29,7 @@ class CardDisplay:public PlayGuiObjectController{ class DefaultTargetDisplay:CardDisplay{ public: - DefaultTargetDisplay(int id, GameObserver* _game, int _x, int _y, JGuiListener * _listener, int _nb_displayed_items ); + DefaultTargetDisplay(int id, GameObserver* game, int x, int y, JGuiListener * listener, int nb_displayed_items ); ~DefaultTargetDisplay(); }; diff --git a/projects/mtg/include/CardGui.h b/projects/mtg/include/CardGui.h index 672b8f66c..763ccce90 100644 --- a/projects/mtg/include/CardGui.h +++ b/projects/mtg/include/CardGui.h @@ -4,6 +4,7 @@ #define _CARD_GUI_H_ #include +#include "Pos.h" #include "PlayGuiObject.h" #include "MTGCardInstance.h" #include @@ -11,10 +12,53 @@ class MTGCardInstance; class PlayGuiObject; +struct CardGui : public PlayGuiObject { + protected: + JQuad* quad; + + public: + static const float Width = 28.0; + static const float Height = 40.0; + static const float BigWidth = 200.0; + static const float BigHeight = 285.0; + + MTGCardInstance* card; + CardGui(MTGCardInstance* card, float x, float y); + CardGui(MTGCardInstance* card, const Pos& ref); + virtual void Render() = 0; + void RenderBig(const Pos&); + virtual void Update(float dt) = 0; + + virtual ostream& toString(ostream&) const; +}; + +class CardView : public CardGui { + public: + + MTGCardInstance* getCard(); // remove this when possible + CardView(MTGCardInstance* card, float x, float y); + CardView(MTGCardInstance* card, const Pos& ref); + virtual void Render(); + void Render(JQuad* q){Pos::Render(q);}; + void RenderSelected(); + virtual void Update(float dt); + virtual ostream& toString(ostream&) const; +}; + +class TransientCardView : public CardView { + public: + TransientCardView(MTGCardInstance* card, float x, float y); + TransientCardView(MTGCardInstance* card, const Pos& ref); + virtual void Render(); +}; + + +/* class CardGui: public PlayGuiObject{ protected: hgeParticleSystem * mParticleSys; int alpha; + float actX, actY; public: MTGCardInstance * card; CardGui(int id, MTGCardInstance * _card, float desiredHeight, float _x=0, float _y=0, bool hasFocus = false); @@ -22,10 +66,13 @@ class CardGui: public PlayGuiObject{ virtual void Update(float dt); virtual ostream& toString(ostream& out) const; + float Height(); + float Width(); + void RenderBig(float x=-1, float y = -1, int alternate = 0); static void alternateRender(MTGCard * card, JQuad ** manaIcons, float x, float y, float rotation= 0, float scale=1); ~CardGui(); }; - +*/ #endif diff --git a/projects/mtg/include/Damage.h b/projects/mtg/include/Damage.h index 24e4e49cc..daa929c34 100644 --- a/projects/mtg/include/Damage.h +++ b/projects/mtg/include/Damage.h @@ -28,13 +28,13 @@ class Damageable:public Targetable { class Damage: public Interruptible { protected: - void init(MTGCardInstance * _source, Damageable * _target, int _damage); + void init(MTGCardInstance * source, Damageable * target, int damage); public: Damageable * target; int damage; void Render(); - Damage(int id, MTGCardInstance* _source, Damageable * _target); - Damage(int id, MTGCardInstance* _source, Damageable * _target, int _damage); + Damage(int id, MTGCardInstance* source, Damageable * target); + Damage(int id, MTGCardInstance* source, Damageable * target, int damage); int resolve(); virtual ostream& toString(ostream& out) const; }; @@ -43,7 +43,7 @@ class Damage: public Interruptible { class DamageStack :public GuiLayer, public Interruptible{ protected: int currentState; - + GameObserver* game; public: int resolve(); @@ -51,7 +51,7 @@ class DamageStack :public GuiLayer, public Interruptible{ int CombatDamages();//Deprecated ? int CombatDamages(int strike); virtual ostream& toString(ostream& out) const; - DamageStack(int id, GameObserver* _game); + DamageStack(GameObserver* game); }; diff --git a/projects/mtg/include/DamageResolverLayer.h b/projects/mtg/include/DamageResolverLayer.h index 7fddce436..9c5f4e0fa 100644 --- a/projects/mtg/include/DamageResolverLayer.h +++ b/projects/mtg/include/DamageResolverLayer.h @@ -9,8 +9,10 @@ class DamageStack; class DamageResolverLayer:public PlayGuiObjectController{ protected: + GameObserver* game; int trampleDamage(); void updateAllCoordinates(); + public: int buttonOk; int orderingIsNeeded; @@ -21,7 +23,7 @@ class DamageResolverLayer:public PlayGuiObjectController{ DamageStack * damageStack; DamagerDamaged * currentSource; - DamageResolverLayer(int id, GameObserver* _game); + DamageResolverLayer(GameObserver* game); int init(); int initResolve(); Player * whoSelectsDamagesDealtBy(MTGCardInstance * card); diff --git a/projects/mtg/include/DamagerDamaged.h b/projects/mtg/include/DamagerDamaged.h index 87fafcc97..4f6443aff 100644 --- a/projects/mtg/include/DamagerDamaged.h +++ b/projects/mtg/include/DamagerDamaged.h @@ -1,12 +1,12 @@ #ifndef _DAMAGERDAMAGED_H_ #define _DAMAGERDAMAGED_H_ -#include "../include/CardGui.h" +#include "../include/MTGCardInstance.h" class Player; -class DamagerDamaged:public CardGui{ - public: +struct DamagerDamaged { + MTGCardInstance* card; Player * damageSelecter; int mCount; Damage * damages[10]; @@ -18,12 +18,9 @@ class DamagerDamaged:public CardGui{ int removeDamagesFrom(DamagerDamaged * source); int sumDamages(); int hasLethalDamage(); - DamagerDamaged(CardGui * cardg, Player * _damageSelecter, bool _hasFocus); + DamagerDamaged(MTGCardInstance* card, Player * _damageSelecter, bool _hasFocus); ~DamagerDamaged(); void Render(Player * currentPlayer); - - - }; diff --git a/projects/mtg/include/DuelLayers.h b/projects/mtg/include/DuelLayers.h index d61369967..a0ed8c834 100644 --- a/projects/mtg/include/DuelLayers.h +++ b/projects/mtg/include/DuelLayers.h @@ -1,32 +1,51 @@ #ifndef _DUELLAYERS_H_ #define _DUELLAYERS_H_ - #include "GuiLayers.h" +#include "CardSelector.h" class MTGGuiHand; class MTGGuiPlay; class ActionLayer; class ActionStack; class DamageResolverLayer; +class GuiHandSelf; +class GuiHandOpponent; +class GuiCombat; +class Pos; -class DuelLayers: public GuiLayers{ +class DuelLayers { + protected: + int nbitems; + vector objects; + vector waiters; + GuiCombat* combat; + ActionLayer* action; + ActionStack* stack; + GuiHandSelf *hand; + +public: + DuelLayers(); + ~DuelLayers(); -public : ActionLayer * actionLayer(); - MTGGuiHand * handLayer(); - MTGGuiPlay * playLayer(); ActionStack * stackLayer(); - DamageResolverLayer * combatLayer(); void init(); + virtual void Update(float dt, Player * player); + void Render(); + void Add(GuiLayer * layer); + void Remove(); + int unstoppableRenderInProgress(); + int receiveEvent(WEvent * e); + float RightBoundary(); + + CardSelector* cs; }; #include "ActionLayer.h" #include "GameObserver.h" #include "MTGGamePhase.h" -#include "MTGGuiHand.h" -#include "MTGGuiPlay.h" #include "ActionStack.h" #include "Damage.h" diff --git a/projects/mtg/include/GameApp.h b/projects/mtg/include/GameApp.h index 8485b8585..c11039576 100644 --- a/projects/mtg/include/GameApp.h +++ b/projects/mtg/include/GameApp.h @@ -94,6 +94,6 @@ class GameApp: public JApp }; - +extern JQuad* manaIcons[7]; #endif diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 9a3144678..52478c76c 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -10,6 +10,7 @@ #include "TargetChooser.h" #include "PhaseRing.h" #include "ReplacementEffects.h" +#include "GuiStatic.h" class MTGGamePhase; class MTGAbility; @@ -30,10 +31,9 @@ class GameObserver{ int currentRound; int blockersAssigned; - + public: int blockersSorted; - int forceShuffleLibrary[2]; int turn; int forceShuffleLibraries(); int targetListIsSet(MTGCardInstance * card); @@ -78,11 +78,11 @@ class GameObserver{ void untapPhase(); void draw(); int isInPlay(MTGCardInstance * card); - int isACreature(MTGCardInstance * card); + bool isCreature(MTGCardInstance * card); void Update(float dt); void Render(); - void ButtonPressed(int, PlayGuiObject*); + void ButtonPressed(PlayGuiObject*); int receiveEvent(WEvent * event); }; diff --git a/projects/mtg/include/GameOptions.h b/projects/mtg/include/GameOptions.h index fd40a6e71..f6822b0ef 100644 --- a/projects/mtg/include/GameOptions.h +++ b/projects/mtg/include/GameOptions.h @@ -6,53 +6,47 @@ using std::map; using std::string; -#define OPTIONS_MUSICVOLUME "musicVolume" -#define OPTIONS_SFXVOLUME "sfxVolume" - -#define OPTIONS_DIFFICULTY_MODE_UNLOCKED "prx_handler" //huhu -#define OPTIONS_MOMIR_MODE_UNLOCKED "prx_rimom" //haha -#define OPTIONS_EVILTWIN_MODE_UNLOCKED "prx_eviltwin" -#define OPTIONS_RANDOMDECK_MODE_UNLOCKED "prx_rnddeck" - -#define OPTIONS_DIFFICULTY "difficulty" -#define OPTIONS_CACHESIZE "cacheSize" -#define OPTIONS_PLASMAEFFECT "plasmaEffect" -#define OPTIONS_INTERRUPTMYSPELLS "interruptMySpells" -#define OPTIONS_INTERRUPTMYABILITIES "interruptMyAbilities" -#define OPTIONS_OSD "displayOSD" - -// WALDORF - added -#define OPTIONS_INTERRUPT_SECONDS "interruptSeconds" - - #define OPTIONS_SAVEFILE RESPATH"/settings/options.txt" +struct Options { + static const string MUSICVOLUME; + static const string SFXVOLUME; + static const string DIFFICULTY_MODE_UNLOCKED; + static const string MOMIR_MODE_UNLOCKED; + static const string EVILTWIN_MODE_UNLOCKED; + static const string RANDOMDECK_MODE_UNLOCKED; + static const string DIFFICULTY; + static const string CACHESIZE; + static const string PLASMAEFFECT; + static const string INTERRUPT_SECONDS; + static const string INTERRUPTMYSPELLS; + static const string INTERRUPTMYABILITIES; + static const string OSD; +}; + class GameOption { public: - int value; - string svalue; - int getIntValue(); - GameOption(int _value = 0); + int number; + string str; + GameOption(int value = 0); + GameOption(string value); }; class GameOptions { public: - map values; - static GameOptions * GetInstance(); - static void Destroy(); int save(); int load(); - static const char * phaseInterrupts[]; - - private: + static const char * phaseInterrupts[]; + GameOption& operator[](string); GameOptions(); ~GameOptions(); - static GameOptions* mInstance; + private: static map optionsTypes; - - + map values; }; +extern GameOptions options; + #endif diff --git a/projects/mtg/include/GameStateDeckViewer.h b/projects/mtg/include/GameStateDeckViewer.h index aba620025..da1a7a349 100644 --- a/projects/mtg/include/GameStateDeckViewer.h +++ b/projects/mtg/include/GameStateDeckViewer.h @@ -6,8 +6,9 @@ #include -#include "GameState.h" -#include "SimpleMenu.h" +#include "../include/GameState.h" +#include "../include/SimpleMenu.h" +#include "../include/TexturesCache.h" #include "../include/CardGui.h" #include "../include/GameOptions.h" #include "../include/PriceList.h" @@ -116,7 +117,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener #if defined (WIN32) || defined (LINUX) char buf[4096]; sprintf(buf,"Loadindexes[%i] is NULL\n", i); - if(_current) sprintf(buf, "LoadIndexes[%i] : %s\n", i, _current->getName()); + if(_current) sprintf(buf, "LoadIndexes[%i] : %s\n", i, _current->getName().c_str()); OutputDebugString(buf); #endif _current = displayed_deck->getNext(_current,colorFilter); @@ -187,7 +188,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener welcome_menu->Add(nbDecks+1, "--NEW--"); welcome_menu->Add(-1, "Cancel"); - if (GameApp::HasMusic && GameOptions::GetInstance()->values[OPTIONS_MUSICVOLUME].getIntValue() > 0){ + if (GameApp::HasMusic && options[Options::MUSICVOLUME].number > 0){ if (GameApp::music){ JSoundSystem::GetInstance()->StopMusic(GameApp::music); SAFE_DELETE(GameApp::music); @@ -617,7 +618,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener int showName = 1; if (mParent->cache->isInCache(card) || last_user_activity > (abs(2-id) + 1)* NO_USER_ACTIVITY_SHOWCARD_DELAY){ - quad = card->getQuad(mParent->cache); + quad = cache.getQuad(card); showName = 0; } @@ -638,8 +639,8 @@ class GameStateDeckViewer: public GameState, public JGuiListener mFont->SetScale(scaleBackup); } }else{ - CardGui::alternateRender(card, mIcons, x_center, y + 142.5*scale, 0, scale); - quad = card->getThumb(); + // CardGui::alternateRender(card, mIcons, x_center, y + 142.5*scale, 0, scale); + quad = cache.getThumb(card); if (quad){ float _scale = 285 * scale / quad->mHeight; quad->SetColor(ARGB(40,255,255,255)); @@ -782,7 +783,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener pricelist->setPrice(card->getMTGId(),price*2); #if defined (WIN32) || defined (LINUX) char buf[4096]; - sprintf(buf, "CARD'S NAME : %s", card->getName()); + sprintf(buf, "CARD'S NAME : %s", card->getName().c_str()); OutputDebugString(buf); #endif playerdata->collection->remove(card->getMTGId()); diff --git a/projects/mtg/include/GuiCardsController.h b/projects/mtg/include/GuiCardsController.h index abdea55df..dab6d2b7e 100644 --- a/projects/mtg/include/GuiCardsController.h +++ b/projects/mtg/include/GuiCardsController.h @@ -6,7 +6,7 @@ class GuiCardsController : public PlayGuiObjectController{ public: - GuiCardsController(int id, GameObserver* _game):PlayGuiObjectController(id, _game){}; + GuiCardsController(){}; }; diff --git a/projects/mtg/include/GuiLayers.h b/projects/mtg/include/GuiLayers.h index 1256cf378..b62bbe8fd 100644 --- a/projects/mtg/include/GuiLayers.h +++ b/projects/mtg/include/GuiLayers.h @@ -1,8 +1,6 @@ #ifndef _GUI_LAYERS_H_ #define _GUI_LAYERS_H_ -#define MAX_GUI_LAYERS 7 - #define DIR_DOWN 1 #define DIR_UP 2 #define DIR_LEFT 3 @@ -14,16 +12,13 @@ class GameObserver; class Player; - class GuiLayer{ protected: - GameObserver * game; - int mId; u32 mActionButton; public: int mCount; int mCurr; - vectormObjects; + vector mObjects; void Add(JGuiObject * object); int Remove(JGuiObject * object); int modal; @@ -32,7 +27,7 @@ class GuiLayer{ int getMaxId(); void RenderMessageBackground(float x0, float y0, float width, int height); void RenderMessageBackground(float y0, int height); - GuiLayer(int id, GameObserver* _game); + GuiLayer(); virtual ~GuiLayer(); virtual void Update(float dt); virtual bool CheckUserInput(u32 key){ return false; }; @@ -45,23 +40,8 @@ class GuiLayer{ return 1; }; - virtual int receiveEvent(WEvent * e){return 0;}; -}; - -class GuiLayers{ - protected: - int nbitems; - GuiLayer * objects[MAX_GUI_LAYERS]; - public: - GuiLayers(); - virtual void Update(float dt, Player * player); - void Render(); - void Add(GuiLayer * layer); - void Remove(); - int unstoppableRenderInProgress(); - ~GuiLayers(); - int receiveEvent(WEvent * e); - + virtual int receiveEventPlus(WEvent * e){return 0;}; + virtual int receiveEventMinus(WEvent * e){return 0;}; }; #endif diff --git a/projects/mtg/include/GuiPhaseBar.h b/projects/mtg/include/GuiPhaseBar.h index 912c5f92b..de7abd6f5 100644 --- a/projects/mtg/include/GuiPhaseBar.h +++ b/projects/mtg/include/GuiPhaseBar.h @@ -17,11 +17,11 @@ class GuiPhaseBar : public GuiLayer float angle; public: - GuiPhaseBar(GameObserver* game); + GuiPhaseBar(); ~GuiPhaseBar(); void Update(float dt); virtual void Render(); - virtual int receiveEvent(WEvent * e); + virtual int receiveEventMinus(WEvent * e); }; #endif // _GUIPHASEBAR_H_ diff --git a/projects/mtg/include/MTGCard.h b/projects/mtg/include/MTGCard.h index b574b7dfd..7f5c27e8a 100644 --- a/projects/mtg/include/MTGCard.h +++ b/projects/mtg/include/MTGCard.h @@ -10,51 +10,35 @@ #define MTG_MINIIMAGE_WIDTH 45 #define MTG_MINIIMAGE_HEIGHT 64 - #define MAX_TYPES_PER_CARD 10 - - -#include "ManaCost.h" - - -class TexturesCache; - - #include #include #include + +#include "ManaCost.h" + using namespace std; class MTGCard { protected: - - - int mtgid; ManaCost manaCost; - - char rarity; - char image_name[MTGCARD_NAME_SIZE]; - + vector ftdText; int init(); - public: - TexturesCache * mCache; string text; string name; int colors[Constants::MTG_NB_COLORS]; map basicAbilities; - vector formattedText; string magicText; int alias; string spellTargetType; - int formattedTextInit; int power; int toughness; int setId; @@ -62,11 +46,8 @@ class MTGCard { int nb_types; int types[MAX_TYPES_PER_CARD]; MTGCard(); - MTGCard(TexturesCache * cache, int set_id); + MTGCard(int set_id); MTGCard(MTGCard * source); - JQuad * getQuad(TexturesCache * cache); - JQuad * getQuad(int type=1); - JQuad * getThumb(); void setColor(int _color, int removeAllOthers = 0); int getColor(); @@ -87,13 +68,13 @@ class MTGCard { //void setImageName( char * value); char * getImageName (); - void setText( string value); + void setText(string value); const char * getText(); void addMagicText(string value); - void setName( string value); - const char * getName(); + void setName(string value); + const string getName() const; void addType(char * type_text); void addType(int id); @@ -101,22 +82,24 @@ class MTGCard { void setSubtype( string value); int removeType(string value, int removeAll = 0); int removeType(int value, int removeAll = 0); - int hasSubtype(int _subtype); - int hasSubtype(const char * _subtype); - int hasSubtype(string _subtype); - int hasType(int _type); - int hasType(const char * type); + bool hasSubtype(int _subtype); + bool hasSubtype(const char * _subtype); + bool hasSubtype(string _subtype); + bool hasType(int _type); + bool hasType(const char * type); void setManaCost(string value); ManaCost * getManaCost(); - int isACreature(); + bool isCreature(); + bool isLand(); + bool isSpell(); void setPower(int _power); int getPower(); void setToughness(int _toughness); int getToughness(); - + const vector& formattedText(); }; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 50257cfca..97391e960 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -20,6 +20,7 @@ class ManaCost; class UntapBlockers; class CardDescriptor; class Counters; +class Pos; #include using namespace std; @@ -41,6 +42,7 @@ class MTGCardInstance: public MTGCard, public Damageable { int setDefenser(MTGCardInstance * c); int setAttacker(int value); public: + Pos* view; int regenerateTokens; bool isToken; int stillInUse(); @@ -58,7 +60,7 @@ class MTGCardInstance: public MTGCard, public Damageable { Player * owner; Counters * counters; int typeAsTarget(){return TARGET_CARD;} - const char * getDisplayName(); + const string getDisplayName(); MTGCardInstance * target; void addType(int type); @@ -94,7 +96,6 @@ class MTGCardInstance: public MTGCard, public Damageable { int regenerate(); int triggerRegenerate(); Player * controller(); - JQuad * getIcon(); ~MTGCardInstance(); int bury(); diff --git a/projects/mtg/include/MTGDeck.h b/projects/mtg/include/MTGDeck.h index cb7572f14..763238044 100644 --- a/projects/mtg/include/MTGDeck.h +++ b/projects/mtg/include/MTGDeck.h @@ -4,12 +4,6 @@ #define MTG_ERROR -1 #include "../include/MTGDefinitions.h" - - - - - - #include "../include/GameApp.h" #include "../include/TexturesCache.h" diff --git a/projects/mtg/include/MTGGameZones.h b/projects/mtg/include/MTGGameZones.h index 90a3fc5e6..d452b38ab 100644 --- a/projects/mtg/include/MTGGameZones.h +++ b/projects/mtg/include/MTGGameZones.h @@ -16,7 +16,7 @@ class Player; class MTGGameZone { protected: - + public: enum{ @@ -65,26 +65,27 @@ class MTGGameZone { }; Player * owner; - //Both cards and cardsMap contain the cards of a zone. The long term objective is to get rid of the array - vector cards; //[MTG_MAX_PLAYER_CARDS]; - map cardsMap; - int nb_cards; - MTGGameZone(); - ~MTGGameZone(); - void shuffle(); - virtual MTGCardInstance * draw(); - void addCard(MTGCardInstance * card); - void debugPrint(); - MTGCardInstance * removeCard(MTGCardInstance * card, int createCopy = 1); - MTGCardInstance * hasCard(MTGCardInstance * card); - void cleanupPhase(); - int countByType(const char * value); - int hasType(const char * value); - void setOwner(Player * player); - MTGCardInstance * lastCardDrawn; - static MTGGameZone * stringToZone(string zoneName, MTGCardInstance * source, MTGCardInstance * target); - static int zoneStringToId(string zoneName); - static MTGGameZone *intToZone(int zoneId, MTGCardInstance * source = NULL,MTGCardInstance * target = NULL); + //Both cards and cardsMap contain the cards of a zone. The long term objective is to get rid of the array + vector cards; //[MTG_MAX_PLAYER_CARDS]; + map cardsMap; + int nb_cards; + MTGGameZone(); + ~MTGGameZone(); + void shuffle(); + virtual MTGCardInstance * draw(); + void addCard(MTGCardInstance * card); + void debugPrint(); + MTGCardInstance * removeCard(MTGCardInstance * card, int createCopy = 1); + MTGCardInstance * hasCard(MTGCardInstance * card); + void cleanupPhase(); + int countByType(const char * value); + int hasType(const char * value); + void setOwner(Player * player); + MTGCardInstance * lastCardDrawn; + static MTGGameZone * stringToZone(string zoneName, MTGCardInstance * source, MTGCardInstance * target); + static int zoneStringToId(string zoneName); + static MTGGameZone *intToZone(int zoneId, MTGCardInstance * source = NULL,MTGCardInstance * target = NULL); + bool needShuffle; }; class MTGLibrary: public MTGGameZone { diff --git a/projects/mtg/include/MTGGuiHand.h b/projects/mtg/include/MTGGuiHand.h index 43545f8df..fd350ef6d 100644 --- a/projects/mtg/include/MTGGuiHand.h +++ b/projects/mtg/include/MTGGuiHand.h @@ -17,17 +17,18 @@ class GuiCardscontroller; class MTGGuiHand: public GuiCardsController{ protected: + GameObserver* game; int currentId[2]; Player * currentPlayer; int mShowHand; float mAnimState; JLBFont * mFont; public: - MTGGuiHand(int id, GameObserver * _game); + MTGGuiHand(GameObserver*); void Update(float dt); bool CheckUserInput(u32 key); virtual void Render(); - void updateCards(); + void updateCards(); void showHand (bool show);// WALDORF - added }; diff --git a/projects/mtg/include/MTGGuiPlay.h b/projects/mtg/include/MTGGuiPlay.h index e96cb23c3..82b41164e 100644 --- a/projects/mtg/include/MTGGuiPlay.h +++ b/projects/mtg/include/MTGGuiPlay.h @@ -12,6 +12,7 @@ class CardGui; class MTGGuiPlay: public PlayGuiObjectController { protected: + GameObserver* game; int offset; Player * currentPlayer; MTGCardInstance * cardsGrid[SCREEN_WIDTH/5][SCREEN_HEIGHT/5]; @@ -43,14 +44,14 @@ class MTGGuiPlay: public PlayGuiObjectController { void adjustCardPosition(CardGui * cardg); public: CardGui * getByCard(MTGCardInstance * card); - MTGGuiPlay(int id, GameObserver * game); + MTGGuiPlay(GameObserver * game); ~MTGGuiPlay(); void Update(float dt); bool CheckUserInput(u32 key); virtual void Render(); void forceUpdateCards(); void updateCards(); - int receiveEvent(WEvent * e); + int receiveEventPlus(WEvent * e); }; diff --git a/projects/mtg/include/PhaseRing.h b/projects/mtg/include/PhaseRing.h index 8a2f6fbbb..7a111d0c3 100644 --- a/projects/mtg/include/PhaseRing.h +++ b/projects/mtg/include/PhaseRing.h @@ -14,7 +14,7 @@ class Phase{ public: int id; Player * player; - Phase(int _id, Player * _player):id(_id),player(_player){}; + Phase(int id, Player *player):id(id),player(player){}; }; class PhaseRing{ diff --git a/projects/mtg/include/PlayGuiObject.h b/projects/mtg/include/PlayGuiObject.h index 40e97c39b..3f1d19dc4 100644 --- a/projects/mtg/include/PlayGuiObject.h +++ b/projects/mtg/include/PlayGuiObject.h @@ -11,12 +11,11 @@ #define GUI_LIBRARY 4 #include +#include "Effects.h" +#include "WEvent.h" +#include "Pos.h" -class MTGGameZone; -class Player; -class CardDisplay; - -class PlayGuiObject: public JGuiObject, public JGuiListener{ +class PlayGuiObject: public JGuiObject, public JGuiListener, public Pos{ protected: public: @@ -24,59 +23,17 @@ class PlayGuiObject: public JGuiObject, public JGuiListener{ float mHeight; float defaultHeight; bool mHasFocus; - int x; - int y; int type; virtual void Entering(){mHasFocus = true;}; virtual bool Leaving(u32 key){mHasFocus = false;return true;}; virtual bool ButtonPressed(){return true;}; - virtual void Render(){}; + virtual void Render(); virtual void Update(float dt); - PlayGuiObject(int id, float desiredHeight,float _x, float _y, bool hasFocus); + PlayGuiObject(float desiredHeight, float x, float y, bool hasFocus); + PlayGuiObject(float desiredHeight, const Pos& ref, bool hasFocus); virtual void ButtonPressed(int controllerId, int controlId){}; virtual ~PlayGuiObject(){}; - + vector effects; }; -class GuiAvatar: public PlayGuiObject{ - protected: - - int avatarRed; - int currentLife; - public: - Player * player; - virtual void Render(); - GuiAvatar(int id, float desiredHeight,float _x, float _y, bool hasFocus,Player * _player); - virtual ostream& toString(ostream& out) const; -}; - -class GuiGameZone: public PlayGuiObject{ - protected: - MTGGameZone * zone; - - public: - CardDisplay * cd; - int showCards; - virtual void Render(); - virtual void Update(float dt); - GuiGameZone(int id, float desiredHeight,float _x, float _y, bool hasFocus,MTGGameZone * _zone); - ~GuiGameZone(); - virtual void ButtonPressed(int controllerId, int controlId); - void toggleDisplay(); - virtual ostream& toString(ostream& out) const; -}; - -class GuiGraveyard: public GuiGameZone{ - public: - GuiGraveyard(int id, float desiredHeight,float _x, float _y, bool hasFocus,Player * player); - virtual ostream& toString(ostream& out) const; -}; - -class GuiLibrary: public GuiGameZone{ - public: - GuiLibrary(int id, float desiredHeight,float _x, float _y, bool hasFocus,Player * player); - virtual ostream& toString(ostream& out) const; -}; - - #endif diff --git a/projects/mtg/include/PlayGuiObjectController.h b/projects/mtg/include/PlayGuiObjectController.h index 9429160cf..11ccbb971 100644 --- a/projects/mtg/include/PlayGuiObjectController.h +++ b/projects/mtg/include/PlayGuiObjectController.h @@ -14,7 +14,7 @@ class PlayGuiObjectController : public GuiLayer{ public: virtual void Update(float dt); virtual bool CheckUserInput(u32 key); - PlayGuiObjectController(int id, GameObserver* _game):GuiLayer(id, _game){last_user_move=0;}; + PlayGuiObjectController(){last_user_move=0;}; virtual void Render(){GuiLayer::Render();}; }; diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 23dc832a4..07768168e 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -17,14 +17,14 @@ class Player: public Damageable{ public: virtual void End(); int typeAsTarget(){return TARGET_PLAYER;} - const char * getDisplayName(); + const string getDisplayName(); virtual int displayStack(){return 1;} JTexture * mAvatarTex; JQuad * mAvatar; int canPutLandsIntoPlay; MTGPlayerCards * game; int afterDamage(); - Player(MTGPlayerCards * _deck, string deckFile, string deckFileSmall); + Player(MTGPlayerCards * deck, string deckFile, string deckFileSmall); virtual ~Player(); void unTapPhase(); MTGInPlay * inPlay(); @@ -41,7 +41,7 @@ class Player: public Damageable{ class HumanPlayer: public Player{ public: - HumanPlayer(MTGPlayerCards * _deck, char * _deckFile, string _deckFileSmall); + HumanPlayer(MTGPlayerCards * deck, string deckFile, string deckFileSmall); }; diff --git a/projects/mtg/include/TargetChooser.h b/projects/mtg/include/TargetChooser.h index 27b76ca3c..aa4d21675 100644 --- a/projects/mtg/include/TargetChooser.h +++ b/projects/mtg/include/TargetChooser.h @@ -37,14 +37,14 @@ class TargetChooser: public TargetsList { TargetChooser(MTGCardInstance * card = NULL, int _maxtargets = -1); - MTGCardInstance * source; + MTGCardInstance * source; MTGCardInstance * targetter; //Optional, usually equals source, used for protection from... int maxtargets; //Set to -1 for "unlimited" virtual int targetsZone(MTGGameZone * z){return 0;}; int ForceTargetListReady(); int targetsReadyCheck(); virtual int addTarget(Targetable * target); - virtual int canTarget(Targetable * _target); + virtual bool canTarget(Targetable * _target); virtual int full(){if (maxtargets != -1 && cursor>=maxtargets) {return 1;} else{return 0;}}; virtual int ready(){return cursor;}; virtual ~TargetChooser(){}; @@ -61,7 +61,6 @@ class TargetChooserFactory{ }; - class TargetZoneChooser:public TargetChooser{ public: int zones[10]; @@ -70,16 +69,15 @@ class TargetZoneChooser:public TargetChooser{ int targetsZone(MTGGameZone * z); TargetZoneChooser(MTGCardInstance * card = NULL, int _maxtargets = 1); TargetZoneChooser(int * _zones, int _nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1); - virtual int canTarget(Targetable * _card); + virtual bool canTarget(Targetable * _card); }; class CardTargetChooser:public TargetZoneChooser { - protected: MTGCardInstance * validTarget; public: - CardTargetChooser(MTGCardInstance * _card, MTGCardInstance * source,int * _zones = NULL, int _nbzones = 0); - virtual int canTarget(Targetable * target ); + CardTargetChooser(MTGCardInstance * card, MTGCardInstance * source, int * zones = NULL, int nbzones = 0); + virtual bool canTarget(Targetable * target); }; @@ -89,7 +87,7 @@ class CreatureTargetChooser:public TargetZoneChooser{ int maxtoughness; CreatureTargetChooser(int * _zones, int _nbzones,MTGCardInstance * card = NULL, int _maxtargets = 1); CreatureTargetChooser(MTGCardInstance * card = NULL, int _maxtargets = 1); - virtual int canTarget(Targetable * _card); + virtual bool canTarget(Targetable * _card); }; @@ -98,7 +96,7 @@ class DamageableTargetChooser:public CreatureTargetChooser{ public: DamageableTargetChooser(int * _zones, int _nbzones,MTGCardInstance * card = NULL, int _maxtargets = 1):CreatureTargetChooser( _zones,_nbzones, card, _maxtargets){}; DamageableTargetChooser(MTGCardInstance * card = NULL, int _maxtargets = 1):CreatureTargetChooser(card, _maxtargets){}; - virtual int canTarget(Targetable * target); + virtual bool canTarget(Targetable * target); }; @@ -107,7 +105,7 @@ protected: Player * p; //In Case we can only target a specific player public: PlayerTargetChooser(MTGCardInstance * card = NULL, int _maxtargets = 1, Player *_p = NULL); - virtual int canTarget(Targetable * target); + virtual bool canTarget(Targetable * target); }; class TypeTargetChooser:public TargetZoneChooser{ @@ -118,7 +116,7 @@ class TypeTargetChooser:public TargetZoneChooser{ TypeTargetChooser(const char * _type, int * _zones, int nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1); void addType(int type); void addType(const char * type); - virtual int canTarget(Targetable * targe); + virtual bool canTarget(Targetable * targe); }; class DescriptorTargetChooser:public TargetZoneChooser{ @@ -126,7 +124,7 @@ class DescriptorTargetChooser:public TargetZoneChooser{ CardDescriptor * cd; DescriptorTargetChooser(CardDescriptor * _cd, MTGCardInstance * card = NULL, int _maxtargets = 1); DescriptorTargetChooser(CardDescriptor * _cd, int * _zones, int nbzones, MTGCardInstance * card = NULL, int _maxtargets = 1); - virtual int canTarget(Targetable * target); + virtual bool canTarget(Targetable * target); ~DescriptorTargetChooser(); }; @@ -135,14 +133,14 @@ class SpellTargetChooser:public TargetChooser{ public: int color; SpellTargetChooser( MTGCardInstance * card = NULL,int _color = -1, int _maxtargets = 1 ); - virtual int canTarget(Targetable * target); + virtual bool canTarget(Targetable * target); }; class SpellOrPermanentTargetChooser:public TargetZoneChooser{ public: int color; SpellOrPermanentTargetChooser(MTGCardInstance * card = NULL,int _color = -1 , int _maxtargets = 1); - virtual int canTarget(Targetable * target); + virtual bool canTarget(Targetable * target); }; @@ -152,13 +150,13 @@ class DamageTargetChooser:public TargetChooser{ int color; int state; DamageTargetChooser( MTGCardInstance * card = NULL,int _color = -1 , int _maxtargets = 1, int state = NOT_RESOLVED); - virtual int canTarget(Targetable * target); + virtual bool canTarget(Targetable * target); }; class DamageOrPermanentTargetChooser:public TargetZoneChooser{ public: int color; DamageOrPermanentTargetChooser(MTGCardInstance * card = NULL,int _color = -1 , int _maxtargets = 1); - virtual int canTarget(Targetable * target); + virtual bool canTarget(Targetable * target); }; #endif diff --git a/projects/mtg/include/Targetable.h b/projects/mtg/include/Targetable.h index f55446793..866d1eef1 100644 --- a/projects/mtg/include/Targetable.h +++ b/projects/mtg/include/Targetable.h @@ -8,7 +8,7 @@ class Targetable{ public: virtual int typeAsTarget() = 0; - virtual const char * getDisplayName() =0; + virtual const string getDisplayName() = 0; }; #endif diff --git a/projects/mtg/include/TexturesCache.h b/projects/mtg/include/TexturesCache.h index 0a91c5305..e68e63d14 100644 --- a/projects/mtg/include/TexturesCache.h +++ b/projects/mtg/include/TexturesCache.h @@ -43,7 +43,6 @@ class TexturesCache{ int nb_textures; int delete_previous; int totalsize; - int maxSize; CardTexture * cache[MAX_CACHE_OBJECTS]; public: int isInCache(MTGCard * card, int type=CACHE_CARD); @@ -55,8 +54,8 @@ class TexturesCache{ int getCacheById(int id, int type=CACHE_CARD); JQuad * getQuad(MTGCard * card, int type=CACHE_CARD); JQuad * getThumb(MTGCard * card){return getQuad(card, CACHE_THUMB);}; - }; +extern TexturesCache cache; class SampleCached{ diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 0f6b9de91..e393277fd 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -1,96 +1,100 @@ -#ifndef _WEVENT_H_ -#define _WEVENT_H_ - -class MTGCardInstance; -class MTGGameZone; -class Damage; -class Phase; -class Targetable; - -class WEvent{ -public: - enum{ - NOT_SPECIFIED = 0, - CHANGE_ZONE = 1, - DAMAGE = 2, - CHANGE_PHASE = 3, - }; - int type; //Deprecated, use dynamic casting instead - WEvent(int _type = NOT_SPECIFIED); - virtual ~WEvent() {}; -}; - -class WEventZoneChange: public WEvent{ -public: - MTGCardInstance * card; - MTGGameZone * from; - MTGGameZone * to; - WEventZoneChange(MTGCardInstance * _card, MTGGameZone * _from, MTGGameZone *_to); - virtual ~WEventZoneChange() {}; -}; - - -class WEventDamage: public WEvent{ -public: - Damage * damage; - WEventDamage(Damage * _damage); -}; - -class WEventPhaseChange: public WEvent{ -public: - Phase * from; - Phase * to; - WEventPhaseChange(Phase * _from, Phase * _to); -}; - - -//Abstract class of event when a card's status changes -class WEventCardUpdate: public WEvent{ -public: - MTGCardInstance * card; - WEventCardUpdate(MTGCardInstance * card):WEvent(),card(card){}; -}; - -//Event when a card is tapped/untapped -class WEventCardTap: public WEventCardUpdate{ -public: - bool before; - bool after; - WEventCardTap(MTGCardInstance * card, bool before, bool after); -}; - -//Event when a card's "attacker" status changes -//before:Player/Planeswalker that card was attacking previously -//after: Player/Planeswalker that card is attacking now -class WEventCreatureAttacker: public WEventCardUpdate{ -public: - Targetable * before; - Targetable * after; - WEventCreatureAttacker(MTGCardInstance * card,Targetable * from, Targetable * to); - -}; - -//Event when a card's "defenser" status changes -//before : attacker that card was blocking previously -//after: attacker that card is blocking now -class WEventCreatureBlocker: public WEventCardUpdate{ -public: - MTGCardInstance * before; - MTGCardInstance * after; - WEventCreatureBlocker(MTGCardInstance * card,MTGCardInstance * from,MTGCardInstance * to); - -}; - -//Event when a blocker is reordered -//exchangeWith: exchange card's position with exchangeWith's position -//attacker:both card and exchangeWith *should* be in attacker's "blockers" list. -class WEventCreatureBlockerRank: public WEventCardUpdate{ -public: - MTGCardInstance * exchangeWith; - MTGCardInstance * attacker; - WEventCreatureBlockerRank(MTGCardInstance * card,MTGCardInstance * exchangeWith, MTGCardInstance * attacker); - -}; - - -#endif +#ifndef _WEVENT_H_ +#define _WEVENT_H_ + +class MTGCardInstance; +class MTGGameZone; +class Damage; +class Phase; +class Targetable; + +class WEvent{ +public: + enum{ + NOT_SPECIFIED = 0, + CHANGE_ZONE = 1, + DAMAGE = 2, + CHANGE_PHASE = 3, + }; + int type; //Deprecated, use dynamic casting instead + WEvent(int type = NOT_SPECIFIED); + virtual ~WEvent() {}; +}; + +struct WEventZoneChange: public WEvent{ + MTGCardInstance * card; + MTGGameZone * from; + MTGGameZone * to; + WEventZoneChange(MTGCardInstance * card, MTGGameZone * from, MTGGameZone *to); + virtual ~WEventZoneChange() {}; +}; + + +struct WEventDamage: public WEvent{ + Damage * damage; + WEventDamage(Damage * damage); +}; + +struct WEventPhaseChange: public WEvent{ + Phase * from; + Phase * to; + WEventPhaseChange(Phase * from, Phase * to); +}; + + +//Abstract class of event when a card's status changes +struct WEventCardUpdate: public WEvent{ + MTGCardInstance * card; + WEventCardUpdate(MTGCardInstance * card); +}; + +//Event when a card is tapped/untapped +struct WEventCardTap: public WEventCardUpdate{ + bool before; + bool after; + WEventCardTap(MTGCardInstance * card, bool before, bool after); +}; + +//Event when a card's "attacker" status changes +//before:Player/Planeswalker that card was attacking previously +//after: Player/Planeswalker that card is attacking now +struct WEventCreatureAttacker: public WEventCardUpdate{ + Targetable * before; + Targetable * after; + WEventCreatureAttacker(MTGCardInstance * card, Targetable * from, Targetable * to); +}; + +//Event when a card's "defenser" status changes +//before : attacker that card was blocking previously +//after: attacker that card is blocking now +struct WEventCreatureBlocker: public WEventCardUpdate{ + MTGCardInstance * before; + MTGCardInstance * after; + WEventCreatureBlocker(MTGCardInstance * card,MTGCardInstance * from,MTGCardInstance * to); +}; + +//Event when a blocker is reordered +//exchangeWith: exchange card's position with exchangeWith's position +//attacker:both card and exchangeWith *should* be in attacker's "blockers" list. +struct WEventCreatureBlockerRank: public WEventCardUpdate{ + MTGCardInstance * exchangeWith; + MTGCardInstance * attacker; + WEventCreatureBlockerRank(MTGCardInstance * card,MTGCardInstance * exchangeWith, MTGCardInstance * attacker); + +}; + +//Event when a mana is engaged +//color : color +struct WEventEngageMana : public WEvent { + int color; + MTGCardInstance* card; + WEventEngageMana(int color, MTGCardInstance* card); +}; + +//Event when a mana is consumed +//color : color +struct WEventConsumeMana : public WEvent { + int color; + WEventConsumeMana(int color); +}; + +#endif diff --git a/projects/mtg/include/config.h b/projects/mtg/include/config.h index 2eedd16b7..36e1ae94c 100644 --- a/projects/mtg/include/config.h +++ b/projects/mtg/include/config.h @@ -26,4 +26,11 @@ #define RESPATH "Res" #endif +#ifndef MAX +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#endif +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + #endif diff --git a/projects/mtg/src/AIMomirPlayer.cpp b/projects/mtg/src/AIMomirPlayer.cpp index 45916fc4e..79d8a9713 100644 --- a/projects/mtg/src/AIMomirPlayer.cpp +++ b/projects/mtg/src/AIMomirPlayer.cpp @@ -9,7 +9,7 @@ MTGAbility * AIMomirPlayer::momirAbility = NULL; -AIMomirPlayer::AIMomirPlayer(MTGPlayerCards * _deck, char * file, const char * fileSmall, char * avatarFile): AIPlayerBaka(_deck,file, fileSmall, avatarFile){ +AIMomirPlayer::AIMomirPlayer(MTGPlayerCards * deck, string file, string fileSmall, string avatarFile) : AIPlayerBaka(deck, file, fileSmall, avatarFile) { momirAbility = NULL; agressivity = 100; } diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index 30c6eab12..ec4cb6ef2 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -1,766 +1,767 @@ -#include "../include/config.h" -#include "../include/AIPlayer.h" -#include "../include/CardDescriptor.h" -#include "../include/DamageResolverLayer.h" -#include "../include/DamagerDamaged.h" -#include "../include/AIStats.h" -#include "../include/AllAbilities.h" -#include "../include/ExtraCost.h" - -const char * const MTG_LAND_TEXTS[] = {"artifact","forest","island","mountain","swamp","plains","other lands"}; - -int AIAction::Act(){ - GameObserver * g = GameObserver::GetInstance(); - if (player){ - g->cardClick(NULL, player); - return 1; - } - if (ability){ - g->mLayers->actionLayer()->reactToClick(ability,click); - if (target) g->cardClick(target); - return 1; - }else if (click){ //Shouldn't be used, really... - g->cardClick(click); - if (target) g->cardClick(target); - return 1; - } - return 0; -} - -AIPlayer::AIPlayer(MTGPlayerCards * _deck, string file, string fileSmall): Player(_deck, file, fileSmall){ - potentialMana = NEW ManaCost(); - nextCardToPlay = NULL; - stats = NULL; - agressivity = 50; -} - -AIPlayer::~AIPlayer(){ - SAFE_DELETE(potentialMana); - if (stats){ - stats->save(); - SAFE_DELETE(stats); - } - //TODO delete clickstream! -} -MTGCardInstance * AIPlayer::chooseCard(TargetChooser * tc, MTGCardInstance * source, int random){ - for (int i = 0; i < game->hand->nb_cards; i++){ - MTGCardInstance * card = game->hand->cards[i]; - if (!tc->alreadyHasTarget(card) && tc->canTarget(card)){ - return card; - } - } - return NULL; -} - -int AIPlayer::Act(float dt){ - GameObserver * gameObs = GameObserver::GetInstance(); - if (gameObs->currentPlayer == this){ - gameObs->userRequestNextGamePhase(); - return 1; - }else{ - return 1; - } -} - - -void AIPlayer::tapLandsForMana(ManaCost * potentialMana, ManaCost * cost){ -#if defined (WIN32) || defined (LINUX) - OutputDebugString("tapping land for mana\n"); -#endif - if (!cost) return; - ManaCost * diff = potentialMana->Diff(cost); - GameObserver * g = GameObserver::GetInstance(); - - mapused; - for (int i = 1; i < g->mLayers->actionLayer()->mCount; i++){ //0 is not a mtgability...hackish - //Make sure we can use the ability - MTGAbility * a = ((MTGAbility *)g->mLayers->actionLayer()->mObjects[i]); +#include "../include/config.h" +#include "../include/AIPlayer.h" +#include "../include/CardDescriptor.h" +#include "../include/DamageResolverLayer.h" +#include "../include/DamagerDamaged.h" +#include "../include/AIStats.h" +#include "../include/AllAbilities.h" +#include "../include/ExtraCost.h" + +const char * const MTG_LAND_TEXTS[] = {"artifact","forest","island","mountain","swamp","plains","other lands"}; + +int AIAction::Act(){ + GameObserver * g = GameObserver::GetInstance(); + if (player){ + g->cardClick(NULL, player); + return 1; + } + if (ability){ + g->mLayers->actionLayer()->reactToClick(ability,click); + if (target) g->cardClick(target); + return 1; + }else if (click){ //Shouldn't be used, really... + g->cardClick(click); + if (target) g->cardClick(target); + return 1; + } + return 0; +} + +AIPlayer::AIPlayer(MTGPlayerCards * deck, string file, string fileSmall) : Player(deck, file, fileSmall) { + potentialMana = NEW ManaCost(); + nextCardToPlay = NULL; + stats = NULL; + agressivity = 50; +} + +AIPlayer::~AIPlayer(){ + SAFE_DELETE(potentialMana); + if (stats){ + stats->save(); + SAFE_DELETE(stats); + } + //TODO delete clickstream! +} +MTGCardInstance * AIPlayer::chooseCard(TargetChooser * tc, MTGCardInstance * source, int random){ + for (int i = 0; i < game->hand->nb_cards; i++){ + MTGCardInstance * card = game->hand->cards[i]; + if (!tc->alreadyHasTarget(card) && tc->canTarget(card)){ + return card; + } + } + return NULL; +} + +int AIPlayer::Act(float dt){ + GameObserver * gameObs = GameObserver::GetInstance(); + if (gameObs->currentPlayer == this){ + gameObs->userRequestNextGamePhase(); + return 1; + }else{ + return 1; + } +} + + +void AIPlayer::tapLandsForMana(ManaCost * potentialMana, ManaCost * cost){ +#if defined (WIN32) || defined (LINUX) + OutputDebugString("tapping land for mana\n"); +#endif + if (!cost) return; + ManaCost * diff = potentialMana->Diff(cost); + GameObserver * g = GameObserver::GetInstance(); + + mapused; + for (int i = 1; i < g->mLayers->actionLayer()->mCount; i++){ //0 is not a mtgability...hackish + //Make sure we can use the ability + MTGAbility * a = ((MTGAbility *)g->mLayers->actionLayer()->mObjects[i]); AManaProducer * amp = dynamic_cast(a); - if (amp && canHandleCost(amp)){ - MTGCardInstance * card = amp->source; - if (!used[card] && amp->isReactingToClick(card) && amp->output->getConvertedCost()==1){ - used[card] = true; - int doTap = 1; - for (int i=Constants::MTG_NB_COLORS-1; i>= 0; i--){ - if (diff->getCost(i) && amp->output->getCost(i) ){ - diff->remove(i,1); - doTap = 0; - break; - } - } - if (doTap){ - AIAction * action = NEW AIAction(amp,card); - clickstream.push(action); - } - } - } - } - delete(diff); - -} - -ManaCost * AIPlayer::getPotentialMana(){ - SAFE_DELETE(potentialMana); - potentialMana = NEW ManaCost(); - GameObserver * g = GameObserver::GetInstance(); - mapused; - for (int i = 1; i < g->mLayers->actionLayer()->mCount; i++){ //0 is not a mtgability...hackish - //Make sure we can use the ability - MTGAbility * a = ((MTGAbility *)g->mLayers->actionLayer()->mObjects[i]); + if (amp && canHandleCost(amp)){ + MTGCardInstance * card = amp->source; + if (!used[card] && amp->isReactingToClick(card) && amp->output->getConvertedCost()==1){ + used[card] = true; + int doTap = 1; + for (int i=Constants::MTG_NB_COLORS-1; i>= 0; i--){ + if (diff->getCost(i) && amp->output->getCost(i) ){ + diff->remove(i,1); + doTap = 0; + break; + } + } + if (doTap){ + AIAction * action = NEW AIAction(amp,card); + clickstream.push(action); + } + } + } + } + delete(diff); + +} + +ManaCost * AIPlayer::getPotentialMana(){ + SAFE_DELETE(potentialMana); + potentialMana = NEW ManaCost(); + GameObserver * g = GameObserver::GetInstance(); + mapused; + for (int i = 1; i < g->mLayers->actionLayer()->mCount; i++){ //0 is not a mtgability...hackish + //Make sure we can use the ability + MTGAbility * a = ((MTGAbility *)g->mLayers->actionLayer()->mObjects[i]); AManaProducer * amp = dynamic_cast(a); - if (amp && canHandleCost(amp)){ - MTGCardInstance * card = amp->source; - if (!used[card] && amp->isReactingToClick(card) && amp->output->getConvertedCost()==1){ - potentialMana->add(amp->output); - used[card] = true; - } - } - } - - return potentialMana; -} - - -int AIPlayer::getEfficiency(AIAction * action){ - return action->getEfficiency(); -} - -int AIPlayer::canHandleCost(MTGAbility * ability){ - //Can't handle sacrifice costs that require a target yet :( - if (ability->cost){ - ExtraCosts * ec = ability->cost->extraCosts; - if (ec){ - for (size_t i = 0; i < ec->costs.size(); i++){ - if (ec->costs[i]->tc) return 0; - } - } - } - return 1; -} - -int AIAction::getEfficiency(){ - //TODO add multiplier according to what the player wants - if (efficiency != -1) return efficiency; - if (!ability) return 0; - GameObserver * g = GameObserver::GetInstance(); - ActionStack * s = g->mLayers->stackLayer(); - Player * p = g->currentlyActing(); - if (s->has(ability)) return 0; - - MTGAbility * a = ability; - GenericTargetAbility * gta = dynamic_cast(a); - if (gta) a = gta->ability; - - GenericActivatedAbility * gaa = dynamic_cast(a); - if (gaa) a = gaa->ability; - - if (!a){ - OutputDebugString("FATAL: Ability is NULL in AIAction::getEfficiency()"); - return 0; - } - - if (!((AIPlayer *)p)->canHandleCost(ability)) return 0; - - switch (a->aType){ - case MTGAbility::DAMAGER: - { - AADamager * aad = (AADamager *) a; - if ( p == target->controller()){ - efficiency = 0; - }else if (aad->damage >= target->toughness){ - efficiency = 100; - }else if (target->toughness){ - efficiency = (50 * aad->damage) / target->toughness; - }else{ - efficiency = 0; - } - break; - } - case MTGAbility::STANDARD_REGENERATE: - { - MTGCardInstance * _target = (MTGCardInstance *)(a->target); - efficiency = 0; - if (!_target->regenerateTokens && g->getCurrentGamePhase()< Constants::MTG_PHASE_COMBATDAMAGE && (_target->defenser || _target->blockers.size())){ - efficiency = 95; - } - //TODO If the card is the target of a damage spell - break; - } - case MTGAbility::MANA_PRODUCER: //can't use mana producers right now :/ - efficiency = 0; - break; - default: - if (target){ - efficiency = rand() % 5; //Small percentage of chance for other abilities - }else{ - efficiency = rand() % 10; - } - break; - } - return efficiency; -} - - - - -int AIPlayer::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, map * ranking){ - if (!a->tc){ - AIAction * as = NEW AIAction(a,c,NULL); - (*ranking)[as] = 1; - return 1; - } - GameObserver * g = GameObserver::GetInstance(); - for (int i = 0; i < 2; i++){ - Player * p = g->players[i]; - MTGGameZone * playerZones[] = {p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay}; - for (int j = 0; j < 4; j++){ - MTGGameZone * zone = playerZones[j]; - for (int k=0; k < zone->nb_cards; k++){ - MTGCardInstance * t = zone->cards[k]; - if (a->tc->canTarget(t)){ - - AIAction * as = NEW AIAction(a,c,t); - (*ranking)[as] = 1; - } - } - } - } - return 1; -} - -int AIPlayer::selectAbility(){ - mapranking; - list::iterator it; - ManaCost * pMana = getPotentialMana(); - GameObserver * g = GameObserver::GetInstance(); - for (int i = 1; i < g->mLayers->actionLayer()->mCount; i++){ //0 is not a mtgability...hackish - //Make sure we can use the ability - MTGAbility * a = ((MTGAbility *)g->mLayers->actionLayer()->mObjects[i]); - for (int j=0; j < game->inPlay->nb_cards; j++){ - MTGCardInstance * card = game->inPlay->cards[j]; - if (a->isReactingToClick(card,pMana)){ - createAbilityTargets(a, card, &ranking); - } - } - } - - if (ranking.size()){ - OutputDebugString("We have a winner\n"); - AIAction * a = ranking.begin()->first; - int chance = 1 + rand() % 100; - if (getEfficiency(a) < chance){ - a = NULL; - }else{ -OutputDebugString("We REALLY have a winner\n"); - tapLandsForMana(pMana, a->ability->cost); - clickstream.push(a); - } - map::iterator it2; - for (it2 = ranking.begin(); it2!=ranking.end(); it2++){ - if (a != it2->first) delete(it2->first); - } - } - return 1; -} - - - -int AIPlayer::interruptIfICan(){ - GameObserver * g = GameObserver::GetInstance(); - - if (g->mLayers->stackLayer()->askIfWishesToInterrupt == this){ - if (!clickstream.empty()) g->mLayers->stackLayer()->cancelInterruptOffer(); - else g->mLayers->stackLayer()->setIsInterrupting(this); - return 1; - } - return 0; -} - -int AIPlayer::effectBadOrGood(MTGCardInstance * card){ - int id = card->getMTGId(); - AbilityFactory * af = NEW AbilityFactory(); - int autoGuess = af->magicText(id,NULL,card); - delete af; - if (autoGuess) return autoGuess; - return BAKA_EFFECT_DONTKNOW; -} - - - -int AIPlayer::chooseTarget(TargetChooser * tc){ - Targetable * potentialTargets[50]; - int nbtargets = 0; - GameObserver * gameObs = GameObserver::GetInstance(); - int checkOnly = 0; - if (tc){ - checkOnly = 1; - }else{ - tc = gameObs->getCurrentTargetChooser(); - } - if (!tc) return 0; - if (!(gameObs->currentlyActing() == this)) return 0; - Player * target = this; - int cardEffect = effectBadOrGood(tc->source); - if (cardEffect != BAKA_EFFECT_GOOD){ - target = this->opponent(); - } - - - if (!tc->alreadyHasTarget(target) && tc->canTarget(target) && nbtargets < 50){ - for (int i = 0; i < 3; i++){ //Increase probability to target a player when this is possible - potentialTargets[nbtargets] = target; - nbtargets++; - } - if (checkOnly) return 1; - } - MTGPlayerCards * playerZones = target->game; - MTGGameZone * zones[] = {playerZones->hand,playerZones->library,playerZones->inPlay, playerZones->graveyard}; - for (int j = 0; j < 4; j++){ - MTGGameZone * zone = zones[j]; - for (int k=0; k< zone->nb_cards; k++){ - MTGCardInstance * card = zone->cards[k]; - if (!tc->alreadyHasTarget(card) && tc->canTarget(card) && nbtargets < 50){ - if (checkOnly) return 1; - int multiplier = 1; - if (getStats() && getStats()->isInTop(card,10)){ - multiplier++; - if (getStats()->isInTop(card,5)){ - multiplier++; - if (getStats()->isInTop(card,3)){ - multiplier++; - } - } - } - for (int l=0; l < multiplier; l++){ - potentialTargets[nbtargets] = card; - nbtargets++; - } - } - } - } - if (nbtargets){ - int i = rand() % nbtargets; - int type = potentialTargets[i]->typeAsTarget(); - switch(type){ - case TARGET_CARD: - { - MTGCardInstance * card = ((MTGCardInstance *) potentialTargets[i]); - clickstream.push(NEW AIAction(card)); - return 1; - break; - } - case TARGET_PLAYER: - { - Player * player = ((Player *) potentialTargets[i]); - clickstream.push(NEW AIAction(player)); - return 1; - break; - } - } - } - //BIG PROBLEM - gameObs->cancelCurrentAction(); - return 0; -} - -int AIPlayer::getCreaturesInfo(Player * player, int neededInfo , int untapMode, int canAttack){ - int result = 0; - CardDescriptor cd; - cd.init(); - cd.setType("Creature"); - cd.unsecureSetTapped(untapMode); - MTGCardInstance * card = NULL; - while((card = cd.nextmatch(player->game->inPlay, card))){ - if (!canAttack || card->canAttack()){ - if (neededInfo == INFO_NBCREATURES){ - result++; - }else{ - result+=card->power; - } - } - } - return result; -} - - - -int AIPlayer::chooseAttackers(){ - //Attack with all creatures - //How much damage can the other player do during his next Attack ? - int opponentForce = getCreaturesInfo(opponent(),INFO_CREATURESPOWER); - int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES); - int myForce = getCreaturesInfo(this,INFO_CREATURESPOWER,-1,1); - int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1,1); - bool attack = ((myCreatures > opponentCreatures) || (myForce > opponentForce) || (myForce > 2*opponent()->life)); - if (agressivity > 80 && !attack && life > opponentForce) { - opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES,-1); - opponentForce = getCreaturesInfo(opponent(),INFO_CREATURESPOWER,-1); - attack = (myCreatures >= opponentCreatures && myForce > opponentForce) || (myForce > opponentForce) || (myForce > opponent()->life); - } - printf("Choose attackers : %i %i %i %i -> %i\n", opponentForce, opponentCreatures, myForce, myCreatures, attack); - if (attack){ - CardDescriptor cd; - cd.init(); - cd.setType("creature"); - MTGCardInstance * card = NULL; - GameObserver * g = GameObserver::GetInstance(); - MTGAbility * a = g->mLayers->actionLayer()->getAbility(MTGAbility::MTG_ATTACK_RULE); - while((card = cd.nextmatch(game->inPlay, card))){ - g->mLayers->actionLayer()->reactToClick(a,card); - } - } - return 1; -} - -/* Can I first strike my oponent and get away with murder ? */ -int AIPlayer::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy){ - if (ennemy->has(Constants::FIRSTSTRIKE) || ennemy->has(Constants::DOUBLESTRIKE)) return 0; - if (!(card->has(Constants::FIRSTSTRIKE) || card->has(Constants::DOUBLESTRIKE))) return 0; - if (!(card->power >= ennemy->toughness)) return 0; - return 1; -} - -int AIPlayer::chooseBlockers(){ - map opponentsToughness; - int opponentForce = getCreaturesInfo(opponent(),INFO_CREATURESPOWER); - //int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES, -1); - //int myForce = getCreaturesInfo(this,INFO_CREATURESPOWER); - //int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1); - CardDescriptor cd; - cd.init(); - cd.setType("Creature"); - cd.unsecureSetTapped(-1); - MTGCardInstance * card = NULL; - GameObserver * g = GameObserver::GetInstance(); - MTGAbility * a = g->mLayers->actionLayer()->getAbility(MTGAbility::MTG_BLOCK_RULE); - - while((card = cd.nextmatch(game->inPlay, card))){ - g->mLayers->actionLayer()->reactToClick(a,card); - int set = 0; - while(!set){ - if (!card->defenser){ - set = 1; - }else{ - MTGCardInstance * attacker = card->defenser; - map::iterator it = opponentsToughness.find(attacker); - if ( it == opponentsToughness.end()){ - opponentsToughness[attacker] = attacker->toughness; - it = opponentsToughness.find(attacker); - } - if (opponentsToughness[attacker] > 0 && getStats() && getStats()->isInTop(attacker,3,false)){ - opponentsToughness[attacker]-= card->power; - set = 1; - }else{ - g->mLayers->actionLayer()->reactToClick(a,card); - } - } - } - } - card = NULL; - while((card = cd.nextmatch(game->inPlay, card))){ - if (card->defenser && opponentsToughness[card->defenser] > 0){ - while (card->defenser){ - - g->mLayers->actionLayer()->reactToClick(a,card); - } - } - } - card = NULL; - while((card = cd.nextmatch(game->inPlay, card))){ - if(!card->defenser){ - g->mLayers->actionLayer()->reactToClick(a,card); - int set = 0; - while(!set){ - if (!card->defenser){ - set = 1; - }else{ - MTGCardInstance * attacker = card->defenser; - if (opponentsToughness[attacker] <= 0 || - (card->toughness <= attacker->power && opponentForce*2 nbOpponents()>1){ - g->mLayers->actionLayer()->reactToClick(a,card); - }else{ - set = 1; - } - } - } - } - } - return 1; -} - -int AIPlayer::orderBlockers(){ - GameObserver * g = GameObserver::GetInstance(); - DamageResolverLayer * drl = g->mLayers->combatLayer(); - if (drl->orderingIsNeeded && g->currentPlayer==this){ - drl->blockersOrderingDone(); //TODO clever rank of blockers - return 1; - } - return 0; -} - - - -int AIPlayer::combatDamages(){ - int result = 0; - GameObserver * gameObs = GameObserver::GetInstance(); - int currentGamePhase = gameObs->getCurrentGamePhase(); - - if (currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS) return orderBlockers(); - - if (currentGamePhase != Constants::MTG_PHASE_COMBATDAMAGE) return 0; - DamageResolverLayer * drl = gameObs->mLayers->combatLayer(); - - if (drl->currentChoosingPlayer == this){ - for (int i = 0; i < drl->mCount; i++){ - DamagerDamaged * current = (DamagerDamaged *) drl->mObjects[i]; - if (current->damageSelecter == this){ - OutputDebugString("YEs, AI IS THE DAMAGE DEALER"); - MTGCardInstance * attacker = current->card; - MTGCardInstance * canardEmissaire = *(attacker->blockers.rbegin()); - - while (canardEmissaire && current->damageToDeal){ - drl->clickDamage(canardEmissaire); - } - result = 1; - - } - } - } - - - if (result) return drl->nextPlayer(); - return 0; - -} - - -AIStats * AIPlayer::getStats(){ - if (!stats){ - char statFile[512]; - sprintf(statFile, RESPATH"/ai/baka/stats/%s.stats", opponent()->deckFileSmall.c_str()); - stats = NEW AIStats(this, statFile); - } - return stats; -} - -AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * opponent, int deckid){ - char deckFile[512]; - char avatarFile[512]; - char deckFileSmall[512]; - - if (deckid == -1){ //Evil twin - sprintf(deckFile, opponent->deckFile.c_str()); - OutputDebugString(opponent->deckFile.c_str()); - sprintf(avatarFile, "player/avatar.jpg"); - sprintf(deckFileSmall, "ai_baka_eviltwin"); - }else{ - if (!deckid){ - int nbdecks = 0; - int found = 1; - while (found){ - found = 0; - char buffer[512]; - sprintf(buffer, RESPATH"/ai/baka/deck%i.txt",nbdecks+1); - std::ifstream file(buffer); - if(file){ - found = 1; - file.close(); - nbdecks++; - } - } - if (!nbdecks) return NULL; - deckid = 1 + rand() % (nbdecks); - } - sprintf(deckFile, RESPATH"/ai/baka/deck%i.txt",deckid); - sprintf(avatarFile, "ai/baka/avatars/avatar%i.jpg",deckid); - sprintf(deckFileSmall, "ai_baka_deck%i",deckid); - } - - - MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, collection); - MTGPlayerCards * deck = NEW MTGPlayerCards(collection,tempDeck); - delete tempDeck; - AIPlayerBaka * baka = NEW AIPlayerBaka(deck,deckFile, deckFileSmall, avatarFile); - return baka; -} - - -MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * potentialMana, const char * type){ - int maxCost = -1; - MTGCardInstance * nextCardToPlay = NULL; - MTGCardInstance * card = NULL; - CardDescriptor cd; - cd.init(); - cd.setType(type); - card = NULL; - while((card = cd.nextmatch(game->hand, card))){ - int currentCost = card->getManaCost()->getConvertedCost(); - if (currentCost > maxCost && potentialMana->canAfford(card->getManaCost())){ - TargetChooserFactory * tcf = NEW TargetChooserFactory(); - TargetChooser * tc = tcf->createTargetChooser(card); - delete tcf; - if (tc){ - int hasTarget = (chooseTarget(tc)); - delete tc; - if (!hasTarget)continue; - }else{ - int shouldPlayPercentage = 10; - int shouldPlay = effectBadOrGood(card); - if (shouldPlay == BAKA_EFFECT_GOOD){ - shouldPlayPercentage = 90; - }else if(BAKA_EFFECT_DONTKNOW == shouldPlay){ - shouldPlayPercentage = 80; - } - if (rand() % 100 > shouldPlayPercentage) continue; - } - nextCardToPlay = card; - maxCost = currentCost; - } - } - return nextCardToPlay; -} - -AIPlayerBaka::AIPlayerBaka(MTGPlayerCards * _deck, char * file, const char * fileSmall, char * avatarFile): AIPlayer(_deck,file, fileSmall){ - if (fileExists(avatarFile)){ - mAvatarTex = JRenderer::GetInstance()->LoadTexture(avatarFile, TEX_TYPE_USE_VRAM); - }else{ - mAvatarTex = JRenderer::GetInstance()->LoadTexture("ai/baka/avatar.jpg", TEX_TYPE_USE_VRAM); - } - if (mAvatarTex) - mAvatar = NEW JQuad(mAvatarTex, 0, 0, 35, 50); - initTimer(); -} - -void AIPlayerBaka::initTimer(){ - timer = 0.1; -} - -int AIPlayerBaka::computeActions(){ - GameObserver * g = GameObserver::GetInstance(); - Player * p = g->currentPlayer; - if (!(g->currentlyActing() == this)) return 0; - if (g->mLayers->actionLayer()->menuObject){ - g->mLayers->actionLayer()->doReactTo(0); - return 1; - } - if (chooseTarget()) return 1; - int currentGamePhase = g->getCurrentGamePhase(); - if (g->isInterrupting == this){ // interrupting - selectAbility(); - return 1; - }else if (p == this && g->mLayers->stackLayer()->count(0,NOT_RESOLVED) == 0){ //standard actions - CardDescriptor cd; - MTGCardInstance * card = NULL; - switch(currentGamePhase){ - case Constants::MTG_PHASE_FIRSTMAIN: - case Constants::MTG_PHASE_SECONDMAIN: - if (canPutLandsIntoPlay){ - //Attempt to put land into play - cd.init(); - cd.setColor(Constants::MTG_COLOR_LAND); - card = cd.match(game->hand); - if (card){ - AIAction * a = NEW AIAction(card); - clickstream.push(a); - return 1; - } - } - - //No mana, try to get some - getPotentialMana(); - if (potentialMana->getConvertedCost() > 0){ - - - //look for the most expensive creature we can afford - nextCardToPlay = FindCardToPlay(potentialMana, "creature"); - //Let's Try an enchantment maybe ? - if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "enchantment"); - if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "artifact"); - if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "instant"); - if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "sorcery"); - if (nextCardToPlay){ -#if defined (WIN32) || defined (LINUX) - char buffe[4096]; - sprintf(buffe, "Putting Card Into Play: %s", nextCardToPlay->getName()); - OutputDebugString(buffe); -#endif - - tapLandsForMana(potentialMana,nextCardToPlay->getManaCost()); - AIAction * a = NEW AIAction(nextCardToPlay); - clickstream.push(a); - return 1; - }else{ - selectAbility(); - } - }else{ - selectAbility(); - } - break; - case Constants::MTG_PHASE_COMBATATTACKERS: - chooseAttackers(); - break; - default: - selectAbility(); - break; - } - }else{ - switch(currentGamePhase){ - case Constants::MTG_PHASE_COMBATBLOCKERS: - chooseBlockers(); - break; - default: - break; - } - return 1; - } - return 1; -}; - -int AIPlayerBaka::Act(float dt){ - GameObserver * g = GameObserver::GetInstance(); - - if (!(g->currentlyActing() == this)){ - OutputDebugString("Cannot interrupt\n"); - return 0; - } - - int currentGamePhase = g->getCurrentGamePhase(); - - if (currentGamePhase == Constants::MTG_PHASE_CLEANUP && currentGamePhase != oldGamePhase){ - if (getStats()) getStats()->updateStats(); - } - oldGamePhase = currentGamePhase; - - timer-= dt; - if (AManaProducer::currentlyTapping || timer>0){ - return 0; - } - initTimer(); - if (combatDamages()){ - OutputDebugString("Damages and NOTHING ELSE\n"); - return 0; - } - interruptIfICan(); - if (!(g->currentlyActing() == this)){ - OutputDebugString("Cannot interrupt\n"); - return 0; - } - if (clickstream.empty()) computeActions(); - if (clickstream.empty()){ - if (g->isInterrupting == this){ - g->mLayers->stackLayer()->cancelInterruptOffer(); //endOfInterruption(); - }else{ - g->userRequestNextGamePhase(); - } - } else { - AIAction * action = clickstream.front(); - action->Act(); - SAFE_DELETE(action); - clickstream.pop(); - } - - - return 1; -}; - + if (amp && canHandleCost(amp)){ + MTGCardInstance * card = amp->source; + if (!used[card] && amp->isReactingToClick(card) && amp->output->getConvertedCost()==1){ + potentialMana->add(amp->output); + used[card] = true; + } + } + } + + return potentialMana; +} + + +int AIPlayer::getEfficiency(AIAction * action){ + return action->getEfficiency(); +} + +int AIPlayer::canHandleCost(MTGAbility * ability){ + //Can't handle sacrifice costs that require a target yet :( + if (ability->cost){ + ExtraCosts * ec = ability->cost->extraCosts; + if (ec){ + for (size_t i = 0; i < ec->costs.size(); i++){ + if (ec->costs[i]->tc) return 0; + } + } + } + return 1; +} + +int AIAction::getEfficiency(){ + //TODO add multiplier according to what the player wants + if (efficiency != -1) return efficiency; + if (!ability) return 0; + GameObserver * g = GameObserver::GetInstance(); + ActionStack * s = g->mLayers->stackLayer(); + Player * p = g->currentlyActing(); + if (s->has(ability)) return 0; + + MTGAbility * a = ability; + GenericTargetAbility * gta = dynamic_cast(a); + if (gta) a = gta->ability; + + GenericActivatedAbility * gaa = dynamic_cast(a); + if (gaa) a = gaa->ability; + + if (!a){ + OutputDebugString("FATAL: Ability is NULL in AIAction::getEfficiency()"); + return 0; + } + + if (!((AIPlayer *)p)->canHandleCost(ability)) return 0; + + switch (a->aType){ + case MTGAbility::DAMAGER: + { + AADamager * aad = (AADamager *) a; + if ( p == target->controller()){ + efficiency = 0; + }else if (aad->damage >= target->toughness){ + efficiency = 100; + }else if (target->toughness){ + efficiency = (50 * aad->damage) / target->toughness; + }else{ + efficiency = 0; + } + break; + } + case MTGAbility::STANDARD_REGENERATE: + { + MTGCardInstance * _target = (MTGCardInstance *)(a->target); + efficiency = 0; + if (!_target->regenerateTokens && g->getCurrentGamePhase()< Constants::MTG_PHASE_COMBATDAMAGE && (_target->defenser || _target->blockers.size())){ + efficiency = 95; + } + //TODO If the card is the target of a damage spell + break; + } + case MTGAbility::MANA_PRODUCER: //can't use mana producers right now :/ + efficiency = 0; + break; + default: + if (target){ + efficiency = rand() % 5; //Small percentage of chance for other abilities + }else{ + efficiency = rand() % 10; + } + break; + } + return efficiency; +} + + + + +int AIPlayer::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, map * ranking){ + if (!a->tc){ + AIAction * as = NEW AIAction(a,c,NULL); + (*ranking)[as] = 1; + return 1; + } + GameObserver * g = GameObserver::GetInstance(); + for (int i = 0; i < 2; i++){ + Player * p = g->players[i]; + MTGGameZone * playerZones[] = {p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay}; + for (int j = 0; j < 4; j++){ + MTGGameZone * zone = playerZones[j]; + for (int k=0; k < zone->nb_cards; k++){ + MTGCardInstance * t = zone->cards[k]; + if (a->tc->canTarget(t)){ + + AIAction * as = NEW AIAction(a,c,t); + (*ranking)[as] = 1; + } + } + } + } + return 1; +} + +int AIPlayer::selectAbility(){ + mapranking; + list::iterator it; + ManaCost * pMana = getPotentialMana(); + GameObserver * g = GameObserver::GetInstance(); + for (int i = 1; i < g->mLayers->actionLayer()->mCount; i++){ //0 is not a mtgability...hackish + //Make sure we can use the ability + MTGAbility * a = ((MTGAbility *)g->mLayers->actionLayer()->mObjects[i]); + for (int j=0; j < game->inPlay->nb_cards; j++){ + MTGCardInstance * card = game->inPlay->cards[j]; + if (a->isReactingToClick(card,pMana)){ + createAbilityTargets(a, card, &ranking); + } + } + } + + if (ranking.size()){ + OutputDebugString("We have a winrar\n"); + AIAction * a = ranking.begin()->first; + int chance = 1 + rand() % 100; + if (getEfficiency(a) < chance){ + a = NULL; + }else{ +OutputDebugString("We REALLY have a winner\n"); + tapLandsForMana(pMana, a->ability->cost); + clickstream.push(a); + } + map::iterator it2; + for (it2 = ranking.begin(); it2!=ranking.end(); it2++){ + if (a != it2->first) delete(it2->first); + } + } + return 1; +} + + + +int AIPlayer::interruptIfICan(){ + GameObserver * g = GameObserver::GetInstance(); + + if (g->mLayers->stackLayer()->askIfWishesToInterrupt == this){ + if (!clickstream.empty()) g->mLayers->stackLayer()->cancelInterruptOffer(); + else g->mLayers->stackLayer()->setIsInterrupting(this); + return 1; + } + return 0; +} + +int AIPlayer::effectBadOrGood(MTGCardInstance * card){ + int id = card->getMTGId(); + AbilityFactory * af = NEW AbilityFactory(); + int autoGuess = af->magicText(id,NULL,card); + delete af; + if (autoGuess) return autoGuess; + return BAKA_EFFECT_DONTKNOW; +} + + + +int AIPlayer::chooseTarget(TargetChooser * tc){ + Targetable * potentialTargets[50]; + int nbtargets = 0; + GameObserver * gameObs = GameObserver::GetInstance(); + int checkOnly = 0; + if (tc){ + checkOnly = 1; + }else{ + tc = gameObs->getCurrentTargetChooser(); + } + if (!tc) return 0; + if (!(gameObs->currentlyActing() == this)) return 0; + Player * target = this; + int cardEffect = effectBadOrGood(tc->source); + if (cardEffect != BAKA_EFFECT_GOOD){ + target = this->opponent(); + } + + + if (!tc->alreadyHasTarget(target) && tc->canTarget(target) && nbtargets < 50){ + for (int i = 0; i < 3; i++){ //Increase probability to target a player when this is possible + potentialTargets[nbtargets] = target; + nbtargets++; + } + if (checkOnly) return 1; + } + MTGPlayerCards * playerZones = target->game; + MTGGameZone * zones[] = {playerZones->hand,playerZones->library,playerZones->inPlay, playerZones->graveyard}; + for (int j = 0; j < 4; j++){ + MTGGameZone * zone = zones[j]; + for (int k=0; k< zone->nb_cards; k++){ + MTGCardInstance * card = zone->cards[k]; + if (!tc->alreadyHasTarget(card) && tc->canTarget(card) && nbtargets < 50){ + if (checkOnly) return 1; + int multiplier = 1; + if (getStats() && getStats()->isInTop(card,10)){ + multiplier++; + if (getStats()->isInTop(card,5)){ + multiplier++; + if (getStats()->isInTop(card,3)){ + multiplier++; + } + } + } + for (int l=0; l < multiplier; l++){ + potentialTargets[nbtargets] = card; + nbtargets++; + } + } + } + } + if (nbtargets){ + int i = rand() % nbtargets; + int type = potentialTargets[i]->typeAsTarget(); + switch(type){ + case TARGET_CARD: + { + MTGCardInstance * card = ((MTGCardInstance *) potentialTargets[i]); + clickstream.push(NEW AIAction(card)); + return 1; + break; + } + case TARGET_PLAYER: + { + Player * player = ((Player *) potentialTargets[i]); + clickstream.push(NEW AIAction(player)); + return 1; + break; + } + } + } + //BIG PROBLEM + gameObs->cancelCurrentAction(); + return 0; +} + +int AIPlayer::getCreaturesInfo(Player * player, int neededInfo , int untapMode, int canAttack){ + int result = 0; + CardDescriptor cd; + cd.init(); + cd.setType("Creature"); + cd.unsecureSetTapped(untapMode); + MTGCardInstance * card = NULL; + while((card = cd.nextmatch(player->game->inPlay, card))){ + if (!canAttack || card->canAttack()){ + if (neededInfo == INFO_NBCREATURES){ + result++; + }else{ + result+=card->power; + } + } + } + return result; +} + + + +int AIPlayer::chooseAttackers(){ + //Attack with all creatures + //How much damage can the other player do during his next Attack ? + int opponentForce = getCreaturesInfo(opponent(),INFO_CREATURESPOWER); + int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES); + int myForce = getCreaturesInfo(this,INFO_CREATURESPOWER,-1,1); + int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1,1); + bool attack = ((myCreatures > opponentCreatures) || (myForce > opponentForce) || (myForce > 2*opponent()->life)); + if (agressivity > 80 && !attack && life > opponentForce) { + opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES,-1); + opponentForce = getCreaturesInfo(opponent(),INFO_CREATURESPOWER,-1); + attack = (myCreatures >= opponentCreatures && myForce > opponentForce) || (myForce > opponentForce) || (myForce > opponent()->life); + } + printf("Choose attackers : %i %i %i %i -> %i\n", opponentForce, opponentCreatures, myForce, myCreatures, attack); + if (attack){ + CardDescriptor cd; + cd.init(); + cd.setType("creature"); + MTGCardInstance * card = NULL; + GameObserver * g = GameObserver::GetInstance(); + MTGAbility * a = g->mLayers->actionLayer()->getAbility(MTGAbility::MTG_ATTACK_RULE); + while((card = cd.nextmatch(game->inPlay, card))){ + g->mLayers->actionLayer()->reactToClick(a,card); + } + } + return 1; +} + +/* Can I first strike my oponent and get away with murder ? */ +int AIPlayer::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy){ + if (ennemy->has(Constants::FIRSTSTRIKE) || ennemy->has(Constants::DOUBLESTRIKE)) return 0; + if (!(card->has(Constants::FIRSTSTRIKE) || card->has(Constants::DOUBLESTRIKE))) return 0; + if (!(card->power >= ennemy->toughness)) return 0; + return 1; +} + +int AIPlayer::chooseBlockers(){ + map opponentsToughness; + int opponentForce = getCreaturesInfo(opponent(),INFO_CREATURESPOWER); + //int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES, -1); + //int myForce = getCreaturesInfo(this,INFO_CREATURESPOWER); + //int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1); + CardDescriptor cd; + cd.init(); + cd.setType("Creature"); + cd.unsecureSetTapped(-1); + MTGCardInstance * card = NULL; + GameObserver * g = GameObserver::GetInstance(); + MTGAbility * a = g->mLayers->actionLayer()->getAbility(MTGAbility::MTG_BLOCK_RULE); + + while((card = cd.nextmatch(game->inPlay, card))){ + g->mLayers->actionLayer()->reactToClick(a,card); + int set = 0; + while(!set){ + if (!card->defenser){ + set = 1; + }else{ + MTGCardInstance * attacker = card->defenser; + map::iterator it = opponentsToughness.find(attacker); + if ( it == opponentsToughness.end()){ + opponentsToughness[attacker] = attacker->toughness; + it = opponentsToughness.find(attacker); + } + if (opponentsToughness[attacker] > 0 && getStats() && getStats()->isInTop(attacker,3,false)){ + opponentsToughness[attacker]-= card->power; + set = 1; + }else{ + g->mLayers->actionLayer()->reactToClick(a,card); + } + } + } + } + card = NULL; + while((card = cd.nextmatch(game->inPlay, card))){ + if (card->defenser && opponentsToughness[card->defenser] > 0){ + while (card->defenser){ + + g->mLayers->actionLayer()->reactToClick(a,card); + } + } + } + card = NULL; + while((card = cd.nextmatch(game->inPlay, card))){ + if(!card->defenser){ + g->mLayers->actionLayer()->reactToClick(a,card); + int set = 0; + while(!set){ + if (!card->defenser){ + set = 1; + }else{ + MTGCardInstance * attacker = card->defenser; + if (opponentsToughness[attacker] <= 0 || + (card->toughness <= attacker->power && opponentForce*2 nbOpponents()>1){ + g->mLayers->actionLayer()->reactToClick(a,card); + }else{ + set = 1; + } + } + } + } + } + return 1; +} + +int AIPlayer::orderBlockers(){ + GameObserver * g = GameObserver::GetInstance(); + /* + DamageResolverLayer * drl = g->mLayers->combatLayer(); + if (drl->orderingIsNeeded && g->currentPlayer==this){ + drl->blockersOrderingDone(); //TODO clever rank of blockers + return 1; + } + */ + return 0; +} + + + +int AIPlayer::combatDamages(){ + int result = 0; + GameObserver * gameObs = GameObserver::GetInstance(); + int currentGamePhase = gameObs->getCurrentGamePhase(); + + if (currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS) return orderBlockers(); + + if (currentGamePhase != Constants::MTG_PHASE_COMBATDAMAGE) return 0; + /* + DamageResolverLayer * drl = gameObs->mLayers->combatLayer(); + + if (drl->currentChoosingPlayer == this){ + for (int i = 0; i < drl->mCount; i++){ + DamagerDamaged * current = (DamagerDamaged *) drl->mObjects[i]; + if (current->damageSelecter == this){ + OutputDebugString("YEs, AI IS THE DAMAGE DEALER"); + MTGCardInstance * attacker = current->card; + MTGCardInstance * canardEmissaire = *(attacker->blockers.rbegin()); + + while (canardEmissaire && current->damageToDeal){ + drl->clickDamage(canardEmissaire); + } + result = 1; + + } + } + } + + + if (result) return drl->nextPlayer(); + */ + return 0; + +} + + +AIStats * AIPlayer::getStats(){ + if (!stats){ + char statFile[512]; + sprintf(statFile, RESPATH"/ai/baka/stats/%s.stats", opponent()->deckFileSmall.c_str()); + stats = NEW AIStats(this, statFile); + } + return stats; +} + +AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * opponent, int deckid){ + char deckFile[512]; + char avatarFile[512]; + char deckFileSmall[512]; + + if (deckid == -1){ //Evil twin + sprintf(deckFile, opponent->deckFile.c_str()); + OutputDebugString(opponent->deckFile.c_str()); + sprintf(avatarFile, "player/avatar.jpg"); + sprintf(deckFileSmall, "ai_baka_eviltwin"); + }else{ + if (!deckid){ + int nbdecks = 0; + int found = 1; + while (found){ + found = 0; + char buffer[512]; + sprintf(buffer, RESPATH"/ai/baka/deck%i.txt",nbdecks+1); + std::ifstream file(buffer); + if(file){ + found = 1; + file.close(); + nbdecks++; + } + } + if (!nbdecks) return NULL; + deckid = 1 + rand() % (nbdecks); + } + sprintf(deckFile, RESPATH"/ai/baka/deck%i.txt",deckid); + sprintf(avatarFile, "ai/baka/avatars/avatar%i.jpg",deckid); + sprintf(deckFileSmall, "ai_baka_deck%i",deckid); + } + + + MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, collection); + MTGPlayerCards * deck = NEW MTGPlayerCards(collection,tempDeck); + delete tempDeck; + AIPlayerBaka * baka = NEW AIPlayerBaka(deck,deckFile, deckFileSmall, avatarFile); + return baka; +} + + +MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * potentialMana, const char * type){ + int maxCost = -1; + MTGCardInstance * nextCardToPlay = NULL; + MTGCardInstance * card = NULL; + CardDescriptor cd; + cd.init(); + cd.setType(type); + card = NULL; + while((card = cd.nextmatch(game->hand, card))){ + int currentCost = card->getManaCost()->getConvertedCost(); + if (currentCost > maxCost && potentialMana->canAfford(card->getManaCost())){ + TargetChooserFactory * tcf = NEW TargetChooserFactory(); + TargetChooser * tc = tcf->createTargetChooser(card); + delete tcf; + if (tc){ + int hasTarget = (chooseTarget(tc)); + delete tc; + if (!hasTarget)continue; + }else{ + int shouldPlayPercentage = 10; + int shouldPlay = effectBadOrGood(card); + if (shouldPlay == BAKA_EFFECT_GOOD){ + shouldPlayPercentage = 90; + }else if(BAKA_EFFECT_DONTKNOW == shouldPlay){ + shouldPlayPercentage = 80; + } + if (rand() % 100 > shouldPlayPercentage) continue; + } + nextCardToPlay = card; + maxCost = currentCost; + } + } + return nextCardToPlay; +} + +AIPlayerBaka::AIPlayerBaka(MTGPlayerCards * deck, string file, string fileSmall, string avatarFile) : AIPlayer(deck, file, fileSmall) { + if (fileExists(avatarFile.c_str())) + mAvatarTex = JRenderer::GetInstance()->LoadTexture(avatarFile.c_str(), TEX_TYPE_USE_VRAM); + else + mAvatarTex = JRenderer::GetInstance()->LoadTexture("ai/baka/avatar.jpg", TEX_TYPE_USE_VRAM); + if (mAvatarTex) + mAvatar = NEW JQuad(mAvatarTex, 0, 0, 35, 50); + initTimer(); +} + +void AIPlayerBaka::initTimer(){ + timer = 0.1; +} + +int AIPlayerBaka::computeActions(){ + GameObserver * g = GameObserver::GetInstance(); + Player * p = g->currentPlayer; + if (!(g->currentlyActing() == this)) return 0; + if (g->mLayers->actionLayer()->menuObject){ + g->mLayers->actionLayer()->doReactTo(0); + return 1; + } + if (chooseTarget()) return 1; + int currentGamePhase = g->getCurrentGamePhase(); + if (g->isInterrupting == this){ // interrupting + selectAbility(); + return 1; + }else if (p == this && g->mLayers->stackLayer()->count(0,NOT_RESOLVED) == 0){ //standard actions + CardDescriptor cd; + MTGCardInstance * card = NULL; + switch(currentGamePhase){ + case Constants::MTG_PHASE_FIRSTMAIN: + case Constants::MTG_PHASE_SECONDMAIN: + if (canPutLandsIntoPlay){ + //Attempt to put land into play + cd.init(); + cd.setColor(Constants::MTG_COLOR_LAND); + card = cd.match(game->hand); + if (card){ + AIAction * a = NEW AIAction(card); + clickstream.push(a); + return 1; + } + } + + //No mana, try to get some + getPotentialMana(); + if (potentialMana->getConvertedCost() > 0){ + + + //look for the most expensive creature we can afford + nextCardToPlay = FindCardToPlay(potentialMana, "creature"); + //Let's Try an enchantment maybe ? + if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "enchantment"); + if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "artifact"); + if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "instant"); + if (!nextCardToPlay) nextCardToPlay = FindCardToPlay(potentialMana, "sorcery"); + if (nextCardToPlay){ +#if defined (WIN32) || defined (LINUX) + char buffe[4096]; + sprintf(buffe, "Putting Card Into Play: %s", nextCardToPlay->getName().c_str()); + OutputDebugString(buffe); +#endif + + tapLandsForMana(potentialMana,nextCardToPlay->getManaCost()); + AIAction * a = NEW AIAction(nextCardToPlay); + clickstream.push(a); + return 1; + }else{ + selectAbility(); + } + }else{ + selectAbility(); + } + break; + case Constants::MTG_PHASE_COMBATATTACKERS: + chooseAttackers(); + break; + default: + selectAbility(); + break; + } + }else{ + switch(currentGamePhase){ + case Constants::MTG_PHASE_COMBATBLOCKERS: + chooseBlockers(); + break; + default: + break; + } + return 1; + } + return 1; +}; + +int AIPlayerBaka::Act(float dt){ + GameObserver * g = GameObserver::GetInstance(); + + if (!(g->currentlyActing() == this)){ + OutputDebugString("Cannot interrupt\n"); + return 0; + } + + int currentGamePhase = g->getCurrentGamePhase(); + + if (currentGamePhase == Constants::MTG_PHASE_CLEANUP && currentGamePhase != oldGamePhase){ + if (getStats()) getStats()->updateStats(); + } + oldGamePhase = currentGamePhase; + + timer-= dt; + if (AManaProducer::currentlyTapping || timer>0){ + return 0; + } + initTimer(); + if (combatDamages()){ + OutputDebugString("Damages and NOTHING ELSE\n"); + return 0; + } + interruptIfICan(); + if (!(g->currentlyActing() == this)){ + OutputDebugString("Cannot interrupt\n"); + return 0; + } + if (clickstream.empty()) computeActions(); + if (clickstream.empty()){ + if (g->isInterrupting == this){ + g->mLayers->stackLayer()->cancelInterruptOffer(); //endOfInterruption(); + }else{ + g->userRequestNextGamePhase(); + } + } else { + AIAction * action = clickstream.front(); + action->Act(); + SAFE_DELETE(action); + clickstream.pop(); + } + return 1; +}; + diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index d0a0ea3d5..cca909ad0 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -67,16 +67,15 @@ void ActionLayer::Update(float dt){ return; } modal = 0; - GameObserver * g = GameObserver::GetInstance(); + GameObserver* game = GameObserver::GetInstance(); for (int i=mCount -1 ;i>=0;i--){ if (mObjects[i]!= NULL){ ActionElement * currentAction = (ActionElement *)mObjects[i]; - if (currentAction->testDestroy()){ - g->removeObserver(currentAction); - } + if (currentAction->testDestroy()) + game->removeObserver(currentAction); } } - int newPhase = g->getCurrentGamePhase(); + int newPhase = game->getCurrentGamePhase(); for (int i=0;ireactToTargetClick(menuObject); diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index aac82cb71..91768f6f9 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -8,8 +8,8 @@ #include "../include/Damage.h" #include "../include/ManaCost.h" #include "../include/GameOptions.h" +#include "../include/TexturesCache.h" #include "../include/TargetChooser.h" -// WALDORF - added to support drawing big cards during interrupts #include "../include/CardGui.h" #include "../include/Translate.h" @@ -57,7 +57,7 @@ void StackAbility::Render(){ sprintf(buffer, "%s", _(ability->getMenuText()).c_str()); mFont->DrawString(buffer, x + 30 , y, JGETEXT_LEFT); JRenderer * renderer = JRenderer::GetInstance(); - JQuad * quad = ability->source->getThumb(); + JQuad * quad = cache.getThumb(ability->source); if (quad){ quad->SetColor(ARGB(255,255,255,255)); float scale = 30 / quad->mHeight; @@ -115,7 +115,7 @@ Spell::Spell(int id, MTGCardInstance * _source, TargetChooser * tc, ManaCost * _ } -const char * Spell::getDisplayName(){ +const string Spell::getDisplayName(){ return source->getName(); } @@ -133,10 +133,10 @@ int Spell::resolve(){ if (!source->hasType("instant") && !source->hasType("sorcery")){ source = source->controller()->game->putInPlay(source); } - + //Play SFX - if (GameOptions::GetInstance()->values[OPTIONS_SFXVOLUME].getIntValue() > 0){ + if (options[Options::SFXVOLUME].number > 0){ JSample * sample = source->getSample(); if (sample){ JSoundSystem::GetInstance()->PlaySample(sample); @@ -188,7 +188,7 @@ void Spell::Render(){ mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); mFont->DrawString(_(source->name).c_str(), x + 30 , y, JGETEXT_LEFT); JRenderer * renderer = JRenderer::GetInstance(); - JQuad * quad = source->getThumb(); + JQuad * quad = cache.getThumb(source); if (quad){ quad->SetColor(ARGB(255,255,255,255)); float scale = mHeight / quad->mHeight; @@ -205,7 +205,7 @@ void Spell::Render(){ // just overwrites it. // I stole the render code from RenderBig() in CardGUI.cpp - quad = source->getQuad(); + quad = cache.getQuad(source); if (quad){ quad->SetColor(ARGB(220,255,255,255)); float scale = 257.f / quad->mHeight; @@ -214,9 +214,9 @@ void Spell::Render(){ else { MTGCard * mtgcard = source->model; - CardGui::alternateRender(mtgcard, NULL, 10 + 90 , 20 + 130, 0.0f,0.9f); + // CardGui::alternateRender(mtgcard, NULL, 10 + 90 , 20 + 130, 0.0f,0.9f); - quad = source->getThumb(); + quad = cache.getThumb(source); if (quad){ float scale = 250 / quad->mHeight; quad->SetColor(ARGB(40,255,255,255)); @@ -276,7 +276,7 @@ void PutInGraveyard::Render(){ mFont->DrawString(_("is exiled").c_str(), x + 30 , y, JGETEXT_LEFT); } JRenderer * renderer = JRenderer::GetInstance(); - JQuad * quad = card->getThumb(); + JQuad * quad = cache.getThumb(card); if (quad){ quad->SetColor(ARGB(255,255,255,255)); float scale = 30 / quad->mHeight; @@ -330,11 +330,10 @@ int ActionStack::addPutInGraveyard(MTGCardInstance * card){ int ActionStack::addAbility(MTGAbility * ability){ StackAbility * stackAbility = NEW StackAbility(mCount,ability); int result = addAction(stackAbility); - if (!game->players[0]->isAI() && - ability->source->controller()==game->players[0] && - GameOptions::GetInstance()->values[OPTIONS_INTERRUPTMYABILITIES].getIntValue() == 0){ - interruptDecision[0] = DONT_INTERRUPT; - } + if (!game->players[0]->isAI() && + ability->source->controller()==game->players[0] && + 0 == options[Options::INTERRUPTMYABILITIES].number) + interruptDecision[0] = DONT_INTERRUPT; return result; } @@ -388,11 +387,10 @@ Spell * ActionStack::addSpell(MTGCardInstance * _source, TargetChooser * tc, Man #endif Spell * spell = NEW Spell(mCount,_source,tc, mana); addAction(spell); - if (!game->players[0]->isAI() && - _source->controller()==game->players[0] && - GameOptions::GetInstance()->values[OPTIONS_INTERRUPTMYSPELLS].getIntValue() == 0){ - interruptDecision[0] = DONT_INTERRUPT; - } + if (!game->players[0]->isAI() && + _source->controller()==game->players[0] && + 0 == options[Options::INTERRUPTMYSPELLS].number) + interruptDecision[0] = DONT_INTERRUPT; return spell; } @@ -403,10 +401,9 @@ Interruptible * ActionStack::getAt(int id){ return (Interruptible *)mObjects[id]; } -ActionStack::ActionStack(int id, GameObserver* _game):GuiLayer(id, _game){ - for (int i=0; i<2; i++){ +ActionStack::ActionStack(GameObserver* game) : game(game){ + for (int i=0; i<2; i++) interruptDecision[i] = 0; - } askIfWishesToInterrupt = NULL; timer = -1; currentState = -1; @@ -644,9 +641,9 @@ void ActionStack::Update(float dt){ // WALDORF - added code to use a game option setting to determine how // long the Interrupt timer should be. If it is set to zero (0), the // game will wait for ever for the user to make a selection. - if (GameOptions::GetInstance()->values[OPTIONS_INTERRUPT_SECONDS].getIntValue() > 0) + if (options[Options::INTERRUPT_SECONDS].number > 0) { - if (timer < 0) timer = GameOptions::GetInstance()->values[OPTIONS_INTERRUPT_SECONDS].getIntValue(); + if (timer < 0) timer = options[Options::INTERRUPT_SECONDS].number; timer -= dt; if (timer < 0) cancelInterruptOffer(); } @@ -736,7 +733,7 @@ bool ActionStack::CheckUserInput(u32 key){ return true; //Steal the input to other layers if we're visible } if (PSP_CTRL_TRIANGLE == key){ - if (modal) {modal = 0;} else {modal = 1;} + if (modal) modal = 0; else modal = 1; return true; } } @@ -753,13 +750,12 @@ int ActionStack::CombatDamages(){ } int ActionStack::CombatDamages(int strike){ - DamageStack * damages = NEW DamageStack(mCount,game); + DamageStack * damages = NEW DamageStack(game); int damageitems = damages->CombatDamages(strike); - if (damageitems){ + if (damageitems) addAction(damages); - }else{ + else SAFE_DELETE(damages); - } return damageitems; } @@ -773,9 +769,8 @@ while( iter != mObjects.end() ){ iter = mObjects.erase( iter ) ; mCount--; SAFE_DELETE(current); - }else { - ++iter ; - } + } else + ++iter; } return 1; } @@ -842,7 +837,7 @@ void ActionStack::Render(){ // WALDORF - changed "interrupt ?" to "Interrupt?". Don't display count down // seconds if the user disables auto progressing interrupts by setting the seconds // value to zero in Options. - if (GameOptions::GetInstance()->values[OPTIONS_INTERRUPT_SECONDS].getIntValue() == 0) + if (options[Options::INTERRUPT_SECONDS].number == 0) sprintf(buffer, _("Interrupt?").c_str()); else sprintf(buffer, "%s %i", _("Interrupt?").c_str(),static_cast(timer)); @@ -935,7 +930,7 @@ void Interruptible::Dump(){ sstate = "unknown"; break; } - + char buf[4096]; sprintf(buf, " type %s(%i) - state %s(%i) - display %i\n", stype.c_str(), type, sstate.c_str(),state, display); OutputDebugString(buf); diff --git a/projects/mtg/src/Blocker.cpp b/projects/mtg/src/Blocker.cpp index 286b7f39c..8cf70c455 100644 --- a/projects/mtg/src/Blocker.cpp +++ b/projects/mtg/src/Blocker.cpp @@ -24,11 +24,11 @@ void UntapBlocker::init(ManaCost * _cost){ manaCost = _cost; } - UntapBlocker * UntapBlocker::clone() const{ - UntapBlocker * a = NEW UntapBlocker(*this); - a->isClone = 1; - return a; - } +UntapBlocker * UntapBlocker::clone() const{ + UntapBlocker * a = NEW UntapBlocker(*this); + a->isClone = 1; + return a; +} //Default behaviour for blockers : they block the card they're attached to @@ -45,7 +45,7 @@ void UntapBlocker::Update(float dt){ _target->getUntapBlockers()->Add(this); #if defined (WIN32) || defined (LINUX) char buf[4096]; - sprintf(buf, "Adding Blocker to %s \n", _target->model->getName()); + sprintf(buf, "Adding Blocker to %s \n", _target->model->getName().c_str()); OutputDebugString(buf); #endif } diff --git a/projects/mtg/src/CardDisplay.cpp b/projects/mtg/src/CardDisplay.cpp index 118f71895..e135b6c7c 100644 --- a/projects/mtg/src/CardDisplay.cpp +++ b/projects/mtg/src/CardDisplay.cpp @@ -4,8 +4,8 @@ #include "../include/TargetChooser.h" #include "../include/MTGGameZones.h" -CardDisplay::CardDisplay():PlayGuiObjectController(0, GameObserver::GetInstance()){ - tc= NULL; +CardDisplay::CardDisplay() : mId(0), game(GameObserver::GetInstance()) { + tc = NULL; listener = NULL; nb_displayed_items = 7; start_item = 0; @@ -13,8 +13,8 @@ CardDisplay::CardDisplay():PlayGuiObjectController(0, GameObserver::GetInstance( y= 0; } -CardDisplay::CardDisplay(int id, GameObserver* _game, int _x, int _y, JGuiListener * _listener, TargetChooser * _tc, int _nb_displayed_items ):PlayGuiObjectController(id, _game), x(_x), y(_y){ - tc= _tc; +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) { + tc = _tc; listener = _listener; nb_displayed_items = _nb_displayed_items; start_item = 0; @@ -22,7 +22,7 @@ CardDisplay::CardDisplay(int id, GameObserver* _game, int _x, int _y, JGuiListen void CardDisplay::AddCard(MTGCardInstance * _card){ - CardGui * card = NEW CardGui(mCount, _card, 40, x + 5 + (mCount - start_item) * 30, y + 5, (mCount == 0)); + CardGui * card = NEW CardView(_card, x + 5 + (mCount - start_item) * 30, y + 5); Add(card); } @@ -60,7 +60,7 @@ bool CardDisplay::CheckUserInput(u32 key){ if (listener){ listener->ButtonPressed(mId, 0); return true; - } + } } if (!mCount) @@ -75,7 +75,7 @@ bool CardDisplay::CheckUserInput(u32 key){ tc->toggleTarget(cardg->card); return true; }else{ - if (game) game->ButtonPressed(mId, cardg); + if (game) game->ButtonPressed(cardg); return true; } } @@ -140,7 +140,7 @@ void CardDisplay::Render(){ if (mCount && mObjects[mCurr] != NULL){ mObjects[mCurr]->Render(); CardGui * cardg = ((CardGui *)mObjects[mCurr]); - cardg->RenderBig(-1,-1,showBigCards-1); + // cardg->RenderBig(-1,-1,showBigCards-1); } } @@ -149,7 +149,7 @@ ostream& CardDisplay::toString(ostream& out) const return (out << "CardDisplay ::: x,y : " << x << "," << y << " ; start_item : " << start_item << " ; nb_displayed_items " << nb_displayed_items << " ; tc : " << tc << " ; listener : " << listener); } -DefaultTargetDisplay::DefaultTargetDisplay(int id, GameObserver* _game, int _x, int _y,JGuiListener * _listener, int _nb_displayed_items ):CardDisplay(id, _game, _x, _y, _listener, NULL, _nb_displayed_items ){ +DefaultTargetDisplay::DefaultTargetDisplay(int id, GameObserver* game, int x, int y, JGuiListener * listener, int nb_displayed_items ):CardDisplay(id, game, x, y, listener, NULL, nb_displayed_items ){ tc = NEW TargetChooser(); } diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index cad80945f..eed602748 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -1,3 +1,4 @@ +#include "JGE.h" #include "../include/config.h" #include "../include/CardGui.h" #include "../include/ManaCostHybrid.h" @@ -6,6 +7,231 @@ #include "../include/MTGDefinitions.h" #include +CardGui::CardGui(MTGCardInstance* card, float x, float y) : PlayGuiObject(Height, x, y, false), quad(cache.getQuad(card)), card(card) {} +CardGui::CardGui(MTGCardInstance* card, const Pos& ref) : PlayGuiObject(Height, ref, false), quad(cache.getQuad(card)), card(card) {} + +CardView::CardView(MTGCardInstance* card, float x, float y) : CardGui(card, x, y) { + card->view = this; +} + +CardView::CardView(MTGCardInstance* card, const Pos& ref) : CardGui(card, ref) { + card->view = this; +} + +void CardView::Update(float dt) +{ + PlayGuiObject::Update(dt); +} + +void CardView::Render() +{ + JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT); + + JRenderer * renderer = JRenderer::GetInstance(); + GameObserver * game = GameObserver::GetInstance(); + + TargetChooser * tc = NULL; + if (game) tc = game->getCurrentTargetChooser(); + + if (quad) { + const float scale = actZ * 40 / quad->mHeight; + renderer->RenderQuad(GameApp::CommonRes->GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale); + quad->SetColor(ARGB(static_cast(actA),255,255,255)); + renderer->RenderQuad(quad, actX, actY, actT, scale, scale); + } + else { + int color = card->getColor(); + MTGCard * mtgcard = card->model; + const float scale = actZ; + + renderer->RenderQuad(GameApp::CommonRes->GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale); + + mFont->SetColor(ARGB(static_cast(actA), 0, 0, 0)); + + JQuad * icon = NULL; + if (card->hasSubtype("plains")) + icon = GameApp::CommonRes->GetQuad("c_white"); + else if (card->hasSubtype("swamp")) + icon = GameApp::CommonRes->GetQuad("c_black"); + else if (card->hasSubtype("forest")) + icon = GameApp::CommonRes->GetQuad("c_green"); + else if (card->hasSubtype("mountain")) + icon = GameApp::CommonRes->GetQuad("c_red"); + else if (card->hasSubtype("island")) + icon = GameApp::CommonRes->GetQuad("c_blue"); + if (icon) icon->SetHotSpot(16,16); + + { + JQuad* q; + // Draw the "unknown" card model + switch(card->getColor()) + { + case Constants::MTG_COLOR_GREEN: q = GameApp::CommonRes->GetQuad("green_thumb"); break; + case Constants::MTG_COLOR_BLUE : q = GameApp::CommonRes->GetQuad("blue_thumb"); break; + case Constants::MTG_COLOR_RED : q = GameApp::CommonRes->GetQuad("red_thumb"); break; + case Constants::MTG_COLOR_BLACK: q = GameApp::CommonRes->GetQuad("black_thumb"); break; + case Constants::MTG_COLOR_WHITE: q = GameApp::CommonRes->GetQuad("white_thumb"); break; + default: q = GameApp::CommonRes->GetQuad("black_thumb"); break; + } + q->SetColor(ARGB(static_cast(actA),255,255,255)); + renderer->RenderQuad(q, actX, actY, actT, scale, scale); + } + + mFont->SetScale(DEFAULT_MAIN_FONT_SCALE * 0.5 * actZ); + mFont->DrawString(card->getName().c_str(), actX - actZ * Width / 2 + 1, actY - actZ * Height / 2 + 1); + if (icon) { icon->SetColor(ARGB(static_cast(actA),255,255,255)); renderer->RenderQuad(icon, actX, actY, 0); } + if (tc && !tc->canTarget(card)) renderer->FillRect(actX - actZ*Width/2, actY - actZ*Height/2, actZ*Width, actZ*Height, ARGB(200,0,0,0)); + mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); + } + + if (card->isCreature()){ + mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); + char buffer[200]; + sprintf(buffer, "%i/%i",card->power,card->life); + renderer->FillRect(actX + 2, actY + 30 - 12, 25, 12, ARGB(((static_cast(actA))/2),0,0,0)); + mFont->SetColor(ARGB(static_cast(actA),255,255,255)); + mFont->DrawString(buffer, actX + 4, actY + 30 - 10); + } + + PlayGuiObject::Render(); +} + +void CardGui::RenderBig(const Pos& pos){ + JRenderer * renderer = JRenderer::GetInstance(); + + if (quad){ + quad->SetColor(ARGB((int)pos.actA,255,255,255)); + float scale = pos.actZ * 257.f / quad->mHeight; + renderer->RenderQuad(quad, pos.actX, pos.actY, pos.actT, scale, scale); + return; + } + + JQuad * q; + if ((q = cache.getThumb(card))) + { + float scale = pos.actZ * 250 / q->mHeight; + q->SetColor(ARGB((int)pos.actA,255,255,255)); + renderer->RenderQuad(q, pos.actX, pos.actY, pos.actT, scale, scale); + return; + } + + // If we come here, we do not have the picture. + + // Draw the "unknown" card model + MTGCard * mtgcard = card->model; + switch(card->getColor()) + { + case Constants::MTG_COLOR_GREEN: q = GameApp::CommonRes->GetQuad("green"); break; + case Constants::MTG_COLOR_BLUE : q = GameApp::CommonRes->GetQuad("blue"); break; + case Constants::MTG_COLOR_RED : q = GameApp::CommonRes->GetQuad("red"); break; + case Constants::MTG_COLOR_BLACK: q = GameApp::CommonRes->GetQuad("black"); break; + case Constants::MTG_COLOR_WHITE: q = GameApp::CommonRes->GetQuad("white"); break; + default: q = GameApp::CommonRes->GetQuad("black"); break; + } + float scale = pos.actZ * 250 / q->mHeight; + q->SetColor(ARGB((int)pos.actA,255,255,255)); + renderer->RenderQuad(q, pos.actX, pos.actY, pos.actT, scale, scale); + + // Write the title + JLBFont * font = GameApp::CommonRes->GetJLBFont("graphics/magic"); + float backup_scale = font->GetScale(); + font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); + font->SetScale(0.8 * pos.actZ); + + { + const char* name = _(card->getName()).c_str(); + float w = font->GetStringWidth(name) * 0.8 * pos.actZ; + if (w > BigWidth - 30) + font->SetScale((BigWidth - 30) / w); + font->DrawString(name, pos.actX + 22 - BigWidth / 2, pos.actY + 22 - BigHeight / 2); + } + + // Write the description + { + font->SetScale(0.8 * pos.actZ); + const std::vector txt = card->formattedText(); + unsigned i = 0; + for (std::vector::const_iterator it = txt.begin(); it != txt.end(); ++it, ++i) + font->DrawString(it->c_str(), pos.actX + 22 - BigWidth / 2, pos.actY + 35 + 11 * i); + } + + // Write the strength + if (card->isCreature()) + { + char buffer[32]; + sprintf(buffer, "%i/%i", card->power, card->life); + float w = font->GetStringWidth(buffer) * 0.8; + font->DrawString(buffer, pos.actX + 65 - w / 2, pos.actY + 106); + } + + // Mana + { + ManaCost* manacost = card->getManaCost(); + ManaCostHybrid* h; + unsigned int j = 0; + unsigned char t = (JGE::GetInstance()->GetTime() / 3) & 0xFF; + unsigned char v = t + 127; + while ((h = manacost->getHybridCost(j))) + { + float scale = pos.actZ * 0.05 * cosf(2*M_PI*((float)t)/256.0); + if (scale < 0) + { + renderer->RenderQuad(manaIcons[h->color1], pos.actX - 12 * j + 75 + 3 * sinf(2*M_PI*((float)t)/256.0), pos.actY - 115 + 3 * cosf(2*M_PI*((float)(t-35))/256.0), 0, 0.4 + scale, 0.4 + scale); + renderer->RenderQuad(manaIcons[h->color2], pos.actX - 12 * j + 75 + 3 * sinf(2*M_PI*((float)v)/256.0), pos.actY - 115 + 3 * cosf(2*M_PI*((float)(v-35))/256.0), 0, 0.4 - scale, 0.4 - scale); + } + else + { + renderer->RenderQuad(manaIcons[h->color2], pos.actX - 12 * j + 75 + 3 * sinf(2*M_PI*((float)v)/256.0), pos.actY - 115 + 3 * cosf(2*M_PI*((float)(v-35))/256.0), 0, 0.4 - scale, 0.4 - scale); + renderer->RenderQuad(manaIcons[h->color1], pos.actX - 12 * j + 75 + 3 * sinf(2*M_PI*((float)t)/256.0), pos.actY - 115 + 3 * cosf(2*M_PI*((float)(t-35))/256.0), 0, 0.4 + scale, 0.4 + scale); + } + ++j; + } + for (int i = Constants::MTG_NB_COLORS - 2; i >= 1; --i) + { + for (int cost = manacost->getCost(i); cost > 0; --cost) + { + renderer->RenderQuad(manaIcons[i], pos.actX - 12*j + 75, pos.actY - 115, 0, 0.4 * pos.actZ, 0.4 * pos.actZ); + ++j; + } + } + // Colorless mana + if (int cost = manacost->getCost(0)) + { + char buffer[10]; + sprintf(buffer, "%d", cost); + renderer->RenderQuad(manaIcons[0], pos.actX - 12*j + 75, pos.actY - 115, 0, 0.4 * pos.actZ, 0.4 * pos.actZ); + float w = font->GetStringWidth(buffer); + font->DrawString(buffer, pos.actX - 12*j + 76 - w/2, pos.actY - 120); + } + } + + { + string s = ""; + for (int i = card->nb_types - 1; i > 0; --i) + { + s += _(Subtypes::subtypesList->find(card->types[i])); + s += " - "; + } + s += _(Subtypes::subtypesList->find(card->types[0])); + font->DrawString(s.c_str(), pos.actX + 22 - BigWidth / 2, pos.actY + 17); + } + + font->SetScale(backup_scale); +} + + + +MTGCardInstance* CardView::getCard() { return card; } + +TransientCardView::TransientCardView(MTGCardInstance* card, float x, float y) : CardView(card, x, y){} +TransientCardView::TransientCardView(MTGCardInstance* card, const Pos& ref) : CardView(card, ref.actX, ref.actY) {}; +void TransientCardView::Render() +{ + CardView::Render(); +} + + +/* void CardGui::alternateRender(MTGCard * card, JQuad ** manaIcons, float x, float y, float rotation, float scale){ JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAGIC_FONT); float backup = mFont->GetScale(); @@ -36,31 +262,6 @@ void CardGui::alternateRender(MTGCard * card, JQuad ** manaIcons, float x, float mFont->SetScale(scale); int color = card->getColor(); - points[0].x = -width/2; - points[0].y = -height/2 ; - points[1].x = width/2; - points[1].y = -height/2; - points[2].x = width/2; - points[2].y = height/2; - points[3].x = -width/2; - points[3].y = height/2; - - for (int i=0; i < 4; i++){ - points[i].x *= scale; - points[i].y *= scale; - points[i].Rotate(rotation); - } - - if (rotation == 0){ - renderer->FillRoundRect(x+points[0].x + 2 ,y+points[0].y +2 ,width*scale-8,height*scale-8,2,ARGB(255,Constants::_r[color],Constants::_g[color],Constants::_b[color])); - renderer->FillRect(x+points[0].x + 6 ,y+points[0].y + 6 ,width*scale-12,height*scale-12,bgcolor2); - }else{ - for (int i=0; i < 4; i++){ - renderer->DrawLine(x + points[i].x,y + points[i].y,x + points[(i+1)%4].x,y + points[(i+1)%4].y,bgcolor); - } - } - - ManaCost * manacost = card->getManaCost(); int nbicons = 0; ManaCostHybrid * h; @@ -110,77 +311,6 @@ void CardGui::alternateRender(MTGCard * card, JQuad ** manaIcons, float x, float mFont->DrawString(buf,x+v.x,y+v.y); } - if (!card->formattedTextInit){ - std::string s(card->getText()); - s = _(s); - std::string::size_type found=s.find_first_of("{}"); - while (found!=string::npos) - { - s[found]='/'; - found=s.find_first_of("{}",found+1); - } - std::string::size_type len = 24; - while (s.length() > 0){ - std::string::size_type cut = s.find_first_of("., \t)", 0); - if (cut >= len || cut == string::npos){ - card->formattedText.push_back(s.substr(0,len)); - if (s.length() > len){ - s = s.substr(len,s.length()-len); - }else{ - s = ""; - } - }else{ - std::string::size_type newcut = cut; - while (newcut < len && newcut != string::npos){ - cut = newcut; - newcut = s.find_first_of("., \t)", newcut + 1); - } - card->formattedText.push_back(s.substr(0,cut+1)); - if (s.length() > cut+1){ - s = s.substr(cut+1,s.length() - cut - 1); - }else{ - s = ""; - } - } - } - card->formattedTextInit = 1; - } - - - - for (std::vector::size_type i=0; i < card->formattedText.size(); i++){ - sprintf(buf, "%s", card->formattedText[i].c_str()); - v.x = (-width/2 + 12 )*scale; - v.y = (50 + static_cast(16*i - height/2)) * scale; - v.Rotate(rotation); - mFont->DrawString(buf,x+v.x,y+v.y); - } - - - - v.x = ((-width/2)+10) * scale; - v.y = ((-height/2) + 25) * scale; - v.Rotate(rotation); - int over = strlen(_(card->getName()).c_str()) - 23; - float multiply = 1.4; - if (over > 0){ - multiply = 1.1; - } - mFont->SetScale(scale * multiply); - - mFont->SetColor(ARGB(255,Constants::_r[color],Constants::_g[color],Constants::_b[color])); - mFont->DrawString(_(card->getName()).c_str(),x+v.x,y+v.y); - mFont->SetScale(scale); - mFont->SetColor(ARGB(255,255,255,255)); - - - if (card->isACreature()){ - v.x = (width/2-40) * scale; - v.y = (height/2-30) * scale; - v.Rotate(rotation); - sprintf(buf,"%i/%i",card->power,card->toughness); - mFont->DrawString(buf,x+v.x,y+v.y); - } for (int i = card->nb_types-1; i>=0; i--){ v.x = ((-width/2)+10) * scale; @@ -194,10 +324,13 @@ void CardGui::alternateRender(MTGCard * card, JQuad ** manaIcons, float x, float } -CardGui::CardGui(int id, MTGCardInstance * _card, float desiredHeight,float _x, float _y, bool hasFocus): PlayGuiObject(id, desiredHeight, _x, _y, hasFocus){ +CardGui::CardGui(int id, MTGCardInstance * _card, float desiredHeight, float x, float y, bool hasFocus): PlayGuiObject(id, desiredHeight, x, y, hasFocus){ LOG("==Creating NEW CardGui Object. CardName:"); LOG(_card->getName()); + actX = x; + actY = y; + card = _card; type = GUI_CARD; @@ -227,12 +360,12 @@ void CardGui::Update(float dt){ if (card->changedZoneRecently > 0) alpha = 255.f - 255.f * card->changedZoneRecently; if (mParticleSys && card->changedZoneRecently == 1.f){ - mParticleSys->MoveTo(x+15, y+2*mHeight/3); + mParticleSys->MoveTo(actX + 15, actY + 2 * mHeight / 3); mParticleSys->Fire(); } if (card->changedZoneRecently){ if (mParticleSys) mParticleSys->Update(dt); - card->changedZoneRecently-= (5 *dt); + card->changedZoneRecently-= (5 *dt); if (card->changedZoneRecently == 0) card->changedZoneRecently-= dt;//must not become zero atm if (card->changedZoneRecently < 0){ if (mParticleSys) mParticleSys->Stop(); @@ -242,31 +375,13 @@ void CardGui::Update(float dt){ mParticleSys = NULL; } } + + actX += 10 * dt * (x - actX); + actY += 10 * dt * (y - actY); + PlayGuiObject::Update(dt); } -void CardGui::RenderBig(float xpos, float ypos, int alternate){ - JQuad * quad = NULL; - JRenderer * renderer = JRenderer::GetInstance(); - if (xpos == -1){ - xpos = 300; - if (x > SCREEN_WIDTH / 2) - xpos = 10; - } - if(ypos == -1) - ypos = 20; - if (!alternate){ - quad = card->getQuad(); - if (quad){ - quad->SetColor(ARGB(220,255,255,255)); - float scale = 257.f / quad->mHeight; - renderer->RenderQuad(quad, xpos , ypos , 0.0f,scale,scale); - }else{ - quad = card->getThumb(); - alternate = 1; - } - } - if (alternate){ MTGCard * mtgcard = card->model; @@ -299,44 +414,36 @@ void CardGui::Render(){ float rotation = M_PI_2 * tap; float mScale = mHeight / 64; float myW = 45 * mScale; - float myH = 60*mScale; + float myH = 60 * mScale; GameObserver * game = GameObserver::GetInstance(); TargetChooser * tc = NULL; if (game) tc = game->getCurrentTargetChooser(); - float myX = x + (32 * tap * mScale); - float myY = y+(20 * tap * mScale); + float myX = actX + (32 * tap * mScale); + float myY = actY + (20 * tap * mScale); if (quad){ mScale = mHeight / quad->mHeight; myH = mHeight; myW = quad->mWidth * mScale; - myX = x + (quad->mHeight/2 * tap * mScale); - myY = y+(quad->mWidth/2 * tap * mScale); + myX = actX + (quad->mHeight/2 * tap * mScale); + myY = actY + (quad->mWidth/2 * tap * mScale); } if (mHeight-defaultHeight){ - if (card->isTapped()){ - renderer->FillRect(myX + 1*(mHeight-defaultHeight) - myH , myY + 1*(mHeight-defaultHeight) , myH, myW, ARGB(128,0,0,0)); - }else{ - renderer->FillRect(myX + 1*(mHeight-defaultHeight) , myY + 1*(mHeight-defaultHeight) , myW, myH, ARGB(128,0,0,0)); - } + if (card->isTapped()) + renderer->FillRect(myX + 1 * (mHeight - defaultHeight) - myH, myY + 1 * (mHeight - defaultHeight), myH, myW, ARGB(128,0,0,0)); + else + renderer->FillRect(myX + 1 * (mHeight - defaultHeight), myY + 1 * (mHeight-defaultHeight), myW, myH, ARGB(128,0,0,0)); } if(quad){ - quad->SetColor(ARGB( alpha,255,255,255)); + quad->SetColor(ARGB(alpha, 255, 255, 255)); - if (tc){ - if (!tc->canTarget(card)){ - quad->SetColor(ARGB( alpha,50,50,50)); - } - } - renderer->RenderQuad(quad, myX , myY , rotation,mScale,mScale); - quad->SetColor(ARGB( alpha,255,255,255)); + if (tc && !tc->canTarget(card)) quad->SetColor(ARGB(alpha, 50, 50, 50)); + renderer->RenderQuad(quad, myX, myY ,rotation, mScale, mScale); + quad->SetColor(ARGB(alpha, 255, 255, 255)); }else{ int color = card->getColor(); - - - char buffer[200]; sprintf(buffer, "%s",card->getName()); mFont->SetColor(ARGB(255,Constants::_r[color],Constants::_g[color],Constants::_b[color])); @@ -355,46 +462,39 @@ void CardGui::Render(){ } if (mIcon) mIcon->SetHotSpot(16,16); if (card->isTapped()){ - renderer->FillRect(myX - myH , myY , myH, myW, ARGB(255,(Constants::_r[color]) /2 + 50,(Constants::_g[color]) /2 + 50,(Constants::_b[color])/ 2 + 50)); - renderer->DrawRect(myX - myH , myY , myH, myW, ARGB(255,Constants::_r[color],Constants::_g[color],Constants::_b[color])); + renderer->FillRect(myX - myH, myY, myH, myW, ARGB(255,Constants::_r[color]/2+50,Constants::_g[color]/2+50,Constants::_b[color]/2+50)); + renderer->DrawRect(myX - myH, myY, myH, myW, ARGB(255,Constants::_r[color],Constants::_g[color],Constants::_b[color])); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE * 0.8 * mScale); - mFont->DrawString(buffer,myX - myH + 4, myY + 1); - if (mIcon) renderer->RenderQuad(mIcon,myX - myH/2, myY + myW/2,M_PI_2,mScale,mScale); - if (tc){ - if (!tc->canTarget(card)){ - renderer->FillRect(myX - myH , myY , myH, myW, ARGB(200,0,0,0)); - } - } + mFont->DrawString(buffer, myX - (myH) + 4, myY + 1); + if (mIcon) renderer->RenderQuad(mIcon, myX - myH / 2,myY + myW / 2, M_PI_2, mScale, mScale); + if (tc && !tc->canTarget(card)) + renderer->FillRect(myX - myH, myY, myH, myW, ARGB(200,0,0,0)); }else{ - renderer->FillRect(myX , myY , myW, myH, ARGB(255,(Constants::_r[color]) /2 + 50,(Constants::_g[color]) /2 + 50,(Constants::_b[color]) /2 + 50)); - renderer->DrawRect(myX , myY , myW, myH, ARGB(255,Constants::_r[color],Constants::_g[color],Constants::_b[color])); + renderer->FillRect(myX, myY , myW, myH, ARGB(255,Constants::_r[color]/2+50,Constants::_g[color]/2+50,Constants::_b[color]/2+50)); + renderer->DrawRect(myX, myY , myW, myH, ARGB(255,Constants::_r[color],Constants::_g[color],Constants::_b[color])); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE * 0.5 * mScale); - mFont->DrawString(buffer,myX+4,myY + 1); - if (mIcon) renderer->RenderQuad(mIcon,myX + myW/2, myY + myH/2,0,mScale, mScale); - if (tc){ - if (!tc->canTarget(card)){ - renderer->FillRect(myX , myY , myW, myH, ARGB(200,0,0,0)); - } - } + mFont->DrawString(buffer, myX + 4, myY + 1); + if (mIcon) renderer->RenderQuad(mIcon,myX + myW/2, myY + myH / 2, 0, mScale, mScale); + if (tc && !tc->canTarget(card)) + renderer->FillRect(myX, myY, myW, myH, ARGB(200,0,0,0)); } mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); - } + } if (tc && tc->alreadyHasTarget(card)){ - if (card->isTapped()){ - renderer->FillRect(myX- myH , myY , myH, myW, ARGB(128,255,0,0)); - }else{ - renderer->FillRect(myX , myY , myW, myH, ARGB(128,255,0,0)); - } + if (card->isTapped()) + renderer->FillRect(myX - myH, myY, myH, myW, ARGB(128,255,0,0)); + else + renderer->FillRect(myX, myY, myW, myH, ARGB(128,255,0,0)); } - if (card->isACreature()){ + if (card->isCreature()){ mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; sprintf(buffer, "%i/%i",card->power,card->life); - renderer->FillRect(x+2,y + mHeight - 12, 25 , 12 ,ARGB(128,0,0,0)); + renderer->FillRect(actX + 2, actY + mHeight - 12, 25, 12, ARGB(128,0,0,0)); mFont->SetColor(ARGB(255,255,255,255)); - mFont->DrawString(buffer,x+4,y + mHeight - 10); + mFont->DrawString(buffer, actX + 4, actY + mHeight - 10); } if (mParticleSys && card->changedZoneRecently > 0){ @@ -403,17 +503,33 @@ void CardGui::Render(){ // set normal blending renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); } + + PlayGuiObject::Render(); } - +float CardGui::Height() +{ + return card->getQuad()->mHeight; +} +float CardGui::Width() +{ + return card->getQuad()->mWidth; +} CardGui::~CardGui(){ LOG("==Destroying CardGui object"); LOG(this->card->getName()); LOG("==CardGui object destruction Successful"); } +*/ +ostream& CardView::toString(ostream& out) const +{ + return (CardGui::toString(out) << " : CardView ::: card : " << card + << "; actX,actY : " << actX << "," << actY << "; t : " << t + << " ; actT : " << actT << " ; quad : " << quad); +} ostream& CardGui::toString(ostream& out) const { - return (out << "CardGui ::: mParticleSys : " << mParticleSys << " ; alpha : " << alpha << " ; card : " << card); + return (out << "CardGui ::: x,y " << x << "," << y); } diff --git a/projects/mtg/src/Credits.cpp b/projects/mtg/src/Credits.cpp index 71c09eab8..ddff97fde 100644 --- a/projects/mtg/src/Credits.cpp +++ b/projects/mtg/src/Credits.cpp @@ -41,12 +41,11 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){ app = _app; showMsg = (rand() % 5); GameObserver * g = GameObserver::GetInstance(); - if (!p1->isAI() && p2->isAI() && p1!= g->gameOver){ - GameOptions * go = GameOptions::GetInstance(); + if (!p1->isAI() && p2->isAI() && p1!= g->gameOver){ value = 400; if (app->gameType != GAME_TYPE_CLASSIC) value = 200; - int difficulty = go->values[OPTIONS_DIFFICULTY].getIntValue(); - if (go->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED].getIntValue() && difficulty) { + int difficulty = options[Options::DIFFICULTY].number; + if (options[Options::DIFFICULTY_MODE_UNLOCKED].number && difficulty) { CreditBonus * b = NEW CreditBonus(100*difficulty, _("Difficulty Bonus")); bonus.push_back(b); } @@ -77,31 +76,31 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){ if (unlocked){ unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/unlocked.png", TEX_TYPE_USE_VRAM); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); - GameOptions::GetInstance()->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED] = GameOption(1); - GameOptions::GetInstance()->save(); - }else if((unlocked = isMomirUnlocked())) { + options[Options::DIFFICULTY_MODE_UNLOCKED] = GameOption(1); + options.save(); + } else if ((unlocked = isMomirUnlocked())) { unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/momir_unlocked.png", TEX_TYPE_USE_VRAM); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); - GameOptions::GetInstance()->values[OPTIONS_MOMIR_MODE_UNLOCKED] = GameOption(1); - GameOptions::GetInstance()->save(); - }else if((unlocked = isEvilTwinUnlocked())) { + options[Options::MOMIR_MODE_UNLOCKED] = GameOption(1); + options.save(); + } else if ((unlocked = isEvilTwinUnlocked())) { unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/eviltwin_unlocked.png", TEX_TYPE_USE_VRAM); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); - GameOptions::GetInstance()->values[OPTIONS_EVILTWIN_MODE_UNLOCKED] = GameOption(1); - GameOptions::GetInstance()->save(); + options[Options::EVILTWIN_MODE_UNLOCKED] = GameOption(1); + options.save(); }else if((unlocked = isRandomDeckUnlocked())) { unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/randomdeck_unlocked.png", TEX_TYPE_USE_VRAM); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); - GameOptions::GetInstance()->values[OPTIONS_RANDOMDECK_MODE_UNLOCKED] = GameOption(1); - GameOptions::GetInstance()->save(); + options[Options::RANDOMDECK_MODE_UNLOCKED] = GameOption(1); + options.save(); }else if((unlocked = unlockRandomSet())) { unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/set_unlocked.png", TEX_TYPE_USE_VRAM); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); char buffer[4096]; unlockedString = MtgSets::SetsList->values[unlocked -1]; sprintf(buffer,"unlocked_%s", unlockedString.c_str()); - GameOptions::GetInstance()->values[buffer] = GameOption(1); - GameOptions::GetInstance()->save(); + options[buffer] = GameOption(1); + options.save(); } if (unlocked){ JSample * sample = SampleCache::GetInstance()->getSample("sound/sfx/bonus.wav"); @@ -113,9 +112,8 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){ if (bonus.size()){ CreditBonus * b = NEW CreditBonus(value, _("Victory")); bonus.insert(bonus.begin(),b); - for ( it=bonus.begin()+1 ; it < bonus.end(); ++it){ - value+= (*it)->value; - } + for (it = bonus.begin() + 1; it < bonus.end(); ++it) + value += (*it)->value; } @@ -186,7 +184,7 @@ void Credits::Render(){ int Credits::isDifficultyUnlocked(){ - if (GameOptions::GetInstance()->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED].getIntValue()) return 0; + if (options[Options::DIFFICULTY_MODE_UNLOCKED].number) return 0; int nbAIDecks = 0; int found = 1; int wins = 0; @@ -210,20 +208,20 @@ int Credits::isDifficultyUnlocked(){ } int Credits::isMomirUnlocked(){ - if (GameOptions::GetInstance()->values[OPTIONS_MOMIR_MODE_UNLOCKED].getIntValue()) return 0; + if (options[Options::MOMIR_MODE_UNLOCKED].number) return 0; if (p1->game->inPlay->countByType("land") == 8) return 1; return 0; } int Credits::isEvilTwinUnlocked(){ - if (GameOptions::GetInstance()->values[OPTIONS_EVILTWIN_MODE_UNLOCKED].getIntValue()) return 0; + if (options[Options::EVILTWIN_MODE_UNLOCKED].number) return 0; if (p1->game->inPlay->nb_cards && (p1->game->inPlay->nb_cards == p2->game->inPlay->nb_cards)) return 1; return 0; } int Credits::isRandomDeckUnlocked(){ - if (GameOptions::GetInstance()->values[OPTIONS_DIFFICULTY].getIntValue() == 0 ) return 0; - if (GameOptions::GetInstance()->values[OPTIONS_RANDOMDECK_MODE_UNLOCKED].getIntValue()) return 0; + if (0 == options[Options::DIFFICULTY].number) return 0; + if (options[Options::RANDOMDECK_MODE_UNLOCKED].number) return 0; if (p1->life >= 20 ) return 1; return 0; } @@ -234,6 +232,6 @@ int Credits::unlockRandomSet(){ char buffer[4096]; string s = MtgSets::SetsList->values[setId]; sprintf(buffer,"unlocked_%s", s.c_str()); - if (GameOptions::GetInstance()->values[buffer].getIntValue() == 1 ) return 0; - return setId+1; + if (1 == options[buffer].number) return 0; + return setId + 1; } diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 43d69a79f..245e65a74 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -4,13 +4,14 @@ #include "../include/Counters.h" #include "../include/WEvent.h" #include "../include/Translate.h" +#include "../include/TexturesCache.h" -Damage::Damage(int id, MTGCardInstance * _source, Damageable * _target): Interruptible(id){ - init(_source, _target, _source->getPower()); +Damage::Damage(int id, MTGCardInstance * source, Damageable * target) { + init(source, target, source->getPower()); } -Damage::Damage(int id, MTGCardInstance * _source, Damageable * _target, int _damage): Interruptible(id){ - init(_source, _target, _damage); +Damage::Damage(int id, MTGCardInstance * source, Damageable * target, int damage) { + init(source, target, damage); } void Damage::init(MTGCardInstance * _source, Damageable * _target, int _damage){ @@ -68,7 +69,7 @@ void Damage::Render(){ sprintf(buffer, _("Deals %i damage to").c_str(), damage); mFont->DrawString(buffer, x + 20 , y, JGETEXT_LEFT); JRenderer * renderer = JRenderer::GetInstance(); - JQuad * quad = source->getThumb(); + JQuad * quad = cache.getThumb(source); if (quad){ float scale = 30 / quad->mHeight; renderer->RenderQuad(quad, x , y , 0,scale,scale); @@ -92,7 +93,7 @@ ostream& Damage::toString(ostream& out) const return out; } -DamageStack::DamageStack(int id, GameObserver * _game):GuiLayer(id, _game), Interruptible(id){ +DamageStack::DamageStack(GameObserver* game) : game(game){ currentState = -1; type = ACTION_DAMAGES; } diff --git a/projects/mtg/src/DamageResolverLayer.cpp b/projects/mtg/src/DamageResolverLayer.cpp index ae07c2ca7..2872d6c7c 100644 --- a/projects/mtg/src/DamageResolverLayer.cpp +++ b/projects/mtg/src/DamageResolverLayer.cpp @@ -6,7 +6,7 @@ #include "../include/Damage.h" #include "../include/Translate.h" -DamageResolverLayer::DamageResolverLayer(int id, GameObserver * _game):PlayGuiObjectController(id, _game){ +DamageResolverLayer::DamageResolverLayer(GameObserver * game) : game(game){ currentPhase = -1; remainingDamageSteps = 0; damageStack = NULL; @@ -106,9 +106,9 @@ DamagerDamaged * DamageResolverLayer::addIfNotExists(MTGCardInstance * card, Pla DamagerDamaged * item = (DamagerDamaged *)mObjects[i]; if (item->card == card) return item; } - CardGui * cardg = game->mLayers->playLayer()->getByCard(card); - DamagerDamaged * item = NEW DamagerDamaged(cardg, selecter, mCount == 0); - Add(item); + // CardGui * cardg = game->mLayers->playLayer()->getByCard(card); + DamagerDamaged * item = NEW DamagerDamaged(card, selecter, mCount == 0); + // Add(NEW TransientCardView(card->gui)); mCurr = 0; return item; } @@ -116,9 +116,11 @@ DamagerDamaged * DamageResolverLayer::addIfNotExists(MTGCardInstance * card, Pla void DamageResolverLayer::updateAllCoordinates(){ for (int i = 0; i < mCount; i++){ DamagerDamaged * item = (DamagerDamaged *)mObjects[i]; + /* CardGui * cardg = game->mLayers->playLayer()->getByCard(item->card); item->x = cardg->x; item->y = cardg->y; + */ } } @@ -129,9 +131,11 @@ int DamageResolverLayer::updateCoordinates(MTGCardInstance * card){ if (item->card != card) item = NULL ; } if (!item) return 0; + /* CardGui * cardg = game->mLayers->playLayer()->getByCard(card); item->x = cardg->x; item->y = cardg->y; + */ return 1; } @@ -181,7 +185,7 @@ int DamageResolverLayer::initResolve(){ #endif currentSource = NULL; currentChoosingPlayer = game->currentPlayer; - damageStack = NEW DamageStack(mCount,game); + damageStack = NEW DamageStack(game); int strike = 0; if (remainingDamageSteps == 2) strike = 1; @@ -436,7 +440,69 @@ bool DamageResolverLayer::CheckUserInput(u32 key){ }else if (PSP_CTRL_SQUARE == key){ return nextPlayer(); }else{ - return PlayGuiObjectController::CheckUserInput(key); + if (!mCount) + return false; + if (game != NULL){ + if (mActionButton == key){ + if (mObjects[mCurr] != NULL && mObjects[mCurr]->ButtonPressed()){ + game->ButtonPressed((PlayGuiObject *)mObjects[mCurr]); + return true; + } + } + if (PSP_CTRL_CROSS == key){ + game->cancelCurrentAction(); + return true; + } + } + + last_user_move = 0; + switch (key) + { + case PSP_CTRL_LEFT: + { + int n = getClosestItem(DIR_LEFT); + if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_LEFT)) + { + mCurr = n; + mObjects[mCurr]->Entering(); + } + return true; + } + case PSP_CTRL_RIGHT: + { + int n = getClosestItem(DIR_RIGHT); + if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_RIGHT)) + { + mCurr = n; + mObjects[mCurr]->Entering(); + } + return true; + } + case PSP_CTRL_UP: + { + int n = getClosestItem(DIR_UP); + if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_UP)) + { + mCurr = n; + mObjects[mCurr]->Entering(); + } + return true; + } + case PSP_CTRL_DOWN: + { + int n = getClosestItem(DIR_DOWN); + if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_DOWN)) + { + mCurr = n; + mObjects[mCurr]->Entering(); + } + return true; + } + case PSP_CTRL_TRIANGLE: + showBigCards = (showBigCards + 1) % 3; + return true; + } + return false; } return false; } @@ -455,7 +521,7 @@ void DamageResolverLayer::Render(){ mFont->DrawString(_("Blocking Player").c_str(), 0,0); } if (currentSource){ - currentSource->RenderBig(10, 20); + // currentSource->RenderBig(10, 20); mFont->DrawString(_("Current Damager:").c_str(), 10, 5); } for (int i = 0; i < mCount; i++){ diff --git a/projects/mtg/src/DamagerDamaged.cpp b/projects/mtg/src/DamagerDamaged.cpp index d3e16c6a5..aff5dbcaf 100644 --- a/projects/mtg/src/DamagerDamaged.cpp +++ b/projects/mtg/src/DamagerDamaged.cpp @@ -6,7 +6,7 @@ Temporary objects that store the damages dealt to/from creatures during the comb */ -DamagerDamaged::DamagerDamaged(CardGui * cardg, Player * _damageSelecter, bool _hasFocus):CardGui(0, cardg->card,cardg->defaultHeight,cardg->x,cardg->y, _hasFocus){ +DamagerDamaged::DamagerDamaged(MTGCardInstance* card, Player * _damageSelecter, bool _hasFocus) : card(card){ mCount = 0; damageSelecter = _damageSelecter; damageToDeal = card->power; @@ -37,7 +37,7 @@ int DamagerDamaged::dealOneDamage(DamagerDamaged * target){ damageToDeal--; #if defined (WIN32) || defined (LINUX) char buf[4096]; - sprintf(buf, "==========\n%s can still deal %i damages\n=============\n", card->getName(), damageToDeal); + sprintf(buf, "==========\n%s can still deal %i damages\n=============\n", card->getName().c_str(), damageToDeal); OutputDebugString(buf); #endif return target->addDamage(1, this); @@ -76,9 +76,10 @@ int DamagerDamaged::removeDamagesFrom(DamagerDamaged * source){ void DamagerDamaged::Render(Player * currentPlayer){ JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT); mFont->SetBase(0); - CardGui::Render(); + // CardGui::Render(); char buf[4096]; + /* if (currentPlayer != damageSelecter){ if (hasLethalDamage()){ mFont->DrawString("X",x,y); @@ -92,4 +93,5 @@ void DamagerDamaged::Render(Player * currentPlayer){ mFont->DrawString(buf,x+5, y+5); } mFont->SetColor(ARGB(255,255,255,255)); + */ } diff --git a/projects/mtg/src/DuelLayers.cpp b/projects/mtg/src/DuelLayers.cpp index dd40464cd..66bf01947 100644 --- a/projects/mtg/src/DuelLayers.cpp +++ b/projects/mtg/src/DuelLayers.cpp @@ -1,65 +1,146 @@ #include "../include/config.h" #include "../include/DuelLayers.h" #include "../include/MTGRules.h" -#include "../include/DamageResolverLayer.h" +#include "../include/GuiCombat.h" +#include "../include/GuiBackground.h" +#include "../include/GuiFrame.h" #include "../include/GuiPhaseBar.h" - +#include "../include/GuiAvatars.h" +#include "../include/GuiHand.h" +#include "../include/GuiPlay.h" +#include "../include/GuiMana.h" void DuelLayers::init(){ + GameObserver* go = GameObserver::GetInstance(); - //0 Stack Layer - ActionStack * mActionStack = NEW ActionStack(0, GameObserver::GetInstance()); - - //Damage Resolver - DamageResolverLayer * mDamageResolver = NEW DamageResolverLayer(1, GameObserver::GetInstance()); - + cs = NEW CardSelector(this); //1 Action Layer - GuiLayer * actionLayer = NEW ActionLayer(2, GameObserver::GetInstance()); - MTGGamePhase * phaseManager = NEW MTGGamePhase(actionLayer->getMaxId()); - actionLayer->Add(phaseManager); + action = NEW ActionLayer(); + action->Add(NEW MTGGamePhase(action->getMaxId())); //Add Magic Specific Rules - actionLayer->Add(NEW MTGPutInPlayRule(-1)); - actionLayer->Add(NEW MTGAttackRule(-1)); - actionLayer->Add(NEW MTGBlockRule(-1)); - actionLayer->Add(NEW MTGLegendRule(-1)); - actionLayer->Add(NEW MTGPersistRule(-1)); - actionLayer->Add(NEW MTGLifelinkRule(-1)); + action->Add(NEW MTGPutInPlayRule(-1)); + action->Add(NEW MTGAttackRule(-1)); + action->Add(NEW MTGBlockRule(-1)); + action->Add(NEW MTGLegendRule(-1)); + action->Add(NEW MTGPersistRule(-1)); + action->Add(NEW MTGLifelinkRule(-1)); //Other display elements - actionLayer->Add(NEW HUDDisplay(-1)); + action->Add(NEW HUDDisplay(-1)); - //2 Hand Layer - MTGGuiHand * mGuiHand = NEW MTGGuiHand(3, GameObserver::GetInstance()); + Add(NEW GuiMana()); + Add(stack = NEW ActionStack(go)); + Add(combat = NEW GuiCombat(cs)); + Add(action); + Add(cs); + Add(hand = NEW GuiHandSelf(cs, go->players[0]->game->hand)); + Add(NEW GuiHandOpponent(cs, go->players[1]->game->hand)); + Add(NEW GuiPlay(go, cs)); - //3 Game - MTGGuiPlay * play = NEW MTGGuiPlay(4, GameObserver::GetInstance()); - - //Add(NEW GuiPhaseBar(GameObserver::GetInstance())); - Add(mActionStack); - Add(mDamageResolver); - Add(actionLayer); - Add(mGuiHand); - Add(play); + Add(NEW GuiAvatars(cs)); + Add(NEW GuiPhaseBar()); + Add(NEW GuiFrame()); + Add(NEW GuiBackground()); } +void DuelLayers::Update(float dt, Player * currentPlayer) +{ + for (int i = 0; i < nbitems; ++i) objects[i]->Update(dt); + int isAI = currentPlayer->isAI(); + u32 key; + GameObserver * game = GameObserver::GetInstance(); + while ((key = JGE::GetInstance()->ReadButton())){ + if ((!isAI) && (0 != key)) + { + if (stack->CheckUserInput(key)) break; + // if (combat->CheckUserInput(key)) break; + if (action->CheckUserInput(key)) break; + if (hand->CheckUserInput(key)) break; + if (cs->CheckUserInput(key)) break; + } + } + if (isAI) currentPlayer->Act(dt); +} ActionStack * DuelLayers::stackLayer(){ - return ((ActionStack *) (objects[0])); -} - -DamageResolverLayer * DuelLayers::combatLayer(){ - return ((DamageResolverLayer *) (objects[1])); + return stack; } ActionLayer * DuelLayers::actionLayer(){ - return ((ActionLayer *) (objects[2])); + return action; } -MTGGuiHand * DuelLayers::handLayer(){ - return ((MTGGuiHand *) (objects[3])); -} -MTGGuiPlay * DuelLayers::playLayer(){ - return ((MTGGuiPlay *) (objects[4])); +DuelLayers::DuelLayers() : nbitems(0) {} + +DuelLayers::~DuelLayers(){ + for (int i = 0; i < nbitems; ++i) delete objects[i]; } +int DuelLayers::unstoppableRenderInProgress(){ + for (int i = 0; i < nbitems; ++i) + if (objects[i]->unstoppableRenderInProgress()) + return 1; + return 0; +} +void DuelLayers::Add(GuiLayer * layer){ + objects.push_back(layer); + nbitems++; +} + +void DuelLayers::Remove(){ + --nbitems; +} + +void DuelLayers::Render(){ + bool focusMakesItThrough = true; + for (int i = 0; i < nbitems; ++i) + { + objects[i]->hasFocus = focusMakesItThrough; + if (objects[i]->modal) focusMakesItThrough = false; + } + for (int i = nbitems - 1; i >= 0; --i) + objects[i]->Render(); +} + +int DuelLayers::receiveEvent(WEvent * e){ + +#if 0 +#define PRINT_IF(type) { type *foo = dynamic_cast(e); if (foo) cout << "Is a " << #type << endl; } + cout << "Received event " << e << endl; + PRINT_IF(WEventZoneChange); + PRINT_IF(WEventDamage); + PRINT_IF(WEventPhaseChange); + PRINT_IF(WEventCardUpdate); + PRINT_IF(WEventCardTap); + PRINT_IF(WEventCreatureAttacker); + PRINT_IF(WEventCreatureBlocker); + PRINT_IF(WEventCreatureBlockerRank); + PRINT_IF(WEventEngageMana); + PRINT_IF(WEventConsumeMana); +#endif + + int used = 0; + for (int i = 0; i < nbitems; ++i) + used |= objects[i]->receiveEventPlus(e); + if (!used) + { + Pos* p; + if (WEventZoneChange *event = dynamic_cast(e)) + { + if (event->card->view) + waiters.push_back(p = new Pos(*(event->card->view))); + else + waiters.push_back(p = new Pos(0, 0, 0, 0, 255)); + event->card->view = p; + } + } + for (int i = 0; i < nbitems; ++i) + objects[i]->receiveEventMinus(e); + return 1; +} + +float DuelLayers::RightBoundary() +{ + return hand->LeftBoundary(); +} diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index a05fa15a8..bd5d6b371 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -24,6 +24,8 @@ int GameApp::HasMusic = 1; JMusic * GameApp::music = NULL; string GameApp::systemError = ""; +JQuad* manaIcons[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + GameState::GameState(GameApp* parent): mParent(parent) { mEngine = JGE::GetInstance(); @@ -64,19 +66,15 @@ void GameApp::Create() //Test for Music files presence std::ifstream file(RESPATH"/sound/Track0.mp3"); - if(file){ + if (file) file.close(); - }else{ + else HasMusic = 0; - } std::ifstream file2(RESPATH"/sound/Track1.mp3"); - if(file2){ + if (file2) file2.close(); - }else{ + else HasMusic = 0; - } - - CommonRes->CreateTexture("graphics/menuicons.png"); //Creating thes quad in this specific order allows us to have them in the correct order to call them by integer id @@ -87,6 +85,14 @@ void GameApp::Create() CommonRes->CreateQuad("c_black", "graphics/menuicons.png", 2 + 2*36, 38, 32, 32); CommonRes->CreateQuad("c_white", "graphics/menuicons.png", 2 + 4*36, 38, 32, 32); CommonRes->CreateQuad("c_land", "graphics/menuicons.png", 2 + 5*36, 38, 32, 32); + manaIcons[Constants::MTG_COLOR_ARTIFACT] = GameApp::CommonRes->GetQuad("c_artifact"); + manaIcons[Constants::MTG_COLOR_LAND] = GameApp::CommonRes->GetQuad("c_land"); + manaIcons[Constants::MTG_COLOR_WHITE] = GameApp::CommonRes->GetQuad("c_white"); + manaIcons[Constants::MTG_COLOR_RED] = GameApp::CommonRes->GetQuad("c_red"); + manaIcons[Constants::MTG_COLOR_BLACK] = GameApp::CommonRes->GetQuad("c_black"); + manaIcons[Constants::MTG_COLOR_BLUE] = GameApp::CommonRes->GetQuad("c_blue"); + manaIcons[Constants::MTG_COLOR_GREEN] = GameApp::CommonRes->GetQuad("c_green"); + for (int i = sizeof(manaIcons)/sizeof(manaIcons[0]) - 1; i >= 0; --i) manaIcons[i]->SetHotSpot(16,16); CommonRes->CreateTexture("sets/back.jpg"); @@ -108,9 +114,54 @@ void GameApp::Create() CommonRes->CreateTexture("graphics/phasebar.png"); - CommonRes->CreateTexture("graphics/background.png"); + CommonRes->CreateTexture("graphics/wood.png"); + CommonRes->CreateTexture("graphics/gold.png"); + CommonRes->CreateTexture("graphics/goldglow.png"); CommonRes->CreateTexture("graphics/back.jpg"); - CommonRes->CreateTexture("graphics/phasebar.png"); + + CommonRes->CreateTexture("graphics/handback.png"); + + CommonRes->CreateTexture("sets/red.jpg"); + CommonRes->CreateTexture("sets/white.jpg"); + CommonRes->CreateTexture("sets/blue.jpg"); + CommonRes->CreateTexture("sets/black.jpg"); + CommonRes->CreateTexture("sets/green.jpg"); + CommonRes->CreateQuad("red", "sets/red.jpg", 0, 0, 200, 285); + CommonRes->CreateQuad("white", "sets/white.jpg", 0, 0, 200, 285); + CommonRes->CreateQuad("blue", "sets/blue.jpg", 0, 0, 200, 285); + CommonRes->CreateQuad("black", "sets/black.jpg", 0, 0, 200, 285); + CommonRes->CreateQuad("green", "sets/green.jpg", 0, 0, 200, 285); + CommonRes->GetQuad("red")->SetHotSpot(100, 145); + CommonRes->GetQuad("white")->SetHotSpot(100, 145); + CommonRes->GetQuad("blue")->SetHotSpot(100, 145); + CommonRes->GetQuad("black")->SetHotSpot(100, 145); + CommonRes->GetQuad("green")->SetHotSpot(100, 145); + + CommonRes->CreateTexture("sets/red_thumb.jpg"); + CommonRes->CreateTexture("sets/white_thumb.jpg"); + CommonRes->CreateTexture("sets/blue_thumb.jpg"); + CommonRes->CreateTexture("sets/black_thumb.jpg"); + CommonRes->CreateTexture("sets/green_thumb.jpg"); + CommonRes->CreateQuad("red_thumb", "sets/red_thumb.jpg", 0, 0, 28, 40); + CommonRes->CreateQuad("white_thumb", "sets/white_thumb.jpg", 0, 0, 28, 40); + CommonRes->CreateQuad("blue_thumb", "sets/blue_thumb.jpg", 0, 0, 28, 40); + CommonRes->CreateQuad("black_thumb", "sets/black_thumb.jpg", 0, 0, 28, 40); + CommonRes->CreateQuad("green_thumb", "sets/green_thumb.jpg", 0, 0, 28, 40); + CommonRes->GetQuad("red_thumb")->SetHotSpot(14, 20); + CommonRes->GetQuad("white_thumb")->SetHotSpot(14, 20); + CommonRes->GetQuad("blue_thumb")->SetHotSpot(14, 20); + CommonRes->GetQuad("black_thumb")->SetHotSpot(14, 20); + CommonRes->GetQuad("green_thumb")->SetHotSpot(14, 20); + + CommonRes->CreateTexture("graphics/BattleIcon.png"); + CommonRes->CreateTexture("graphics/DefenderIcon.png"); + CommonRes->CreateTexture("graphics/shadow.png"); + CommonRes->CreateQuad("BattleIcon", "graphics/BattleIcon.png", 0, 0, 25, 25); + CommonRes->CreateQuad("DefenderIcon", "graphics/DefenderIcon.png", 0, 0, 24, 23); + CommonRes->CreateQuad("shadow", "graphics/shadow.png", 0, 0, 1, 1); + CommonRes->GetQuad("BattleIcon")->SetHotSpot(12, 12); + CommonRes->GetQuad("DefenderIcon")->SetHotSpot(12, 12); + CommonRes->GetQuad("shadow")->SetHotSpot(0.5, 0.5); //CommonRes->CreateTexture("graphics/interrupt.png"); //CommonRes->CreateQuad("interrupt", "graphics/interrupt.png", 0, 0, 256, 128); @@ -188,8 +239,6 @@ void GameApp::Destroy() SAFE_DELETE(CommonRes); - GameOptions::Destroy(); //No delete ??? - SAFE_DELETE(Subtypes::subtypesList); SAFE_DELETE(MtgSets::SetsList); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index ba06a02d5..f86c1892c 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -88,10 +88,12 @@ void GameObserver::nextGamePhase(){ Phase * cPhaseOld = phaseRing->getCurrentPhase(); if (!blockersSorted && cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS){ blockersAssigned = 1; + /* if (!mLayers->combatLayer()->autoOrderBlockers()){ OutputDebugString("Player has To choose ordering!"); return; } + */ } phaseRing->forward(); @@ -149,18 +151,20 @@ int GameObserver::cancelCurrentAction(){ void GameObserver::userRequestNextGamePhase(){ if (mLayers->stackLayer()->getNext(NULL,0,NOT_RESOLVED)) return; if (getCurrentTargetChooser()) return; - if (mLayers->combatLayer()->isDisplayed()) return; + // if (mLayers->combatLayer()->isDisplayed()) return; Phase * cPhaseOld = phaseRing->getCurrentPhase(); if (!blockersSorted && cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS){ blockersAssigned = 1; + /* if (!mLayers->combatLayer()->autoOrderBlockers()){ OutputDebugString("Player has To choose ordering!"); return; } + */ } - if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS || - opponent()->isAI() || - GameOptions::GetInstance()->values[GameOptions::phaseInterrupts[currentGamePhase]].getIntValue()){ + if (cPhaseOld->id == Constants::MTG_PHASE_COMBATBLOCKERS || + opponent()->isAI() || + options[GameOptions::phaseInterrupts[currentGamePhase]].number){ mLayers->stackLayer()->AddNextGamePhase(); }else{ nextGamePhase(); @@ -170,30 +174,31 @@ void GameObserver::userRequestNextGamePhase(){ int GameObserver::forceShuffleLibraries(){ OutputDebugString("FORCING\n"); int result = 0; - for (int i=0; i<2; i++){ - if (forceShuffleLibrary[i]) { - forceShuffleLibrary[i] = 0; - players[i]->game->library->shuffle(); - result++; - OutputDebugString("YAY\n"); + if (players[0]->game->library->needShuffle) + { + players[0]->game->library->shuffle(); + players[0]->game->library->needShuffle = false; + ++result; + } + if (players[1]->game->library->needShuffle) + { + players[1]->game->library->shuffle(); + players[1]->game->library->needShuffle = false; + ++result; } - } - if (result) mLayers->playLayer()->forceUpdateCards(); return result; } void GameObserver::startGame(int shuffle, int draw){ int i; - for (i=0; igame->initGame(shuffle, draw); - forceShuffleLibrary[i] = 0; - } //Preload images from hand if (!players[0]->isAI()){ for (i=0; i< players[0]->game->hand->nb_cards; i++){ - players[0]->game->hand->cards[i]->getThumb(); - players[0]->game->hand->cards[i]->getQuad(); + cache.getThumb(players[0]->game->hand->cards[i]); + cache.getQuad(players[0]->game->hand->cards[i]); } } turn = 0; @@ -202,9 +207,8 @@ void GameObserver::startGame(int shuffle, int draw){ //Difficult mode special stuff if (!players[0]->isAI() && players[1]->isAI()){ - GameOptions * go = GameOptions::GetInstance(); - int difficulty = go->values[OPTIONS_DIFFICULTY].getIntValue(); - if (go->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED].getIntValue() && difficulty) { + int difficulty = options[Options::DIFFICULTY].number; + if (options[Options::DIFFICULTY_MODE_UNLOCKED].number && difficulty) { Player * p = players[1]; for (int level=0; level < difficulty; level ++){ MTGCardInstance * card = NULL; @@ -218,7 +222,7 @@ void GameObserver::startGame(int shuffle, int draw){ } if (card){ MTGCardInstance * copy = p->game->putInZone(card, p->game->library, p->game->stack); - Spell * spell = NEW Spell(copy); + Spell * spell = NEW Spell(copy); spell->resolve(); delete spell; } @@ -259,8 +263,8 @@ void GameObserver::Update(float dt){ if (currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS && !blockersSorted){ player = opponent(); }else if (currentGamePhase == Constants::MTG_PHASE_COMBATDAMAGE){ - DamageResolverLayer * drl = mLayers->combatLayer(); - if (drl->currentChoosingPlayer && drl->mCount) player = drl->currentChoosingPlayer; + // DamageResolverLayer * drl = mLayers->combatLayer(); + // if (drl->currentChoosingPlayer && drl->mCount) player = drl->currentChoosingPlayer; } currentActionPlayer = player; if (isInterrupting) player = isInterrupting; @@ -309,39 +313,33 @@ void GameObserver::Render(){ -void GameObserver::ButtonPressed (int controllerId, PlayGuiObject * _object){ +void GameObserver::ButtonPressed(PlayGuiObject * target){ #if defined (WIN32) || defined (LINUX) OutputDebugString("Click\n"); #endif - int id = _object->GetId(); - if (id >=0){ - MTGCardInstance * card = ((CardGui *)_object)->card; + if (CardView* cardview = dynamic_cast(target)){ + MTGCardInstance * card = cardview->getCard(); cardClick(card, card); } - if (id== -6 || id == -4){ //libraries - GuiGameZone * zone = (GuiGameZone *)_object; - if (zone->showCards){ - zone->toggleDisplay(); + else if (GuiLibrary* library = dynamic_cast(target)){ + if (library->showCards){ + library->toggleDisplay(); forceShuffleLibraries(); } else { - int pId = (-id - 4)/2; TargetChooser * _tc = this->getCurrentTargetChooser(); - if (_tc && _tc->targetsZone(players[pId]->game->library)){ - zone->toggleDisplay(); - forceShuffleLibrary[pId] = 1; + if (_tc && _tc->targetsZone(library->zone)){ + library->toggleDisplay(); + library->zone->needShuffle = true; } } - } - if (id== -5 || id == -3){ - GuiGameZone * zone = (GuiGameZone *)_object; - zone->toggleDisplay(); - } - if (id == -1 || id == -2){ + else if (GuiGraveyard* graveyard = dynamic_cast(target)) + graveyard->toggleDisplay(); + else if (GuiAvatar* avatar = dynamic_cast(target)){ #if defined (WIN32) || defined (LINUX) OutputDebugString("Click Player !\n"); #endif - cardClick(NULL, ((GuiAvatar *)_object)->player); + cardClick(NULL, avatar->player); } } @@ -468,8 +466,8 @@ int GameObserver::receiveEvent(WEvent * e){ } -int GameObserver::isACreature(MTGCardInstance * card){ - return card->isACreature(); +bool GameObserver::isCreature(MTGCardInstance * card){ + return card->isCreature(); } diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index 0a9a87260..dbdb603e4 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -22,22 +22,24 @@ const char* GameOptions::phaseInterrupts[] = { "interrupt Cleanup", "interrupt ---" }; +const string Options::MUSICVOLUME = "musicVolume"; +const string Options::SFXVOLUME = "sfxVolume"; +const string Options::DIFFICULTY_MODE_UNLOCKED = "prx_handler"; //huhu +const string Options::MOMIR_MODE_UNLOCKED = "prx_rimom"; //haha +const string Options::DIFFICULTY = "difficulty"; +const string Options::CACHESIZE = "cacheSize"; +const string Options::PLASMAEFFECT = "plasmaEffect"; +const string Options::INTERRUPT_SECONDS = "interruptSeconds"; +const string Options::INTERRUPTMYSPELLS = "interruptMySpells"; +const string Options::INTERRUPTMYABILITIES = "interruptMyAbilities"; +const string Options::EVILTWIN_MODE_UNLOCKED = "prx_eviltwin"; +const string Options::RANDOMDECK_MODE_UNLOCKED = "prx_rnddeck"; +const string Options::OSD = "displayOSD"; -GameOption::GameOption(int _value){ - value = _value; -} -int GameOption::getIntValue(){ - return value; -} -GameOptions* GameOptions::mInstance = NULL; - -GameOptions * GameOptions::GetInstance(){ - if (mInstance == NULL) - mInstance = NEW GameOptions(); - return mInstance; -} +GameOption::GameOption(int value) : number(value){} +GameOption::GameOption(string value) : str(value){} GameOptions::GameOptions(){ load(); @@ -63,7 +65,7 @@ int GameOptions::save(){ if (file){ map::iterator it; for ( it=values.begin() ; it != values.end(); it++ ){ - sprintf(writer,"%s=%d\n", it->first.c_str(), it->second.getIntValue()); + sprintf(writer,"%s=%d\n", it->first.c_str(), it->second.number); file<GetJLBFont(Constants::MENU_FONT); - mFont->SetBase(0); + mFont->SetBase(0); opponentMenuFont = mFont; @@ -116,7 +116,7 @@ void GameStateDuel::loadPlayerRandom(int playerId, int isAI, int mode){ int nbcolors = 3; string lands[] = {"forest", "forest", "island", "mountain", "swamp", "plains", "forest"}; - + MTGDeck * tempDeck = NEW MTGDeck(NULL, mParent->collection); tempDeck->addRandomCards(9,0,0,-1,lands[color1].c_str()); @@ -129,15 +129,14 @@ void GameStateDuel::loadPlayerRandom(int playerId, int isAI, int mode){ tempDeck->addRandomCards(2,0,0,-1,"instant",colors,nbcolors); tempDeck->addRandomCards(2,0,0,-1,"artifact",colors,nbcolors); - char * deckFile = "random"; + string deckFile = "random"; string deckFileSmall = "random"; - deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck); - if (!isAI){ //Human Player - mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFile, deckFileSmall); - }else{ - mPlayers[playerId] = NEW AIPlayerBaka(deck[playerId],deckFile, deckFileSmall.c_str() , ""); - } + deck[playerId] = NEW MTGPlayerCards(mParent->collection, tempDeck); + if (!isAI) // Human Player + mPlayers[playerId] = NEW HumanPlayer(deck[playerId], deckFile, deckFileSmall); + else + mPlayers[playerId] = NEW AIPlayerBaka(deck[playerId],deckFile, deckFileSmall, ""); delete tempDeck; } @@ -147,12 +146,11 @@ void GameStateDuel::loadPlayerMomir(int playerId, int isAI){ string deckFileSmall = "momir"; char empty[] = ""; MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection); - deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck); - if (!isAI){ //Human Player - mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFile, deckFileSmall); - }else{ - mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId],deckFile,deckFileSmall.c_str(), empty); - } + deck[playerId] = NEW MTGPlayerCards(mParent->collection, tempDeck); + if (!isAI) // Human Player + mPlayers[playerId] = NEW HumanPlayer(deck[playerId], deckFile, deckFileSmall); + else + mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId], deckFile, deckFileSmall, empty); delete tempDeck; } @@ -295,17 +293,15 @@ void GameStateDuel::Update(float dt) else deckmenu->Update(dt); break; case DUEL_STATE_CHOOSE_DECK2: - if (mParent->players[1] == PLAYER_TYPE_HUMAN){ + if (mParent->players[1] == PLAYER_TYPE_HUMAN) deckmenu->Update(dt); - } else{ if (mParent->players[0] == PLAYER_TYPE_HUMAN){ if (!opponentMenu){ opponentMenu = NEW SimpleMenu(DUEL_MENU_CHOOSE_OPPONENT, this, opponentMenuFont, 35, 25, "Choose Opponent"); opponentMenu->Add(0,"Random"); - if (GameOptions::GetInstance()->values[OPTIONS_EVILTWIN_MODE_UNLOCKED].getIntValue()){ - opponentMenu->Add(-1,"Evil Twin", "Can you play against yourself?"); - } + if (options[Options::EVILTWIN_MODE_UNLOCKED].number) + opponentMenu->Add(-1,"Evil Twin", "Can you play against yourself?"); fillDeckMenu(opponentMenu,RESPATH"/ai/baka", "ai_baka", mPlayers[0]); } opponentMenu->Update(dt); @@ -457,7 +453,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId) break; } case DUEL_MENU_CHOOSE_DECK: - { + { if (controlId < 0){ mParent->SetNextState(GAME_STATE_DECK_VIEWER); return; diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index ae8e5d6ca..7813e835b 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -5,7 +5,7 @@ #include "../include/GameOptions.h" #include "../include/GameApp.h" #include "../include/MTGCard.h" -#include "../include/Translate.h" +#include "../include/Translate.h" #include "../include/DeckStats.h" #include "../include/PlayerData.h" #include "../include/utils.h" @@ -148,23 +148,19 @@ void GameStateMenu::Start(){ JRenderer::GetInstance()->EnableVSync(true); subMenuController = NULL; - if (GameApp::HasMusic && !GameApp::music && GameOptions::GetInstance()->values[OPTIONS_MUSICVOLUME].getIntValue() > 0){ + if (GameApp::HasMusic && !GameApp::music && options[Options::MUSICVOLUME].number > 0){ GameApp::music = JSoundSystem::GetInstance()->LoadMusic("sound/Track0.mp3"); JSoundSystem::GetInstance()->PlayMusic(GameApp::music, true); } - if (GameApp::HasMusic && GameApp::music && GameOptions::GetInstance()->values[OPTIONS_MUSICVOLUME].getIntValue() == 0){ + if (GameApp::HasMusic && GameApp::music && options[Options::MUSICVOLUME].number == 0){ JSoundSystem::GetInstance()->StopMusic(GameApp::music); SAFE_DELETE(GameApp::music); } hasChosenGameType = 1; - if (GameOptions::GetInstance()->values[OPTIONS_MOMIR_MODE_UNLOCKED].getIntValue()) hasChosenGameType =0; - if (GameOptions::GetInstance()->values[OPTIONS_RANDOMDECK_MODE_UNLOCKED].getIntValue()) hasChosenGameType =0; - - - - + if (options[Options::MOMIR_MODE_UNLOCKED].number) hasChosenGameType = 0; + if (options[Options::RANDOMDECK_MODE_UNLOCKED].number) hasChosenGameType = 0; } @@ -175,7 +171,7 @@ void GameStateMenu::fillScroller(){ DeckStats * stats = DeckStats::GetInstance(); int totalGames = 0; - + for (int j=1; j<6; j++){ sprintf(buffer, RESPATH"/player/stats/player_deck%i.txt",j); if(fileExists(buffer)){ @@ -194,28 +190,26 @@ void GameStateMenu::fillScroller(){ sprintf(buff2, _("You have played a total of %i games").c_str(),totalGames); scroller->Add(buff2); } - - GameOptions * go = GameOptions::GetInstance(); - if (!go->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED].getIntValue()){ - scroller->Add(_("Unlock the difficult mode for more challenging duels!")); - } - if (!go->values[OPTIONS_MOMIR_MODE_UNLOCKED].getIntValue()){ - scroller->Add(_("Interested in playing Momir Basic? You'll have to unlock it first :)")); - } - if (!go->values[OPTIONS_RANDOMDECK_MODE_UNLOCKED].getIntValue()){ - scroller->Add(_("You haven't unlocked the random deck mode yet")); - } - if (!go->values[OPTIONS_EVILTWIN_MODE_UNLOCKED].getIntValue()){ - scroller->Add(_("You haven't unlocked the evil twin mode yet")); - } + if (!options[Options::DIFFICULTY_MODE_UNLOCKED].number) + scroller->Add(_("Unlock the difficult mode for more challenging duels!")); + if (!options[Options::MOMIR_MODE_UNLOCKED].number) + scroller->Add(_("Interested in playing Momir Basic? You'll have to unlock it first :)")); + if (!options[Options::RANDOMDECK_MODE_UNLOCKED].number) + scroller->Add(_("You haven't locked the random deck mode yet")); + if (!options[Options::EVILTWIN_MODE_UNLOCKED].number) + scroller->Add(_("You haven't unlocked the evil twin mode yet")); + if (!options[Options::RANDOMDECK_MODE_UNLOCKED].number) + scroller->Add(_("You haven't unlocked the random deck mode yet")); + if (!options[Options::EVILTWIN_MODE_UNLOCKED].number) + scroller->Add(_("You haven't unlocked the evil twin mode yet")); //Unlocked sets int nbunlocked = 0; for (int i = 0; i < MtgSets::SetsList->nb_items; i++){ string s = MtgSets::SetsList->values[i]; sprintf(buffer,"unlocked_%s", s.c_str()); - if (GameOptions::GetInstance()->values[buffer].getIntValue() == 1 ) nbunlocked++; + if (1 == options[buffer].number) nbunlocked++; } sprintf(buff2, _("You have unlocked %i expansions out of %i").c_str(),nbunlocked, MtgSets::SetsList->nb_items); scroller->Add(buff2); @@ -323,20 +317,16 @@ void GameStateMenu::Update(float dt) string s = MtgSets::SetsList->values[setId]; char buffer[4096]; sprintf(buffer,"unlocked_%s", s.c_str()); - GameOptions::GetInstance()->values[buffer] = GameOption(1); - GameOptions::GetInstance()->save(); - - createUsersFirstDeck(setId); + options[buffer] = GameOption(1); + options.save(); + createUsersFirstDeck(setId); } currentState = MENU_STATE_MAJOR_MAINMENU | MENU_STATE_MINOR_NONE; break; case MENU_STATE_MAJOR_MAINMENU : if (!scrollerSet) fillScroller(); - if (mGuiController!=NULL){ + if (NULL != mGuiController) mGuiController->Update(dt); - } - - break; case MENU_STATE_MAJOR_SUBMENU : subMenuController->Update(dt); @@ -345,25 +335,24 @@ void GameStateMenu::Update(float dt) case MENU_STATE_MAJOR_DUEL : if (MENU_STATE_MINOR_NONE == (currentState & MENU_STATE_MINOR)) { - if (!hasChosenGameType){ - currentState = MENU_STATE_MAJOR_SUBMENU; - JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT); - subMenuController = NEW SimpleMenu(102, this, mFont, 150,60); + if (!hasChosenGameType){ + currentState = MENU_STATE_MAJOR_SUBMENU; + JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT); + subMenuController = NEW SimpleMenu(102, this, mFont, 150,60); if (subMenuController){ subMenuController->Add(SUBMENUITEM_CLASSIC,"Classic"); - if (GameOptions::GetInstance()->values[OPTIONS_MOMIR_MODE_UNLOCKED].getIntValue()){ - subMenuController->Add(SUBMENUITEM_MOMIR, "Momir Basic"); - } - if (GameOptions::GetInstance()->values[OPTIONS_RANDOMDECK_MODE_UNLOCKED].getIntValue()){ - subMenuController->Add(SUBMENUITEM_RANDOM1, "Random 1 Color"); - subMenuController->Add(SUBMENUITEM_RANDOM2, "Random 2 Colors"); - } + if (options[Options::MOMIR_MODE_UNLOCKED].number) + subMenuController->Add(SUBMENUITEM_MOMIR, "Momir Basic"); + if (options[Options::RANDOMDECK_MODE_UNLOCKED].number){ + subMenuController->Add(SUBMENUITEM_RANDOM1, "Random 1 Color"); + subMenuController->Add(SUBMENUITEM_RANDOM2, "Random 2 Colors"); + } subMenuController->Add(SUBMENUITEM_CANCEL, "Cancel"); - } - }else{ + } + }else{ mParent->SetNextState(GAME_STATE_DUEL); currentState = MENU_STATE_MAJOR_MAINMENU; - } + } } } switch (MENU_STATE_MINOR & currentState) @@ -484,7 +473,7 @@ void GameStateMenu::Render() if (yW < 2*SCREEN_HEIGHT) renderer->RenderQuad(mMovingW, SCREEN_WIDTH/2 - 10, yW, angleW); if (mGuiController!=NULL) mGuiController->Render(); - + mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); mFont->SetColor(ARGB(128,255,255,255)); mFont->DrawString(GAME_VERSION, SCREEN_WIDTH-10,5,JGETEXT_RIGHT); diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index f14c47e6f..4331c030b 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -25,23 +25,20 @@ void GameStateOptions::Start() JRenderer::GetInstance()->EnableVSync(true); optionsList = NEW OptionsList(); - if (GameApp::HasMusic) optionsList->Add(NEW OptionItem(OPTIONS_MUSICVOLUME, "Music volume", 100, 10)); - optionsList->Add(NEW OptionItem(OPTIONS_SFXVOLUME, "SFX volume", 100, 10)); - optionsList->Add(NEW OptionItem(OPTIONS_INTERRUPTMYSPELLS, "interrupt my spells")); - optionsList->Add(NEW OptionItem(OPTIONS_INTERRUPTMYABILITIES, "interrupt my abilities")); - optionsList->Add(NEW OptionItem(OPTIONS_OSD, "Display InGame extra information")); - // WALDORF - added next line - optionsList->Add(NEW OptionItem(OPTIONS_INTERRUPT_SECONDS, "Seconds to pause for an Interrupt", 20, 1)); - if (GameOptions::GetInstance()->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED].getIntValue()) { - optionsList->Add(NEW OptionItem(OPTIONS_DIFFICULTY, "Difficulty", 3, 1)); - } - optionsList->Add(NEW OptionItem(OPTIONS_CACHESIZE, "Image Cache Size", 60, 5)); + if (GameApp::HasMusic) optionsList->Add(NEW OptionItem(Options::MUSICVOLUME, "Music volume", 100, 10)); + optionsList->Add(NEW OptionItem(Options::SFXVOLUME, "SFX volume", 100, 10)); + optionsList->Add(NEW OptionItem(Options::INTERRUPTMYSPELLS, "interrupt my spells")); + optionsList->Add(NEW OptionItem(Options::INTERRUPTMYABILITIES, "interrupt my abilities")); + optionsList->Add(NEW OptionItem(Options::INTERRUPT_SECONDS, "Seconds to pause for an Interrupt", 20, 1)); + optionsList->Add(NEW OptionItem(Options::OSD, "Display InGame extra information")); + if (options[Options::DIFFICULTY_MODE_UNLOCKED].number) + optionsList->Add(NEW OptionItem(Options::DIFFICULTY, "Difficulty", 3, 1)); + optionsList->Add(NEW OptionItem(Options::CACHESIZE, "Image Cache Size", 60, 5)); JLBFont * mFont = GameApp::CommonRes->GetJLBFont("graphics/f3"); optionsMenu = NEW SimpleMenu(102, this,mFont, 50,170); optionsMenu->Add(1, "Save & Back to Main Menu"); optionsMenu->Add(2, "Back to Main Menu"); optionsMenu->Add(3, "Cancel"); - } diff --git a/projects/mtg/src/GameStateShop.cpp b/projects/mtg/src/GameStateShop.cpp index 793837f96..48273920c 100644 --- a/projects/mtg/src/GameStateShop.cpp +++ b/projects/mtg/src/GameStateShop.cpp @@ -67,22 +67,21 @@ void GameStateShop::load(){ if (s.compare("10E") == 0) defaultSet = i; char buffer[4096]; sprintf(buffer,"unlocked_%s", s.c_str()); - unlocked[i] = GameOptions::GetInstance()->values[buffer].getIntValue(); - if ( unlocked[i] ){ + unlocked[i] = options[buffer].number; + if (unlocked[i]) ok = 1; - } } if (!ok){ unlocked[defaultSet] = 1; string s = MtgSets::SetsList->values[defaultSet]; char buffer[4096]; sprintf(buffer,"unlocked_%s", s.c_str()); - GameOptions::GetInstance()->values[buffer] = GameOption(1); - GameOptions::GetInstance()->save(); + options[buffer] = GameOption(1); + options.save(); } for (int i = 0; i < MtgSets::SetsList->nb_items; i++){ - if (unlocked[i] ){ + if (unlocked[i]){ sets[nbsets] = i; nbsets++; if (mParent->collection->countBySet(i) > 80){ //Only sets with more than 80 cards can get boosters and starters diff --git a/projects/mtg/src/GuiLayers.cpp b/projects/mtg/src/GuiLayers.cpp index 6677457f0..4f02c8c25 100644 --- a/projects/mtg/src/GuiLayers.cpp +++ b/projects/mtg/src/GuiLayers.cpp @@ -2,9 +2,7 @@ #include "../include/GuiLayers.h" #include "../include/Player.h" -GuiLayer::GuiLayer(int id, GameObserver* _game){ - mId = id; - game = _game; +GuiLayer::GuiLayer(){ modal = 0; hasFocus = false; mCount = 0; @@ -42,7 +40,7 @@ int GuiLayer::getMaxId(){ void GuiLayer::Render(){ for (int i=0;iRender(); + mObjects[i]->Render(); } void GuiLayer::Update(float dt){ @@ -103,77 +101,3 @@ JGuiObject * GuiLayer::getByIndex(int index){ return mObjects[index]; } - -GuiLayers::GuiLayers(){ - nbitems = 0; -} - -GuiLayers::~GuiLayers(){ - LOG("==Destroying GuiLayers=="); - for (int i=0; iunstoppableRenderInProgress()) - return 1; - } - return 0; -} - - - -void GuiLayers::Add(GuiLayer * layer){ - if (nbitems >=MAX_GUI_LAYERS || nbitems < 0){ - LOG("OUT OF BOUND IN GuiLayers Add !!!"); - return; - } - objects[nbitems] = layer; - nbitems++; -} - -void GuiLayers::Remove(){ - nbitems --; -} - -void GuiLayers::Update(float dt, Player * currentPlayer){ - - for (int i=0; iUpdate(dt); - } - int isAI = currentPlayer->isAI(); - u32 key; - while ((key = JGE::GetInstance()->ReadButton())){ - for (int i=0; iCheckUserInput(key)) break; - } - } - } - if (isAI) currentPlayer->Act(dt); - -} - -void GuiLayers::Render(){ - bool focusMakesItThrough = true; - for (int i = 0; i < nbitems; ++i) - { - objects[i]->hasFocus = focusMakesItThrough; - if (objects[i]->modal) focusMakesItThrough = false; - } - for (int i=nbitems-1; i>=0; i--){ - objects[i]->Render(); - } -} - - -int GuiLayers::receiveEvent(WEvent * e){ - for (int i = 0; i < nbitems; i++){ - objects[i]->receiveEvent(e); - } - return 1; -} - diff --git a/projects/mtg/src/GuiPhaseBar.cpp b/projects/mtg/src/GuiPhaseBar.cpp index 706e46d89..55f0eb0bb 100644 --- a/projects/mtg/src/GuiPhaseBar.cpp +++ b/projects/mtg/src/GuiPhaseBar.cpp @@ -18,7 +18,7 @@ static int colors[] = ARGB(255, 255, 255, 255) }; -GuiPhaseBar::GuiPhaseBar(GameObserver* game):GuiLayer(0,game), phase(GameObserver::GetInstance()->phaseRing->getCurrentPhase()), angle(0.0f) +GuiPhaseBar::GuiPhaseBar() : phase(GameObserver::GetInstance()->phaseRing->getCurrentPhase()), angle(0.0f) { JTexture* texture = GameApp::CommonRes->GetTexture("graphics/phasebar.png"); if (texture) @@ -45,24 +45,24 @@ void GuiPhaseBar::Render() static const float ICONSCALE = 1.5; static const unsigned CENTER = SCREEN_HEIGHT / 2 + 10; JRenderer* renderer = JRenderer::GetInstance(); - unsigned p = (phase->id + Phases - 4) * Width; + unsigned p = (phase->id + Phases - 4) * (Width+1); float scale; float start = CENTER + (Width / 2) * angle * ICONSCALE / (M_PI / 6) - ICONSCALE * Width / 4; renderer->DrawLine(0, CENTER, SCREEN_WIDTH, CENTER, ARGB(255, 255, 255, 255)); scale = ICONSCALE * sinf(angle + 3 * M_PI / 6) / 2; - quad->SetTextureRect((p + 3 * Width) % (Phases * Width), 0, Width, Height); + quad->SetTextureRect((p + 3 * (Width+1)) % (Phases * (Width+1)), 0, Width, Height); renderer->RenderQuad(quad, 0, start, 0.0, scale, scale); start += Width * scale; scale = ICONSCALE * sinf(angle + 4 * M_PI / 6) / 2; - quad->SetTextureRect((p + 4 * Width) % (Phases * Width), Height, Width, Height); + quad->SetTextureRect((p + 4 * (Width+1)) % (Phases * (Width+1)), Height, Width, Height); renderer->RenderQuad(quad, 0, start, 0.0, scale, scale); start += Width * scale; scale = ICONSCALE * sinf(angle + 5 * M_PI / 6) / 2; - quad->SetTextureRect((p + 5 * Width) % (Phases * Width), Height, Width, Height); + quad->SetTextureRect((p + 5 * (Width+1)) % (Phases * (Width+1)), Height, Width, Height); renderer->RenderQuad(quad, 0, start, 0.0, scale, scale); start += Width * scale; @@ -70,25 +70,24 @@ void GuiPhaseBar::Render() scale = ICONSCALE * sinf(angle + 2 * M_PI / 6) / 2; start -= Width * scale; - quad->SetTextureRect((p + 2 * Width) % (Phases * Width), Height, Width, Height); + quad->SetTextureRect((p + 2 * (Width+1)) % (Phases * (Width+1)), Height, Width, Height); renderer->RenderQuad(quad, 0, start, 0.0, scale, scale); scale = ICONSCALE * sinf(angle + 1 * M_PI / 6) / 2; start -= Width * scale; - quad->SetTextureRect((p + 1 * Width) % (Phases * Width), Height, Width, Height); + quad->SetTextureRect((p + 1 * (Width+1)) % (Phases * (Width+1)), Height, Width, Height); renderer->RenderQuad(quad, 0, start, 0.0, scale, scale); if (angle > 0) { scale = ICONSCALE * sinf(angle)/2; start -= Width * scale; - quad->SetTextureRect(p % (Phases * Width), Height, Width, Height); + quad->SetTextureRect(p % (Phases * (Width+1)), Height, Width, Height); renderer->RenderQuad(quad, 0, start, 0.0, scale, scale); } } - -int GuiPhaseBar::receiveEvent(WEvent *e) +int GuiPhaseBar::receiveEventMinus(WEvent *e) { WEventPhaseChange *event = dynamic_cast(e); if (event) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index bb544abc9..c818ffbae 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1311,7 +1311,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ game->mLayers->stackLayer()->addDamage(card, game->players[i], x); for (int j = 0; j < game->players[i]->game->inPlay->nb_cards; j++){ MTGCardInstance * current = game->players[i]->game->inPlay->cards[j]; - if (current->basicAbilities[Constants::FLYING] && current->isACreature()){ + if (current->basicAbilities[Constants::FLYING] && current->isCreature()){ game->mLayers->stackLayer()->addDamage(card, current, x); } } @@ -1348,7 +1348,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ game->mLayers->stackLayer()->addDamage(card, game->players[i], x); for (int j = 0; j < game->players[i]->game->inPlay->nb_cards; j++){ MTGCardInstance * current = game->players[i]->game->inPlay->cards[j]; - if (current->isACreature()){ + if (current->isCreature()){ game->mLayers->stackLayer()->addDamage(card, current, x); } } @@ -1372,13 +1372,13 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ { int x = computeX(spell,card); for (int i = 0; i < 2 ; i++){ - game->mLayers->stackLayer()->addDamage(card, game->players[i], x); - for (int j = 0; j < game->players[i]->game->inPlay->nb_cards; j++){ - MTGCardInstance * current = game->players[i]->game->inPlay->cards[j]; - if (!current->basicAbilities[Constants::FLYING] && current->isACreature()){ - game->mLayers->stackLayer()->addDamage(card, current, x); - } - } + game->mLayers->stackLayer()->addDamage(card, game->players[i], x); + for (int j = 0; j < game->players[i]->game->inPlay->nb_cards; j++){ + MTGCardInstance * current = game->players[i]->game->inPlay->cards[j]; + if (!current->basicAbilities[Constants::FLYING] && current->isCreature()){ + game->mLayers->stackLayer()->addDamage(card, current, x); + } + } } break; } @@ -2286,69 +2286,79 @@ other solutions need to be provided for abilities that add mana (ex: mana flare) */ - AManaProducer::AManaProducer(int id, MTGCardInstance * card, ManaCost * _output, ManaCost * _cost , int doTap):MTGAbility(id, card), tap(doTap){ +AManaProducer::AManaProducer(int id, MTGCardInstance * card, ManaCost * _output, ManaCost * _cost , int doTap):MTGAbility(id, card), tap(doTap){ - LOG("==Creating ManaProducer Object"); - aType=MTGAbility::MANA_PRODUCER; - cost = _cost; - output=_output; - x1 = 10; - y1 = 220; - Player * player = card->controller(); - if (player == game->players[1]) y1 = 100; - x = x1; - y = y1; - animation = 0.f; - mParticleSys = NULL; - menutext = ""; + LOG("==Creating ManaProducer Object"); + aType = MTGAbility::MANA_PRODUCER; + cost = _cost; + output = _output; + cout << "!" << card->view << endl; + if (card->view) + { + x1 = card->view->actX; y1 = card->view->actY; + } + else + { + x1 = 10; y1 = 220; + } + Player * player = card->controller(); + if (player == game->players[1]) y1 = 100; + x = x1; + y = y1; + animation = 0.f; + mParticleSys = NULL; + menutext = ""; - int landColor = output->getMainColor(); + int landColor = output->getMainColor(); - if (landColor == Constants::MTG_COLOR_RED){ + switch (landColor) + { + case Constants::MTG_COLOR_RED : mParticleSys = NEW hgeParticleSystem("graphics/manared.psi",GameApp::CommonRes->GetQuad("particles")); - }else if (landColor == Constants::MTG_COLOR_BLUE){ + break; + case Constants::MTG_COLOR_BLUE : mParticleSys = NEW hgeParticleSystem("graphics/manablue.psi", GameApp::CommonRes->GetQuad("particles")); - }else if (landColor == Constants::MTG_COLOR_GREEN){ + break; + case Constants::MTG_COLOR_GREEN : mParticleSys = NEW hgeParticleSystem("graphics/managreen.psi", GameApp::CommonRes->GetQuad("particles")); - }else if (landColor == Constants::MTG_COLOR_BLACK){ + break; + case Constants::MTG_COLOR_BLACK : mParticleSys = NEW hgeParticleSystem("graphics/manablack.psi", GameApp::CommonRes->GetQuad("particles")); - }else if (landColor == Constants::MTG_COLOR_WHITE){ + break; + case Constants::MTG_COLOR_WHITE : mParticleSys = NEW hgeParticleSystem("graphics/manawhite.psi", GameApp::CommonRes->GetQuad("particles")); - }else{ + break; + default : mParticleSys = NEW hgeParticleSystem("graphics/mana.psi", GameApp::CommonRes->GetQuad("particles")); } + LOG("==ManaProducer Object Creation successful !"); +} - - LOG("==ManaProducer Object Creation successful !"); - } - - void AManaProducer::Update(float dt){ - if (mParticleSys) mParticleSys->Update(dt); - if (animation){ - x = (1.f - animation)*x1 + animation * x0; - y = (1.f - animation)*y1 + animation * y0; - if (mParticleSys) mParticleSys->MoveTo(x, y); - if (mParticleSys && animation == 1.f) mParticleSys->Fire(); - animation -= 4 *dt; - if (!animation) animation = -1; - if (animation < 0){ - resolve(); - } +void AManaProducer::Update(float dt){ + if (mParticleSys) mParticleSys->Update(dt); + if (animation){ + x = (1.f - animation)*x1 + animation * x0; + y = (1.f - animation)*y1 + animation * y0; + if (mParticleSys) mParticleSys->MoveTo(x, y); + if (mParticleSys && animation == 1.f) mParticleSys->Fire(); + animation -= 4 *dt; + if (!animation) animation = -1; + if (animation < 0){ + resolve(); } - } +} - void AManaProducer::Render(){ - JRenderer * renderer = JRenderer::GetInstance(); - if (animation){ - renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE); - if (mParticleSys) mParticleSys->Render(); - // set normal blending - renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); - } - +void AManaProducer::Render(){ + JRenderer * renderer = JRenderer::GetInstance(); + if (animation){ + // renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE); + // if (mParticleSys) mParticleSys->Render(); + // set normal blending + // renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); } +} int AManaProducer::isReactingToClick(MTGCardInstance * _card, ManaCost * mana){ int result = 0; @@ -2387,17 +2397,21 @@ other solutions need to be provided for abilities that add mana (ex: mana flare) currentlyTapping++; animation = 1.f; - CardGui * cardg = game->mLayers->playLayer()->getByCard(source); - if (cardg){ - x0 = cardg->x + 15; - y0 = cardg->y + 20; - } - - if (GameOptions::GetInstance()->values[OPTIONS_SFXVOLUME].getIntValue() > 0 && currentlyTapping < 3){ + if (options[Options::SFXVOLUME].number > 0 && currentlyTapping < 3){ JSample * sample = SampleCache::GetInstance()->getSample("sound/sfx/mana.wav"); if (sample) JSoundSystem::GetInstance()->PlaySample(sample); } + + for (int i = Constants::MTG_NB_COLORS - 2; i >= 1; --i) + { + for (int cost = output->getCost(i); cost > 0; --cost) + { + WEventEngageMana e(i, source); + GameObserver::GetInstance()->receiveEvent(&e); + } + } + return 1; } diff --git a/projects/mtg/src/MTGCard.cpp b/projects/mtg/src/MTGCard.cpp index 68eaf96d6..c169209f2 100644 --- a/projects/mtg/src/MTGCard.cpp +++ b/projects/mtg/src/MTGCard.cpp @@ -3,14 +3,15 @@ //------------------------------------------------- //TODO Fill BasicAbilities -#include "../include/config.h" -#include "../include/MTGCard.h" - -#include "../include/TexturesCache.h" -#include "../include/Subtypes.h" - #include #include + +#include "../include/MTGDeck.h" +#include "../include/config.h" +#include "../include/MTGCard.h" +#include "../include/Subtypes.h" +#include "../include/Translate.h" + using std::string; @@ -18,12 +19,10 @@ const char * const MTGCard::Colors_To_Text[] = {"Artifact", "Green", "Blue", "Re MTGCard::MTGCard(){ init(); - mCache = NULL; } -MTGCard::MTGCard(TexturesCache * cache, int set_id){ +MTGCard::MTGCard(int set_id){ init(); - mCache = cache; setId = set_id; } @@ -32,7 +31,6 @@ const char * MTGCard::getSetName(){ } MTGCard::MTGCard(MTGCard * source){ - mCache = source->mCache; for(map::const_iterator it = source->basicAbilities.begin(); it != source->basicAbilities.end(); ++it){ basicAbilities[it->first] = source->basicAbilities[it->first]; } @@ -55,7 +53,6 @@ MTGCard::MTGCard(MTGCard * source){ toughness = source->toughness; mtgid = source->mtgid; setId = source->setId; - formattedTextInit = 0; magicText = source->magicText; spellTargetType = source->spellTargetType; alias = source->alias; @@ -72,34 +69,63 @@ int MTGCard::init(){ colors[i] = 0; } setId = 0; - formattedTextInit = 0; magicText = ""; spellTargetType = ""; alias = 0; return 1; } -JQuad * MTGCard::getQuad(int type){ - if (mCache == NULL){ - return NULL; - } - return mCache->getQuad(this, type); +const vector& MTGCard::formattedText() +{ + if (ftdText.empty()) + { + std::string s = _(text); + std::string::size_type found = s.find_first_of("{}"); + while (found!=string::npos) + { + s[found] = '/'; + found = s.find_first_of("{}", found + 1); + } + std::string::size_type len = 30; + while (s.length() > 0) + { + std::string::size_type cut = s.find_first_of("., \t)", 0); + if (cut >= len || cut == string::npos) + { + ftdText.push_back(s.substr(0,len)); + if (s.length() > len) + s = s.substr(len, s.length() - len); + else + s = ""; + } + else + { + std::string::size_type newcut = cut; + while (newcut < len && newcut != string::npos) + { + cut = newcut; + newcut = s.find_first_of("., \t)", newcut + 1); + } + ftdText.push_back(s.substr(0,cut+1)); + if (s.length() > cut+1) + s = s.substr(cut+1,s.length() - cut - 1); + else + s = ""; + } + } + } + return ftdText; } -JQuad * MTGCard::getThumb(){ - return getQuad(CACHE_THUMB); +bool MTGCard::isCreature(){ + return hasSubtype("creature"); } - -JQuad * MTGCard::getQuad(TexturesCache * cache){ - - return cache->getQuad(this); +bool MTGCard::isLand(){ + return hasSubtype("land"); } - - - -int MTGCard::isACreature(){ - return (hasSubtype("creature")); +bool MTGCard::isSpell(){ + return (!isCreature() && !isLand()); } void MTGCard::setColor(int _color, int removeAllOthers){ @@ -234,51 +260,45 @@ void MTGCard::setName( string value){ name = value; //This is a bug fix for plague rats and the "foreach ability" //Right now we add names as types, so that they get recognized - if (value.at(value.length()-1) == 's') Subtypes::subtypesList->Add(value); + if (value.at(value.length()-1) == 's') Subtypes::subtypesList->Add(value); } -const char * MTGCard::getName(){ - return name.c_str(); +const string MTGCard::getName() const{ + return name; } -ManaCost * MTGCard::getManaCost(){ +ManaCost* MTGCard::getManaCost(){ return &manaCost; } -int MTGCard::hasType(int _type){ - int i; - - - for (i = 0; iAdd(_type); - return(hasType(id)); + return hasType(id); } -int MTGCard::hasSubtype(const char * _subtype){ +bool MTGCard::hasSubtype(const char * _subtype){ int id = Subtypes::subtypesList->Add(_subtype); - return(hasType(id)); + return hasType(id); } -int MTGCard::hasSubtype(string _subtype){ +bool MTGCard::hasSubtype(string _subtype){ int id = Subtypes::subtypesList->Add(_subtype); - return(hasType(id)); + return hasType(id); } @@ -304,4 +324,3 @@ void MTGCard::setToughness(int _toughness){ int MTGCard::getToughness(){ return toughness; } - diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index ea3a0ce0c..acd24623e 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -12,24 +12,24 @@ #include using namespace std; -MTGCardInstance::MTGCardInstance(): MTGCard(), Damageable(0){ +MTGCardInstance::MTGCardInstance(): MTGCard(), Damageable(0), view(NULL){ LOG("==Creating MTGCardInstance=="); initMTGCI(); LOG("==Creating MTGCardInstance Successful=="); } -MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * _belongs_to): MTGCard(card), Damageable(card->getToughness()){ +MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to): MTGCard(card), Damageable(card->getToughness()), view(NULL){ LOG("==Creating MTGCardInstance=="); initMTGCI(); model = card; attacker = 0; lifeOrig = life; - belongs_to=_belongs_to; + belongs_to = arg_belongs_to; owner = NULL; - if (_belongs_to) owner = _belongs_to->library->owner; + if (arg_belongs_to) owner = arg_belongs_to->library->owner; lastController = owner; defenser = NULL; banding = NULL; - life=toughness; + life = toughness; LOG("==Creating MTGCardInstance Successful=="); } @@ -60,10 +60,9 @@ void MTGCardInstance::copy(MTGCardInstance * card){ lifeOrig = life; //mtgid = source->mtgid; //setId = source->setId; - formattedTextInit = 0; magicText = source->magicText; spellTargetType = source->spellTargetType; - alias = source->alias; + alias = source->alias; //Now this is dirty... int backupid = mtgid; @@ -109,7 +108,7 @@ void MTGCardInstance::initMTGCI(){ } -const char * MTGCardInstance::getDisplayName(){ +const string MTGCardInstance::getDisplayName(){ return getName(); } @@ -135,7 +134,7 @@ int MTGCardInstance::isInPlay(){ int MTGCardInstance::afterDamage(){ if (!doDamageTest) return 0; doDamageTest = 0; - if (!isACreature()) return 0; + if (!isCreature()) return 0; if (life <=0 && isInPlay()){ return destroy(); } @@ -168,10 +167,6 @@ MTGGameZone * MTGCardInstance::getCurrentZone(){ return NULL; } -JQuad * MTGCardInstance::getIcon(){ - return getThumb(); -} - int MTGCardInstance::has(int basicAbility){ return basicAbilities[basicAbility]; } @@ -271,16 +266,16 @@ return previous->stillInUse(); } /* Summoning Sickness - * 212.3f A creaturefs activated ability with the tap symbol or the untap symbol in its activation cost - * canft be played unless the creature has been under its controllerfs control since the start of his or - * her most recent turn. A creature canft attack unless it has been under its controllerfs control - * since the start of his or her most recent turn. This rule is informally called the gsummoning - * sicknessh rule. Ignore this rule for creatures with haste (see rule 502.5). + * 212.3f A creature's activated ability with the tap symbol or the untap symbol in its activation cost + * can't be played unless the creature has been under its controller's control since the start of his or + * her most recent turn. A creature can't attack unless it has been under its controller's control + * since the start of his or her most recent turn. This rule is informally called the "summoning + * sickness" rule. Ignore this rule for creatures with haste (see rule 502.5). */ int MTGCardInstance::hasSummoningSickness(){ if (!summoningSickness) return 0; if (basicAbilities[Constants::HASTE]) return 0; - if (!isACreature()) return 0; + if (!isCreature()) return 0; return 1; } @@ -318,7 +313,7 @@ int MTGCardInstance::canAttack(){ if (tapped) return 0; if (hasSummoningSickness()) return 0; if (basicAbilities[Constants::DEFENSER] || basicAbilities[Constants::CANTATTACK]) return 0; - if (!isACreature()) return 0; + if (!isCreature()) return 0; if (!isInPlay()) return 0; return 1; } @@ -341,7 +336,7 @@ int MTGCardInstance::setToughness(int value){ int MTGCardInstance::canBlock(){ if (tapped) return 0; if (basicAbilities[Constants::CANTBLOCK]) return 0; - if (!isACreature())return 0; + if (!isCreature()) return 0; if (!isInPlay()) return 0; return 1; } @@ -410,7 +405,7 @@ int MTGCardInstance::setAttacker(int value){ Targetable * target = NULL; Player * p = controller()->opponent(); if (value) target = p; - if (attacker) previousTarget = p; + if (attacker) previousTarget = p; attacker = value; WEvent * e = NEW WEventCreatureAttacker(this,previousTarget, target); GameObserver::GetInstance()->receiveEvent(e); @@ -421,7 +416,7 @@ int MTGCardInstance::setAttacker(int value){ int MTGCardInstance::toggleAttacker(){ if (!attacker){ if (!basicAbilities[Constants::VIGILANCE]) tap(); - setAttacker(1); + setAttacker(1); return 1; }else{ //Banding needs to be debugged... @@ -472,15 +467,15 @@ MTGCardInstance * MTGCardInstance::getNextDefenser(MTGCardInstance * previous){ } int MTGCardInstance::moveBlockerInRow(MTGCardInstance * blocker){ - list::iterator it1 = find(blockers.begin(), blockers.end(), blocker); - list::iterator it2 = it1; - if (it2 == blockers.end()) it2 = blockers.begin(); else ++it2; - if (it2 == blockers.end()) it2 = blockers.begin(); - - std::iter_swap(it1,it2); - WEvent* e = NEW WEventCreatureBlockerRank(blocker,*it2,this); - GameObserver::GetInstance()->receiveEvent(e); - delete(e); + list::iterator it1 = find(blockers.begin(), blockers.end(), blocker); + list::iterator it2 = it1; + if (it2 == blockers.end()) it2 = blockers.begin(); else ++it2; + if (it2 == blockers.end()) it2 = blockers.begin(); + + std::iter_swap(it1,it2); + WEvent* e = NEW WEventCreatureBlockerRank(blocker,*it2,this); + GameObserver::GetInstance()->receiveEvent(e); + delete(e); return 1; } diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index c4653965e..6c07f6ce9 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -275,7 +275,7 @@ int MTGAllCards::readConfLine(std::ifstream &file, int set_id){ switch(conf_read_mode) { case 0: if (s[0] == '['){ - tempCard = NEW MTGCard(mCache,set_id); + tempCard = NEW MTGCard(set_id); conf_read_mode = 1; } break; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 86472a13e..38c844c56 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -14,7 +14,6 @@ //------------------------------ MTGPlayerCards::MTGPlayerCards(MTGAllCards * _collection, int * idList, int idListSize){ - init(); int i; collection = _collection; @@ -25,14 +24,9 @@ MTGPlayerCards::MTGPlayerCards(MTGAllCards * _collection, int * idList, int idLi library->addCard(newCard); } } - - - } - - -MTGPlayerCards::MTGPlayerCards(MTGAllCards * _collection,MTGDeck * deck){ +MTGPlayerCards::MTGPlayerCards(MTGAllCards * _collection, MTGDeck * deck){ init(); collection = _collection; map::iterator it; @@ -70,7 +64,7 @@ void MTGPlayerCards::setOwner(Player * player){ void MTGPlayerCards::initGame(int shuffle, int draw){ if (shuffle) library->shuffle(); if (draw){ - for (int i=0;i<7;i++){ + for (int i=0;i<7;i++){ OutputDebugString("draw\n"); drawFromLibrary(); } @@ -153,10 +147,9 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone } if ((copy = from->removeCard(card,doCopy))){ - - if (GameOptions::GetInstance()->values[OPTIONS_SFXVOLUME].getIntValue() > 0){ + if (options[Options::SFXVOLUME].number > 0){ if (to == g->players[0]->game->graveyard || to == g->players[1]->game->graveyard){ - if (card->isACreature()){ + if (card->isCreature()){ JSample * sample = SampleCache::GetInstance()->getSample("sound/sfx/graveyard.wav"); if (sample) JSoundSystem::GetInstance()->PlaySample(sample); } @@ -170,7 +163,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone ret = NULL; } } - + to->addCard(copy); copy->changedZoneRecently = 1.f; GameObserver *g = GameObserver::GetInstance(); @@ -200,9 +193,7 @@ int MTGPlayerCards::isInPlay(MTGCardInstance * card){ // Zones specific code //-------------------------------------- -MTGGameZone::MTGGameZone(){ - nb_cards= 0; - lastCardDrawn = NULL; +MTGGameZone::MTGGameZone() : nb_cards(0), lastCardDrawn(NULL), needShuffle(false) { } MTGGameZone::~MTGGameZone(){ @@ -227,13 +218,13 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy nb_cards--; cards.erase(cards.begin()+i); MTGCardInstance * copy = card; - if (card->isToken){ //TODO better than this ? + if (card->isToken) //TODO better than this ? return card; - } //card->lastController = card->controller(); if (createCopy) { copy = NEW MTGCardInstance(card->model,card->owner->game); copy->previous = card; + copy->view = card->view; card->next = copy; } copy->previousZone = this; @@ -313,11 +304,8 @@ MTGCardInstance * MTGLibrary::draw(){ } void MTGGameZone::debugPrint(){ - int i; - for (i=0;igetName()); - } + for (int i = 0; i < nb_cards; i++) + std::cerr << cards[i]->getName() << endl; } diff --git a/projects/mtg/src/MTGGuiHand.cpp b/projects/mtg/src/MTGGuiHand.cpp index ba4a46d57..08f77963d 100644 --- a/projects/mtg/src/MTGGuiHand.cpp +++ b/projects/mtg/src/MTGGuiHand.cpp @@ -2,7 +2,7 @@ #include "../include/MTGGuiHand.h" #include "../include/CardGui.h" -MTGGuiHand::MTGGuiHand(int id, GameObserver * _game):GuiCardsController(id, _game){ +MTGGuiHand::MTGGuiHand(GameObserver* game) : game(game) { mShowHand = HAND_HIDE; mAnimState = 0; currentPlayer = NULL; @@ -22,7 +22,7 @@ void MTGGuiHand::updateCards(){ resetObjects(); if (currentId[player->getId()] >= nb_cards) currentId[player->getId()] = nb_cards - 1; for (int i = 0;igame->hand->cards[i],(float)40, (float)450 - (nb_cards-i) *35, SCREEN_HEIGHT_F - mAnimState*60, i == currentId[player->getId()]); + CardView* object = NEW CardView(player->game->hand->cards[i], (float)450 - (nb_cards-i) *35, SCREEN_HEIGHT_F - mAnimState*60); Add(object); if ( i == currentId[player->getId()]) mCurr = i; } @@ -37,7 +37,7 @@ void MTGGuiHand::Update(float dt){ updateCards(); for (int i=0;iy= SCREEN_HEIGHT - mAnimState*60; + ((CardGui *)mObjects[i])->y = SCREEN_HEIGHT - mAnimState*60; } } @@ -79,7 +79,7 @@ bool MTGGuiHand::CheckUserInput(u32 key){ if (mShowHand == HAND_HIDE || currentPlayer->isAI()){ return false; }else{ - GuiCardsController::CheckUserInput(key); + // GuiCardsController::CheckUserInput(key); return true; } } @@ -98,7 +98,7 @@ void MTGGuiHand::Render(){ } if (mCount && mObjects[mCurr] != NULL){ mObjects[mCurr]->Render(); - if (showBigCards) ((CardGui *)mObjects[mCurr])->RenderBig(10,-1,showBigCards-1); + // if (showBigCards) ((CardGui *)mObjects[mCurr])->RenderBig(10,-1,showBigCards-1); } } } diff --git a/projects/mtg/src/MTGGuiPlay.cpp b/projects/mtg/src/MTGGuiPlay.cpp index a76d58568..f4e7198d3 100644 --- a/projects/mtg/src/MTGGuiPlay.cpp +++ b/projects/mtg/src/MTGGuiPlay.cpp @@ -23,7 +23,7 @@ -MTGGuiPlay::MTGGuiPlay(int id, GameObserver * _game):PlayGuiObjectController(id, _game){ +MTGGuiPlay::MTGGuiPlay(GameObserver* game) : game(game){ currentPlayer = NULL; offset = 0; @@ -123,18 +123,18 @@ void MTGGuiPlay::setCardPosition(CardGui * cardg, int player, int playerTurn, in if (!(cardg->x ==0 && cardg->y ==0)) return ; if (card->target) return; - if (spellMode && (card->isACreature() || card->hasType("land"))) return; - if (!spellMode && !card->isACreature() && !card->hasType("land")) return; - if (card->isACreature()){ + if (spellMode && (card->isCreature() || card->isLand())) return; + if (!spellMode && !card->isCreature() && !card->isLand()) return; + if (card->isCreature()){ int x_offset = nb_creatures[player] % cards_x_limit; int y_offset = nb_creatures[player] / cards_x_limit; - cardg->x= ZX_MAIN + (Z_CARDWIDTH * x_offset); - cardg->y=ZY_MAIN + ZH_CREATURES + (Z_CARDHEIGHT * y_offset) + 100 * (1-player); + cardg->x = ZX_MAIN + (Z_CARDWIDTH * x_offset); + cardg->y = ZY_MAIN + ZH_CREATURES + (Z_CARDHEIGHT * y_offset) + 100 * (1-player); nb_creatures[player]++; if (playerTurn){ if (card->isAttacker()){ - cardg->y=122 + 30 * (1-player); + cardg->y = 122 + 30 * (1-player); //Sets position of opponents as well if (player == 1){ for (list::iterator it= card->blockers.begin(); it !=card->blockers.end() ; ++it){ @@ -153,27 +153,26 @@ void MTGGuiPlay::setCardPosition(CardGui * cardg, int player, int playerTurn, in } } } - } }else{ if (card->isDefenser()){ - CardGui * targetg = getByCard(card->isDefenser()); - if (targetg) cardg->x = targetg->x; - cardg->y=122 + 30 * (1-player); + CardGui * targetg = getByCard(card->isDefenser()); + if (targetg) cardg->x = targetg->x; + cardg->y = 122 + 30 * (1-player); } } }else if(card->hasType("land")){ int x_offset = nb_lands[player] % cards_x_limit; int y_offset = nb_lands[player] / cards_x_limit; - cardg->x=ZX_MAIN + (Z_CARDWIDTH * x_offset); - cardg->y=ZY_MAIN + (Z_CARDHEIGHT * y_offset) + 200 * (1-player); + cardg->x = ZX_MAIN + (Z_CARDWIDTH * x_offset); + cardg->y = ZY_MAIN + (Z_CARDHEIGHT * y_offset) + 200 * (1-player); nb_lands[player]++; }else{ int y_offset = nb_spells[player] % Z_SPELLS_NBCARDS; int x_offset = nb_spells[player] / Z_SPELLS_NBCARDS; - cardg->x=ZX_SPELL - (Z_CARDWIDTH * x_offset); - cardg->y=ZY_SPELL + (Z_CARDHEIGHT * y_offset) + 125 * (1-player); + cardg->x = ZX_SPELL - (Z_CARDWIDTH * x_offset); + cardg->y = ZY_SPELL + (Z_CARDHEIGHT * y_offset) + 125 * (1-player); nb_spells[player]++; cards_x_limit = 12 - (nb_spells[player] + 2)/ Z_SPELLS_NBCARDS; } @@ -188,15 +187,14 @@ void MTGGuiPlay::setTargettingCardPosition(CardGui * cardg, int player, int play return; CardGui * targetg = getByCard(target); if (targetg){ - cardg->y=targetg->y + 5; - cardg->x=targetg->x + 5; + cardg->y = targetg->y + 5; + cardg->x = targetg->x + 5; } adjustCardPosition(cardg); return; } void MTGGuiPlay::forceUpdateCards(){ - GameObserver * game = GameObserver::GetInstance(); Player * player = game->players[0]; int player0Mode =(game->currentPlayer == player); int nb_cards = player->game->inPlay->nb_cards; @@ -211,14 +209,14 @@ void MTGGuiPlay::forceUpdateCards(){ for (int i = 0;igame->inPlay->cards[i],40, i*35 + 10, 200, hasFocus); + CardView* object = NEW CardView(player->game->inPlay->cards[i], i*35 + 10, 200); Add(object); hasFocus = false; } hasFocus = !player0Mode; for (int i = 0;igame->inPlay->cards[i],40, i*35 + 10, 10, hasFocus); + CardView* object = NEW CardView(opponent->game->inPlay->cards[i], i*35 + 10, 10); Add(object); hasFocus = false; } @@ -226,16 +224,17 @@ void MTGGuiPlay::forceUpdateCards(){ currentPlayer = game->currentPlayer; } -int MTGGuiPlay::receiveEvent(WEvent *event){ +int MTGGuiPlay::receiveEventPlus(WEvent *event){ WEventZoneChange * e = dynamic_cast(event); if (!e) return 0; - int ok = 0; - for (int i = 0; i < 2 ; i++){ - Player * p = game->players[i]; - if (e->from == p->game->inPlay || e->to == p->game->inPlay ) ok = 1; - } - if (!ok) return 0; - forceUpdateCards(); + if (e->from == game->players[0]->game->inPlay || e->from == game->players[1]->game->inPlay) + { + for (vector::iterator it = mObjects.begin(); it != mObjects.end(); ++it) + if (*it == (JGuiObject*)e->card) { mObjects.erase(it); delete(*it); return 1; } + } + else if (e->to == game->players[0]->game->inPlay || e->to == game->players[1]->game->inPlay) + Add(NEW CardView(e->card, 500, 300)); + // forceUpdateCards(); updateCards(); return 1; } @@ -296,15 +295,15 @@ void MTGGuiPlay::updateCards(){ void MTGGuiPlay::AddPlayersGuiInfo(){ //init with the players objects if (mCount == 0){ - Add(NEW GuiAvatar(-1,50,2,155,false, GameObserver::GetInstance()->players[0])); - Add(NEW GuiAvatar(-2,50,2,30,false,GameObserver::GetInstance()->players[1])); + Add(NEW GuiAvatar(2,155,false, GameObserver::GetInstance()->players[0], GuiAvatar::BOTTOM_RIGHT, NULL)); + Add(NEW GuiAvatar(2,30,false,GameObserver::GetInstance()->players[1], GuiAvatar::BOTTOM_RIGHT, NULL)); - Add(NEW GuiGraveyard(-3,30,40,150,false, GameObserver::GetInstance()->players[0])); - Add(NEW GuiLibrary(-4,30,40,180,false, GameObserver::GetInstance()->players[0])); + Add(NEW GuiGraveyard(40,150,false, GameObserver::GetInstance()->players[0], NULL)); + Add(NEW GuiLibrary(40,180,false, GameObserver::GetInstance()->players[0], NULL)); - Add(NEW GuiGraveyard(-5,30,40,30,false, GameObserver::GetInstance()->players[1])); - Add(NEW GuiLibrary(-6,30,40,60,false, GameObserver::GetInstance()->players[1])); + Add(NEW GuiGraveyard(40,30,false, GameObserver::GetInstance()->players[1], NULL)); + Add(NEW GuiLibrary(40,60,false, GameObserver::GetInstance()->players[1], NULL)); } } @@ -322,7 +321,7 @@ bool MTGGuiPlay::CheckUserInput(u32 key){ return zone->cd->CheckUserInput(key); } } - return PlayGuiObjectController::CheckUserInput(key); + return true; //PlayGuiObjectController::CheckUserInput(key); } @@ -439,7 +438,7 @@ void MTGGuiPlay::Render(){ if (hasFocus && mCurr >= offset && showBigCards && !game->currentlyActing()->isAI() ){ //For some reason RenderBig crashes when the testsuite is playing, so we add a "isAI()" test...which was supposed to be there at some point anyways... CardGui * cardg = ((CardGui *)mObjects[mCurr]); - cardg->RenderBig(-1,-1,showBigCards-1); + //cardg->RenderBig(-1,-1,showBigCards-1); } } LOG("End MTGGuiPlay Render\n"); diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index b02745636..7ab6ac5ed 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -53,7 +53,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card){ card->getManaCost()->doPayExtra(); ManaCost * spellCost = previousManaPool->Diff(player->getManaPool()); delete previousManaPool; - if (card->hasType("land")){ + if (card->hasType("land")){ MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->stack); Spell * spell = NEW Spell(copy); spell->resolve(); @@ -65,9 +65,8 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card){ if (game->targetChooser){ spell = game->mLayers->stackLayer()->addSpell(card,game->targetChooser, spellCost); game->targetChooser = NULL; - }else{ + }else spell = game->mLayers->stackLayer()->addSpell(card,NULL, spellCost); - } MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->stack); spell->source = copy; } @@ -85,10 +84,10 @@ ostream& MTGPutInPlayRule::toString(ostream& out) const return MTGAbility::toString(out) << ")"; } - MTGPutInPlayRule * MTGPutInPlayRule::clone() const{ - MTGPutInPlayRule * a = NEW MTGPutInPlayRule(*this); - a->isClone = 1; - return a; + MTGPutInPlayRule * MTGPutInPlayRule::clone() const{ + MTGPutInPlayRule * a = NEW MTGPutInPlayRule(*this); + a->isClone = 1; + return a; } @@ -132,10 +131,10 @@ ostream& MTGAttackRule::toString(ostream& out) const return MTGAbility::toString(out) << ")"; } - MTGAttackRule * MTGAttackRule::clone() const{ - MTGAttackRule * a = NEW MTGAttackRule(*this); - a->isClone = 1; - return a; + MTGAttackRule * MTGAttackRule::clone() const{ + MTGAttackRule * a = NEW MTGAttackRule(*this); + a->isClone = 1; + return a; } @@ -160,10 +159,10 @@ int MTGBlockRule::reactToClick(MTGCardInstance * card){ currentOpponent = game->currentPlayer->game->inPlay->getNextAttacker(currentOpponent); #if defined (WIN32) || defined (LINUX) char buf[4096]; - sprintf(buf,"Defenser Toggle %s \n" ,card->model->getName()); + sprintf(buf,"Defenser Toggle %s \n", card->model->getName().c_str()); OutputDebugString(buf); #endif - candefend = card->toggleDefenser(currentOpponent); + candefend = card->toggleDefenser(currentOpponent); result = (candefend || currentOpponent == NULL); } return 1; @@ -180,10 +179,10 @@ ostream& MTGBlockRule::toString(ostream& out) const return MTGAbility::toString(out) << ")"; } - MTGBlockRule * MTGBlockRule::clone() const{ - MTGBlockRule * a = NEW MTGBlockRule(*this); - a->isClone = 1; - return a; + MTGBlockRule * MTGBlockRule::clone() const{ + MTGBlockRule * a = NEW MTGBlockRule(*this); + a->isClone = 1; + return a; } // // Attacker chooses blockers order @@ -201,7 +200,7 @@ MTGMomirRule::MTGMomirRule(int _id, MTGAllCards * _collection):MTGAbility(_id, N if (!initialized){ for (size_t i = 0; i < collection->ids.size(); i++){ MTGCard * card = collection->collection[collection->ids[i]]; - if (card->isACreature()){ + if (card->isCreature()){ int convertedCost = card->getManaCost()->getConvertedCost(); if (convertedCost>20) continue; pool[convertedCost].push_back(card->getMTGId()); @@ -239,7 +238,7 @@ int MTGMomirRule::reactToClick(MTGCardInstance * card_to_discard){ int MTGMomirRule::reactToClick(MTGCardInstance * card_to_discard, int cardId){ if (!isReactingToClick(card_to_discard)) return 0; Player * player = game->currentlyActing(); - ManaCost * cost = player->getManaPool(); + ManaCost * cost = player->getManaPool(); player->getManaPool()->pay(cost); MTGCardInstance * card = genCreature(cardId); player->game->putInZone(card_to_discard, player->game->hand, player->game->graveyard); @@ -312,10 +311,10 @@ ostream& MTGMomirRule::toString(ostream& out) const } - MTGMomirRule * MTGMomirRule::clone() const{ - MTGMomirRule * a = NEW MTGMomirRule(*this); - a->isClone = 1; - return a; + MTGMomirRule * MTGMomirRule::clone() const{ + MTGMomirRule * a = NEW MTGMomirRule(*this); + a->isClone = 1; + return a; } //HUDDisplay @@ -329,7 +328,7 @@ void HUDDisplay::Update(float dt){ if (events.size()){ list::iterator it = events.begin(); HUDString * hs = *it; - if (popdelay > 1 && timestamp - hs->timestamp > 2){ + if (popdelay > 1 && timestamp - hs->timestamp > 2){ events.pop_front(); delete hs; if (events.size()) popdelay = 0; @@ -372,7 +371,7 @@ int HUDDisplay::receiveEvent(WEvent * event){ return 0; } void HUDDisplay::Render(){ - if (!GameOptions::GetInstance()->values[OPTIONS_OSD].getIntValue()) return; + if (!options[Options::OSD].number) return; if (!events.size()) return; f->SetColor(ARGB(255,255,255,255)); @@ -398,7 +397,7 @@ HUDDisplay::HUDDisplay(int _id):MTGAbility(_id, NULL){ f = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT); maxWidth = 0; } - + HUDDisplay::~HUDDisplay(){ list::iterator it; for (it = events.begin(); it !=events.end(); ++it){ @@ -408,14 +407,14 @@ HUDDisplay::~HUDDisplay(){ events.clear(); } - HUDDisplay * HUDDisplay::clone() const{ - HUDDisplay * a = NEW HUDDisplay(*this); - a->isClone = 1; - return a; - } - - - /* Persist */ + HUDDisplay * HUDDisplay::clone() const{ + HUDDisplay * a = NEW HUDDisplay(*this); + a->isClone = 1; + return a; + } + + + /* Persist */ MTGPersistRule::MTGPersistRule(int _id):MTGAbility(_id,NULL){}; int MTGPersistRule::receiveEvent(WEvent * event){ @@ -452,8 +451,8 @@ HUDDisplay::~HUDDisplay(){ } int MTGPersistRule::testDestroy(){return 0;} MTGPersistRule * MTGPersistRule::clone() const{ - MTGPersistRule * a = NEW MTGPersistRule(*this); - a->isClone = 1; + MTGPersistRule * a = NEW MTGPersistRule(*this); + a->isClone = 1; return a; } @@ -473,7 +472,7 @@ HUDDisplay::~HUDDisplay(){ int destroy = 0; for ( it=cards.begin() ; it != cards.end(); it++ ){ MTGCardInstance * comparison = (*it).first; - if (comparison!= card && !strcmp(comparison->getName(), card->getName())){ + if (comparison != card && !(comparison->getName().compare(card->getName()))){ comparison->owner->game->putInGraveyard(comparison); destroy = 1; } @@ -493,8 +492,8 @@ HUDDisplay::~HUDDisplay(){ return out << "MTGLegendRule :::"; } MTGLegendRule * MTGLegendRule::clone() const{ - MTGLegendRule * a = NEW MTGLegendRule(*this); - a->isClone = 1; + MTGLegendRule * a = NEW MTGLegendRule(*this); + a->isClone = 1; return a; } @@ -522,7 +521,7 @@ HUDDisplay::~HUDDisplay(){ return MTGAbility::toString(out) << ")"; } MTGLifelinkRule * MTGLifelinkRule::clone() const{ - MTGLifelinkRule * a = NEW MTGLifelinkRule(*this); - a->isClone = 1; + MTGLifelinkRule * a = NEW MTGLifelinkRule(*this); + a->isClone = 1; return a; - } \ No newline at end of file + } diff --git a/projects/mtg/src/OptionItem.cpp b/projects/mtg/src/OptionItem.cpp index 849e77b0e..bd0a85ed6 100644 --- a/projects/mtg/src/OptionItem.cpp +++ b/projects/mtg/src/OptionItem.cpp @@ -9,14 +9,14 @@ OptionItem::OptionItem(string _id, string _displayValue, int _maxValue, int _inc maxValue = _maxValue; increment = _increment; displayValue = _(_displayValue); - value = GameOptions::GetInstance()->values[id].getIntValue(); + value = options[id].number; hasFocus = 0; x = 0; y = 0; } void OptionItem::setData(){ - GameOptions::GetInstance()->values[id] = GameOption(value); + options[id] = GameOption(value); } void OptionItem::Render(){ @@ -60,8 +60,6 @@ bool OptionItem::Leaving(){ } -OptionItem * options[20]; -int nbitems; OptionsList::OptionsList(){ nbitems = 0; current = -1; @@ -100,7 +98,7 @@ void OptionsList::save(){ for (int i = 0; i < nbitems; i++){ options[i]->setData(); } - GameOptions::GetInstance()->save(); + ::options.save(); } void OptionsList::Update(float dt){ diff --git a/projects/mtg/src/PlayGuiObject.cpp b/projects/mtg/src/PlayGuiObject.cpp index 6e488965f..070d07242 100644 --- a/projects/mtg/src/PlayGuiObject.cpp +++ b/projects/mtg/src/PlayGuiObject.cpp @@ -1,15 +1,19 @@ +#include #include "../include/config.h" #include "../include/PlayGuiObject.h" -#include "../include/Player.h" -#include "../include/MTGGameZones.h" -#include "../include/CardDisplay.h" +using namespace std; -PlayGuiObject::PlayGuiObject(int id, float desiredHeight,float _x, float _y, bool hasFocus): JGuiObject(id){ +PlayGuiObject::PlayGuiObject(float desiredHeight, float x, float y, bool hasFocus) : JGuiObject(0), Pos(x, y, 1.0, 0.0, 255) { + defaultHeight = desiredHeight; + mHeight = desiredHeight; + mHasFocus = hasFocus; + type = 0; + wave = 0; +} +PlayGuiObject::PlayGuiObject(float desiredHeight, const Pos& ref, bool hasFocus) : JGuiObject(0), Pos(ref) { defaultHeight = desiredHeight; mHeight = desiredHeight; - x = _x; - y = _y; mHasFocus = hasFocus; type = 0; wave = 0; @@ -32,143 +36,13 @@ void PlayGuiObject::Update(float dt){ mHeight = defaultHeight; } wave = (wave +2) % 255; + for (vector::iterator it = effects.begin(); it != effects.end(); ++it) + (*it)->Update(dt); + Pos::Update(dt); } -GuiAvatar::GuiAvatar(int id, float desiredHeight,float _x, float _y, bool hasFocus, Player * _player): PlayGuiObject(id, desiredHeight, _x, _y, hasFocus){ - player= _player; - avatarRed = 255; - currentLife = player->life; - type = GUI_AVATAR; -} - -void GuiAvatar::Render(){ - GameObserver * game = GameObserver::GetInstance(); - JRenderer * r = JRenderer::GetInstance(); - int life = player->life; - JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT); - mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); - //Avatar - int lifeDiff = life - currentLife; - if (lifeDiff < 0 && currentLife >0 ){ - avatarRed = 192 + (3* 255 * lifeDiff)/ currentLife / 4; - if (avatarRed<0) - avatarRed = 0; - } - currentLife= life; - - JQuad * quad = player->mAvatar; - if(quad){ - quad->SetColor(ARGB(255,255,avatarRed,avatarRed)); - r->RenderQuad(quad,x,y); - if (mHasFocus){ - r->FillRect(x,y,quad->mWidth,quad->mHeight,ARGB(abs(wave-128), 255,255,255)); - } - } - - if (avatarRed < 255){ - avatarRed+=3; - if (avatarRed >255) - avatarRed = 255; - } - if(game->currentPlayer == player){ - r->DrawRect(x-1,y-1 ,37,52,ARGB(255,0,255,0)); - }else if (game->currentActionPlayer == player){ - r->DrawRect(x,y,35,50,ARGB(255,0,0,255)); - } - if(game->isInterrupting == player){ - r->DrawRect(x,y ,35,50,ARGB(255,255,0,0)); - } - - //Life - char buffer[5]; - sprintf(buffer, "%i",life); - mFont->SetColor(ARGB(128,0,0,0)); - mFont->DrawString(buffer, x+3,y+40); - mFont->SetColor(ARGB(255,255,255,255)); - mFont->DrawString(buffer, x+1,y+38); -} - -ostream& GuiAvatar::toString(ostream& out) const +void PlayGuiObject::Render() { - return out << "GuiAvatar ::: avatarRed : " << avatarRed - << " ; currentLife : " << currentLife - << " ; player : " << player; -} - - -void GuiGameZone::toggleDisplay(){ - if (showCards){ - showCards = 0; - }else{ - showCards = 1; - cd->init(zone); - } -} - - -void GuiGameZone::Render(){ - //Texture - JQuad * quad = GameApp::CommonRes->GetQuad("back_thumb"); - float scale = defaultHeight / quad->mHeight; - quad->SetColor(ARGB(255,255,255,255)); - - JRenderer::GetInstance()->RenderQuad(quad,x,y,0.0,scale, scale); - if (mHasFocus){ - JRenderer::GetInstance()->FillRect(x,y,quad->mWidth*scale,quad->mHeight*scale,ARGB(abs(wave-128), 255,255,255)); - } - //Number of cards - JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT); - mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); - char buffer[512]; - sprintf(buffer,"%i", zone->nb_cards); - mFont->SetColor(ARGB(128,0,0,0)); - mFont->DrawString(buffer, x+2, y+2); - mFont->SetColor(ARGB(255,255,255,255)); - mFont->DrawString(buffer, x, y); - - if (showCards) cd->Render(); -} - -void GuiGameZone::ButtonPressed(int controllerId, int controlId){ - GameObserver::GetInstance()->ButtonPressed(GetId(), this); -} - -void GuiGameZone::Update(float dt){ - if (showCards) cd->Update(dt); - PlayGuiObject::Update(dt); -} - -GuiGameZone::GuiGameZone(int id, float desiredHeight,float _x, float _y, bool hasFocus,MTGGameZone * _zone): PlayGuiObject(id, desiredHeight, _x, _y, hasFocus), zone(_zone){ - cd = NEW CardDisplay(id, GameObserver::GetInstance(), _x, _y,this); - showCards = 0; -} - -GuiGameZone::~GuiGameZone(){ - if(cd) delete cd; -} - -ostream& GuiGameZone::toString(ostream& out) const -{ - return out << "GuiGameZone ::: zone : " << zone - << " ; cd : " << cd - << " ; showCards : " << showCards; -} - -GuiGraveyard::GuiGraveyard(int id, float desiredHeight,float _x, float _y, bool hasFocus,Player * player):GuiGameZone(id, desiredHeight, _x, _y, hasFocus,player->game->graveyard){ - type= GUI_GRAVEYARD; -} - -ostream& GuiGraveyard::toString(ostream& out) const -{ - return out << "GuiGraveyard :::"; -} - -GuiLibrary::GuiLibrary(int id, float desiredHeight,float _x, float _y, bool hasFocus,Player * player):GuiGameZone(id, desiredHeight, _x, _y, hasFocus,player->game->library){ - type = GUI_LIBRARY; -} - - -ostream& GuiLibrary::toString(ostream& out) const -{ - return out << "GuiLibrary :::"; + for (vector::iterator it = effects.begin(); it != effects.end(); ++it) + (*it)->Render(); } diff --git a/projects/mtg/src/PlayGuiObjectController.cpp b/projects/mtg/src/PlayGuiObjectController.cpp index 16d36d870..4492dd89b 100644 --- a/projects/mtg/src/PlayGuiObjectController.cpp +++ b/projects/mtg/src/PlayGuiObjectController.cpp @@ -86,6 +86,7 @@ void PlayGuiObjectController::Update(float dt){ bool PlayGuiObjectController::CheckUserInput(u32 key){ + /* if (!mCount) return false; if (game != NULL){ @@ -148,5 +149,6 @@ bool PlayGuiObjectController::CheckUserInput(u32 key){ showBigCards = (showBigCards + 1) % 3; return true; } + */ return false; } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index cb4f71efe..164a24050 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -4,10 +4,10 @@ #include "../include/DeckStats.h" -Player::Player(MTGPlayerCards * _deck, string file, string fileSmall): Damageable(20){ +Player::Player(MTGPlayerCards * deck, string file, string fileSmall) : Damageable(20){ deckFile = file; deckFileSmall = fileSmall; - game = _deck; + game = deck; game->setOwner(this); manaPool = NEW ManaCost(); canPutLandsIntoPlay = 1; @@ -26,7 +26,7 @@ Player::~Player(){ if (mAvatar) delete mAvatar; } -const char * Player::getDisplayName(){ +const string Player::getDisplayName(){ GameObserver * g = GameObserver::GetInstance(); if (this == g->players[0]) return "Player 1"; return "Player 2"; @@ -57,7 +57,7 @@ Player * Player::opponent(){ return NULL; } -HumanPlayer::HumanPlayer(MTGPlayerCards * _deck, char * file, string fileSmall):Player(_deck, file, fileSmall){ +HumanPlayer::HumanPlayer(MTGPlayerCards * deck, string file, string fileSmall) : Player(deck, file, fileSmall) { mAvatarTex = JRenderer::GetInstance()->LoadTexture("player/avatar.jpg", TEX_TYPE_USE_VRAM); if (mAvatarTex) mAvatar = NEW JQuad(mAvatarTex, 0, 0, 35, 50); diff --git a/projects/mtg/src/ReplacementEffects.cpp b/projects/mtg/src/ReplacementEffects.cpp index 513e70464..4c03773e7 100644 --- a/projects/mtg/src/ReplacementEffects.cpp +++ b/projects/mtg/src/ReplacementEffects.cpp @@ -1,76 +1,76 @@ -#include "../include/config.h" -#include "../include/ReplacementEffects.h" -#include "../include/MTGCardInstance.h" -#include "../include/TargetChooser.h" -#include "../include/Damage.h" - - -REDamagePrevention::REDamagePrevention(MTGAbility * _source, TargetChooser *_tcSource, TargetChooser *_tcTarget,int _damage, bool _oneShot):source(_source),tcSource(_tcSource), tcTarget(_tcTarget),damage(_damage), oneShot(_oneShot){ -} - -WEvent * REDamagePrevention::replace (WEvent *event){ - if (!event) return event; - if (!damage) return event; - WEventDamage * e = dynamic_cast(event); - if (!e) return event; - Damage *d = e->damage; - if ((!tcSource || tcSource->canTarget(d->source)) && - (!tcTarget || tcTarget->canTarget(d->target)) - ){ - if (damage == -1){ - d->damage = 0; - delete event; - if (oneShot) damage = 0; - return NULL; - } - if (damage >= d->damage){ - damage-= d->damage; - d->damage = 0; - delete event; - return NULL; - } - d->damage -= damage; - damage = 0; - delete event; - WEventDamage* newEvent = NEW WEventDamage(d); - return newEvent; - } - return event; -} -REDamagePrevention::~REDamagePrevention(){ - SAFE_DELETE(tcSource); - SAFE_DELETE(tcTarget); -} - -ReplacementEffects::ReplacementEffects(){} - -WEvent * ReplacementEffects::replace(WEvent *e){ - list::iterator it; - - for ( it=modifiers.begin() ; it != modifiers.end(); it++ ){ - ReplacementEffect *re = *it; - WEvent * newEvent = re->replace(e); - if (!newEvent) return NULL; - if (newEvent != e) return replace(newEvent); - } - return e; -} - -int ReplacementEffects::add(ReplacementEffect * re){ - modifiers.push_back(re); - return 1; -} - -int ReplacementEffects::remove (ReplacementEffect *re){ - modifiers.remove(re); - return 1; -} - -ReplacementEffects::~ReplacementEffects(){ - list::iterator it; - for ( it=modifiers.begin() ; it != modifiers.end(); it++ ){ - ReplacementEffect *re = *it; - delete(re); - } - modifiers.clear(); -} \ No newline at end of file +#include "../include/config.h" +#include "../include/ReplacementEffects.h" +#include "../include/MTGCardInstance.h" +#include "../include/TargetChooser.h" +#include "../include/Damage.h" + + +REDamagePrevention::REDamagePrevention(MTGAbility * source, TargetChooser *tcSource, TargetChooser *tcTarget, int damage, bool oneShot):source(source), tcSource(tcSource), tcTarget(tcTarget), damage(damage), oneShot(oneShot){ +} + +WEvent * REDamagePrevention::replace (WEvent *event){ + if (!event) return event; + if (!damage) return event; + WEventDamage * e = dynamic_cast(event); + if (!e) return event; + Damage *d = e->damage; + if ((!tcSource || tcSource->canTarget(d->source)) && + (!tcTarget || tcTarget->canTarget(d->target)) + ){ + if (damage == -1){ + d->damage = 0; + delete event; + if (oneShot) damage = 0; + return NULL; + } + if (damage >= d->damage){ + damage-= d->damage; + d->damage = 0; + delete event; + return NULL; + } + d->damage -= damage; + damage = 0; + delete event; + WEventDamage* newEvent = NEW WEventDamage(d); + return newEvent; + } + return event; +} +REDamagePrevention::~REDamagePrevention(){ + SAFE_DELETE(tcSource); + SAFE_DELETE(tcTarget); +} + +ReplacementEffects::ReplacementEffects(){} + +WEvent * ReplacementEffects::replace(WEvent *e){ + list::iterator it; + + for ( it=modifiers.begin() ; it != modifiers.end(); it++ ){ + ReplacementEffect *re = *it; + WEvent * newEvent = re->replace(e); + if (!newEvent) return NULL; + if (newEvent != e) return replace(newEvent); + } + return e; +} + +int ReplacementEffects::add(ReplacementEffect * re){ + modifiers.push_back(re); + return 1; +} + +int ReplacementEffects::remove (ReplacementEffect *re){ + modifiers.remove(re); + return 1; +} + +ReplacementEffects::~ReplacementEffects(){ + list::iterator it; + for ( it=modifiers.begin() ; it != modifiers.end(); it++ ){ + ReplacementEffect *re = *it; + delete(re); + } + modifiers.clear(); +} diff --git a/projects/mtg/src/ShopItem.cpp b/projects/mtg/src/ShopItem.cpp index ba110e91c..071246bca 100644 --- a/projects/mtg/src/ShopItem.cpp +++ b/projects/mtg/src/ShopItem.cpp @@ -2,21 +2,21 @@ #include "../include/ShopItem.h" #include "../include/GameStateShop.h" #include "../include/CardGui.h" +#include "../include/TexturesCache.h" #include "../include/Translate.h" #include + float ShopItems::_x1[] = { 40, 3, 23, 99,142,182, 90,132,177,106,163}; + float ShopItems::_y1[] = {156,174,194,166,166,162,184,185,180,211,208}; - float ShopItems::_x1[] = { 40, 3, 23, 99,142,182, 90,132,177,106,163}; - float ShopItems::_y1[] = {156,174,194,166,166,162,184,185,180,211,208}; - - float ShopItems::_x2[] = { 44, 25, 64,128,171,211,121,165,209,143,200}; - float ShopItems::_y2[] = {147,163,190,166,166,162,184,185,180,211,208}; - - float ShopItems::_x3[] = { 86, 47, 12, 85,133,177, 73,120,170, 88,153}; - float ShopItems::_y3[] = {152,177,216,181,180,176,203,204,198,237,232}; - - float ShopItems::_x4[] = { 86, 66, 58,118,164,207,108,156,205,130,199}; + float ShopItems::_x2[] = { 44, 25, 64,128,171,211,121,165,209,143,200}; + float ShopItems::_y2[] = {147,163,190,166,166,162,184,185,180,211,208}; + + float ShopItems::_x3[] = { 86, 47, 12, 85,133,177, 73,120,170, 88,153}; + float ShopItems::_y3[] = {152,177,216,181,180,176,203,204,198,237,232}; + + float ShopItems::_x4[] = { 86, 66, 58,118,164,207,108,156,205,130,199}; float ShopItems::_y4[] = {145,167,211,181,180,176,203,204,198,237,232}; ShopItem::ShopItem(int id, JLBFont *font, char* text, JQuad * _quad,JQuad * _thumb, float _xy[], bool hasFocus, int _price): JGuiObject(id), mFont(font), mText(text), quad(_quad), thumb(_thumb), price(_price) @@ -31,16 +31,16 @@ ShopItem::ShopItem(int id, JLBFont *font, char* text, JQuad * _quad,JQuad * _thu mScale = 1.0f; mTargetScale = 1.0f; - mesh=NEW hgeDistortionMesh(2,2); - mesh->SetTexture(thumb->mTex); - float x0,y0,w0,h0; - thumb->GetTextureRect(&x0,&y0,&w0,&h0); - mesh->SetTextureRect(x0,y0,w0,h0); - mesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF)); - mesh->SetDisplacement(0, 0, xy[0],xy[1], HGEDISP_NODE); - mesh->SetDisplacement(1, 0, xy[2] - w0,xy[3], HGEDISP_NODE); - mesh->SetDisplacement(0, 1,xy[4],xy[5]-h0, HGEDISP_NODE); - mesh->SetDisplacement(1, 1, xy[6]-w0,xy[7]-h0, HGEDISP_NODE); + mesh=NEW hgeDistortionMesh(2,2); + mesh->SetTexture(thumb->mTex); + float x0,y0,w0,h0; + thumb->GetTextureRect(&x0,&y0,&w0,&h0); + mesh->SetTextureRect(x0,y0,w0,h0); + mesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF)); + mesh->SetDisplacement(0, 0, xy[0],xy[1], HGEDISP_NODE); + mesh->SetDisplacement(1, 0, xy[2] - w0,xy[3], HGEDISP_NODE); + mesh->SetDisplacement(0, 1,xy[4],xy[5]-h0, HGEDISP_NODE); + mesh->SetDisplacement(1, 1, xy[6]-w0,xy[7]-h0, HGEDISP_NODE); mesh->SetColor(1,1,ARGB(255,100,100,100)); mesh->SetColor(0,1,ARGB(255,100,100,100)); mesh->SetColor(1,0,ARGB(255,100,100,100)); @@ -66,19 +66,20 @@ ShopItem::ShopItem(int id, JLBFont *font, int _cardid, float _xy[], bool hasFocu quantity = 1 + (rand() % 4); if (card->getRarity() == Constants::RARITY_L) quantity = 50; quad = NULL; - thumb = card->getThumb(); - if (!thumb) thumb = GameApp::CommonRes->GetQuad("back_thumb"); + // thumb = card->getThumb(); + // if (!thumb) + thumb = GameApp::CommonRes->GetQuad("back_thumb"); if (thumb){ - mesh=NEW hgeDistortionMesh(2,2); - mesh->SetTexture(thumb->mTex); - float x0,y0,w0,h0; - thumb->GetTextureRect(&x0,&y0,&w0,&h0); - mesh->SetTextureRect(x0,y0,w0,h0); - mesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF)); - mesh->SetDisplacement(0, 0, xy[0],xy[1], HGEDISP_NODE); - mesh->SetDisplacement(1, 0, xy[2] - w0,xy[3], HGEDISP_NODE); - mesh->SetDisplacement(0, 1,xy[4],xy[5]-h0, HGEDISP_NODE); - mesh->SetDisplacement(1, 1, xy[6]-w0,xy[7]-h0, HGEDISP_NODE); + mesh=NEW hgeDistortionMesh(2,2); + mesh->SetTexture(thumb->mTex); + float x0,y0,w0,h0; + thumb->GetTextureRect(&x0,&y0,&w0,&h0); + mesh->SetTextureRect(x0,y0,w0,h0); + mesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF)); + mesh->SetDisplacement(0, 0, xy[0],xy[1], HGEDISP_NODE); + mesh->SetDisplacement(1, 0, xy[2] - w0,xy[3], HGEDISP_NODE); + mesh->SetDisplacement(0, 1,xy[4],xy[5]-h0, HGEDISP_NODE); + mesh->SetDisplacement(1, 1, xy[6]-w0,xy[7]-h0, HGEDISP_NODE); mesh->SetColor(1,1,ARGB(255,100,100,100)); mesh->SetColor(0,1,ARGB(255,100,100,100)); mesh->SetColor(1,0,ARGB(255,100,100,100)); @@ -114,9 +115,8 @@ void ShopItem::Render(){ if (!quantity){ mFont->SetColor(ARGB(255,128,128,128)); } - - - if (card){ + + if (card){ if (nameCount){ char buffer[512]; sprintf(buffer, "%s (%i)", _(card->name).c_str(), nameCount ); @@ -136,7 +136,7 @@ void ShopItem::Render(){ renderer->FillPolygon(xs,ys,4,ARGB(200,0,0,0)); x0 = mX + 230 -30; mFont->DrawString(mText.c_str(), x0, mY + 8,JGETEXT_RIGHT); - + }else{ float xs[] = {mX-5, mX-5, mX-5+230,mX-5+230,}; float ys[] = {mY-5,mY-5+35,mY-5+17,mY-5+19} ; @@ -153,14 +153,12 @@ void ShopItem::Render(){ //NOTHING } if (mHasFocus){ - if (card){ - quad = card->getQuad(); - } + if (card) quad = cache.getQuad(card); if (quad){ quad->SetColor(ARGB(255,255,255,255)); renderer->RenderQuad(quad,SCREEN_WIDTH/2 + 50,5,0, 0.9f,0.9f); }else{ - if (card) CardGui::alternateRender(card,NULL,SCREEN_WIDTH/2 + 100 + 20,133,0, 0.9f); + // if (card) CardGui::alternateRender(card,NULL,SCREEN_WIDTH/2 + 100 + 20,133,0, 0.9f); } mFont->DrawString(mText.c_str(), 100, SCREEN_HEIGHT - 30); } @@ -336,7 +334,7 @@ void ShopItems::ButtonPressed(int controllerId, int controlId){ tempDeck->addRandomCards(1, sets,1,rare_or_mythic); tempDeck->addRandomCards(3, sets,1,Constants::RARITY_U); tempDeck->addRandomCards(11, sets,1,Constants::RARITY_C); - + playerdata->collection->add(tempDeck); myCollection->Add(tempDeck); @@ -344,7 +342,7 @@ void ShopItems::ButtonPressed(int controllerId, int controlId){ ShopItem * si = ((ShopItem *)mObjects[j]); si->updateCount(myCollection); } - + int i = 0; for (map::iterator it = tempDeck->cards.begin(); it!=tempDeck->cards.end(); it++){ MTGCard * c = tempDeck->getCardById(it->first); diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 87f970396..4a3711b5b 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -41,7 +41,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta s2 = ""; } zones[nbzones] = MTGGameZone::MY_BATTLEFIELD; - + //Graveyards if(zoneName.compare("graveyard") == 0){ zones[nbzones] = MTGGameZone::MY_GRAVEYARD; @@ -274,16 +274,16 @@ TargetChooser::TargetChooser(MTGCardInstance * card, int _maxtargets): TargetsLi //Default targetter : every card can be targetted, unless it is protected from the targetter card // For spells that do not "target" a specific card, set targetter to NULL -int TargetChooser::canTarget(Targetable * target){ +bool TargetChooser::canTarget(Targetable * target){ if (target->typeAsTarget() == TARGET_CARD){ MTGCardInstance * card = (MTGCardInstance *) target; - if (targetter && card->isInPlay() && (card->has(Constants::SHROUD)|| card->protectedAgainst(targetter) )) return 0; - if (source && targetter && card->isInPlay() && (source->controller() != card->controller()) && (card->has(Constants::OPPONENTSHROUD)|| card->protectedAgainst(targetter) )) return 0; - return 1; - }else if (target->typeAsTarget() == TARGET_STACKACTION){ - return 1; + if (source && card->isInPlay() && (card->has(Constants::SHROUD)|| card->protectedAgainst(source) )) return false; + if (source && targetter && card->isInPlay() && (source->controller() != card->controller()) && (card->has(Constants::OPPONENTSHROUD) || card->protectedAgainst(targetter))) return false; + return true; } - return 0; + else if (target->typeAsTarget() == TARGET_STACKACTION) + return true; + return false; } @@ -340,17 +340,17 @@ CardTargetChooser::CardTargetChooser(MTGCardInstance * _card, MTGCardInstance * validTarget = _card; } -int CardTargetChooser::canTarget(Targetable * target ){ - if (!target) return 0; - if (target->typeAsTarget() != TARGET_CARD) return 0; - if (!nbzones && !TargetChooser::canTarget(target)) return 0; - if (nbzones && !TargetZoneChooser::canTarget(target)) return 0; +bool CardTargetChooser::canTarget(Targetable * target ){ + if (!target) return false; + if (target->typeAsTarget() != TARGET_CARD) return false; + if (!nbzones && !TargetChooser::canTarget(target)) return false; + if (nbzones && !TargetZoneChooser::canTarget(target)) return false; MTGCardInstance * card = (MTGCardInstance *) target; - while(card){ - if(card == validTarget) return 1; + while (card) { + if (card == validTarget) return true; card = card->previous; } - return 0; + return false; } /** @@ -386,28 +386,28 @@ void TypeTargetChooser::addType(int type){ nbtypes++; } -int TypeTargetChooser::canTarget(Targetable * target ){ - if (!TargetZoneChooser::canTarget(target)) return 0; +bool TypeTargetChooser::canTarget(Targetable * target){ + if (!TargetZoneChooser::canTarget(target)) return false; if (target->typeAsTarget() == TARGET_CARD){ MTGCardInstance * card = (MTGCardInstance *) target; for (int i= 0; i < nbtypes; i++){ - if (card->hasSubtype(types[i])) return 1; - if (Subtypes::subtypesList->find(card->name) == types[i]) return 1; + if (card->hasSubtype(types[i])) return true; + if (Subtypes::subtypesList->find(card->name) == types[i]) return true; } - return 0; + return false; }else if (target->typeAsTarget() == TARGET_STACKACTION){ Interruptible * action = (Interruptible *) target; if (action->type == ACTION_SPELL && action->state==NOT_RESOLVED){ Spell * spell = (Spell *) action; MTGCardInstance * card = spell->source; for (int i= 0; i < nbtypes; i++){ - if (card->hasSubtype(types[i])) return 1; - if (Subtypes::subtypesList->find(card->name) == types[i]) return 1; + if (card->hasSubtype(types[i])) return true; + if (Subtypes::subtypesList->find(card->name) == types[i]) return true; } - return 0; + return false; } } - return 0; + return false; } @@ -430,20 +430,20 @@ DescriptorTargetChooser::DescriptorTargetChooser(CardDescriptor * _cd, int * _zo cd = _cd; } -int DescriptorTargetChooser::canTarget(Targetable * target){ - if (!TargetZoneChooser::canTarget(target)) return 0; +bool DescriptorTargetChooser::canTarget(Targetable * target){ + if (!TargetZoneChooser::canTarget(target)) return false; if (target->typeAsTarget() == TARGET_CARD){ MTGCardInstance * _target = (MTGCardInstance *) target; - if (cd->match(_target)) return 1; + if (cd->match(_target)) return true; }else if (target->typeAsTarget() == TARGET_STACKACTION){ Interruptible * action = (Interruptible *) target; if (action->type == ACTION_SPELL && action->state==NOT_RESOLVED){ Spell * spell = (Spell *) action; MTGCardInstance * card = spell->source; - if (cd->match(card)) return 1; + if (cd->match(card)) return true; } } - return 0; + return false; } DescriptorTargetChooser::~DescriptorTargetChooser(){ @@ -473,15 +473,15 @@ CreatureTargetChooser::CreatureTargetChooser(int * _zones, int nbzones, MTGCardI } -int CreatureTargetChooser::canTarget(Targetable * target){ - if (!TargetZoneChooser::canTarget(target)) return 0; +bool CreatureTargetChooser::canTarget(Targetable * target){ + if (!TargetZoneChooser::canTarget(target)) return false; if (target->typeAsTarget() == TARGET_CARD){ MTGCardInstance * card = (MTGCardInstance *) target; - if (maxpower != -1 && card->power > maxpower) return 0; - if (maxtoughness != -1 && card->toughness > maxtoughness) return 0; - return card->isACreature(); + if (maxpower != -1 && card->power > maxpower) return false; + if (maxtoughness != -1 && card->toughness > maxtoughness) return false; + return card->isCreature(); } - return 0; + return false; } @@ -502,57 +502,47 @@ int TargetZoneChooser::init(int * _zones, int _nbzones){ return nbzones; } -int TargetZoneChooser::canTarget(Targetable * target){ - if (!TargetChooser::canTarget(target)) return 0; +bool TargetZoneChooser::canTarget(Targetable * target){ + if (!TargetChooser::canTarget(target)) return false; if (target->typeAsTarget() == TARGET_CARD){ MTGCardInstance * card = (MTGCardInstance *) target; - for (int i = 0; ihasCard(card)) return 1; - } + for (int i = 0; ihasCard(card)) return true; }else if (target->typeAsTarget() == TARGET_STACKACTION){ OutputDebugString ("CHECKING INTERRUPTIBLE\n"); Interruptible * action = (Interruptible *) target; if (action->type == ACTION_SPELL && action->state==NOT_RESOLVED){ Spell * spell = (Spell *) action; MTGCardInstance * card = spell->source; - for (int i = 0; ihasCard(card)) return 1; - } + for (int i = 0; ihasCard(card)) return true; } } - return 0; + return false; } int TargetZoneChooser::targetsZone(MTGGameZone * z){ - for (int i = 0; i < nbzones; i++){ + for (int i = 0; i < nbzones; i++) if (MTGGameZone::intToZone(zones[i],source) == z) return 1; - - } return 0; } /* Player Target */ - -PlayerTargetChooser::PlayerTargetChooser(MTGCardInstance * card, int _maxtargets, Player *_p):TargetChooser(card, _maxtargets){ - p = _p; +PlayerTargetChooser::PlayerTargetChooser(MTGCardInstance * card, int _maxtargets, Player *p):TargetChooser(card, _maxtargets), p(p){ } -int PlayerTargetChooser::canTarget(Targetable * target){ - if (target->typeAsTarget() == TARGET_PLAYER){ - Player * _target = (Player *) target; - if (!p || p == _target) return 1; - } - return 0; +bool PlayerTargetChooser::canTarget(Targetable * target){ + return (target->typeAsTarget() == TARGET_PLAYER) && (!p || p == (Player*)target); } /*Damageable Target */ -int DamageableTargetChooser::canTarget(Targetable * target){ +bool DamageableTargetChooser::canTarget(Targetable * target){ if (target->typeAsTarget() == TARGET_PLAYER){ #if defined (WIN32) || defined (LINUX) OutputDebugString("Targetting Player !!!\n"); #endif - return 1; + return true; } return CreatureTargetChooser::canTarget(target); } @@ -566,19 +556,18 @@ SpellTargetChooser::SpellTargetChooser(MTGCardInstance * card,int _color, int _m color = _color; } -int SpellTargetChooser::canTarget(Targetable * target){ +bool SpellTargetChooser::canTarget(Targetable * target){ MTGCardInstance * card = NULL; if (target->typeAsTarget() == TARGET_STACKACTION){ Interruptible * action = (Interruptible *) target; if (action->type == ACTION_SPELL && action->state==NOT_RESOLVED){ Spell * spell = (Spell *) action; card = spell->source; - if (card && (color == -1 || card->hasColor(color))) return 1; + if (card && (color == -1 || card->hasColor(color))) return true; } } - return 0; - + return false; } @@ -589,7 +578,7 @@ SpellOrPermanentTargetChooser::SpellOrPermanentTargetChooser(MTGCardInstance * c color = _color; } -int SpellOrPermanentTargetChooser::canTarget(Targetable * target){ +bool SpellOrPermanentTargetChooser::canTarget(Targetable * target){ MTGCardInstance * card = NULL; if (target->typeAsTarget() == TARGET_CARD){ card = (MTGCardInstance *) target; @@ -599,12 +588,10 @@ int SpellOrPermanentTargetChooser::canTarget(Targetable * target){ if (action->type == ACTION_SPELL && action->state==NOT_RESOLVED){ Spell * spell = (Spell *) action; card = spell->source; - if (card && (color == -1 || card->hasColor(color))) return 1; + if (card && (color == -1 || card->hasColor(color))) return true; } } - - return 0; - + return false; } @@ -615,19 +602,17 @@ DamageTargetChooser::DamageTargetChooser(MTGCardInstance * card,int _color, int state = _state; } -int DamageTargetChooser::canTarget(Targetable * target){ +bool DamageTargetChooser::canTarget(Targetable * target){ MTGCardInstance * card = NULL; if (target->typeAsTarget() == TARGET_STACKACTION){ Interruptible * action = (Interruptible *) target; if (action->type == ACTION_DAMAGE && (action->state == state || state == -1)){ Damage * damage = (Damage *) action; card = damage->source; - if (card && (color == -1 || card->hasColor(color))) return 1; + if (card && (color == -1 || card->hasColor(color))) return true; } } - - return 0; - + return false; } @@ -638,7 +623,7 @@ DamageOrPermanentTargetChooser::DamageOrPermanentTargetChooser(MTGCardInstance * color = _color; } -int DamageOrPermanentTargetChooser::canTarget(Targetable * target){ +bool DamageOrPermanentTargetChooser::canTarget(Targetable * target){ MTGCardInstance * card = NULL; if (target->typeAsTarget() == TARGET_CARD){ card = (MTGCardInstance *) target; @@ -648,10 +633,8 @@ int DamageOrPermanentTargetChooser::canTarget(Targetable * target){ if (action->type == ACTION_DAMAGE){ Damage * damage = (Damage *) action; card = damage->source; - if (card && (color == -1 || card->hasColor(color))) return 1; + if (card && (color == -1 || card->hasColor(color))) return true; } } - - return 0; - + return false; } diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index a97437064..c8c0ed808 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -64,7 +64,7 @@ int TestSuiteAI::Act(float dt){ string action = suite->getNextAction(); g->mLayers->stackLayer()->Dump(); - DamageResolverLayer * drl = g->mLayers->combatLayer(); + // DamageResolverLayer * drl = g->mLayers->combatLayer(); OutputDebugString(action.c_str()); OutputDebugString("\n"); @@ -90,6 +90,7 @@ int TestSuiteAI::Act(float dt){ g->userRequestNextGamePhase(); } else if (action.compare("next")==0){ + /* if (drl->orderingIsNeeded){ drl->blockersOrderingDone(); g->userRequestNextGamePhase(); @@ -100,6 +101,7 @@ int TestSuiteAI::Act(float dt){ }else{ g->userRequestNextGamePhase(); } + */ }else if (action.compare("yes")==0){ g->mLayers->stackLayer()->setIsInterrupting(this); }else if (action.compare("endinterruption")==0){ @@ -121,7 +123,7 @@ int TestSuiteAI::Act(float dt){ g->mLayers->actionLayer()->stuffHappened = 1; }else if(action.find("p1")!=string::npos || action.find("p2")!=string::npos){ Player * p = g->players[1]; - int start = action.find("p1"); + unsigned int start = action.find("p1"); if (start != string::npos) p = g->players[0]; g->cardClick(NULL, p); }else{ @@ -138,6 +140,7 @@ int TestSuiteAI::Act(float dt){ if (card) { OutputDebugString("Clicking ON: "); OutputDebugString(card->name.c_str()); + /* if (drl->mCount){ if (drl->orderingIsNeeded){ OutputDebugString(" Ordering Card\n"); @@ -149,6 +152,7 @@ int TestSuiteAI::Act(float dt){ }else{ g->cardClick(card,card); } + */ } } }else{ @@ -281,12 +285,12 @@ void TestSuite::initGame(){ for (int k = 0; k < initState.playerData[i].zones[j].nbitems; k++){ MTGCardInstance * card = getCardByMTGId(initState.playerData[i].zones[j].cards[k]); char buf[4096]; - sprintf(buf, "QUAD : %p\n", card->getQuad()); + sprintf(buf, "QUAD : %p\n", cache.getQuad(card)); OutputDebugString(buf); 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(copy); spell->resolve(); if (!summoningSickness && p->game->inPlay->nb_cards>k) p->game->inPlay->cards[k]->summoningSickness = 0; delete spell; @@ -418,7 +422,7 @@ int TestSuite::loadNext(){ if (currentfile >= nbfiles) return 0; currentfile++; if (!load(files[currentfile-1].c_str())) return loadNext(); - + //load(files[currentfile].c_str()); //currentfile++; return currentfile; @@ -482,7 +486,7 @@ int TestSuite::load(const char * _filename){ int state = -1; - std::cout << std::endl << std::endl << "!!!" << file << std::endl << std::endl; + // std::cout << std::endl << std::endl << "!!!" << file << std::endl << std::endl; if(file){ cleanup(); while(std::getline(file,s)){ diff --git a/projects/mtg/src/TexturesCache.cpp b/projects/mtg/src/TexturesCache.cpp index f93435ec7..6a7d336f2 100644 --- a/projects/mtg/src/TexturesCache.cpp +++ b/projects/mtg/src/TexturesCache.cpp @@ -3,16 +3,15 @@ #include "../include/GameOptions.h" #include +TexturesCache cache; + TexturesCache::TexturesCache(){ nb_textures = 0; totalsize = 0; delete_previous = 0; lastTime = 0; - for (int i=0; ivalues[OPTIONS_CACHESIZE].getIntValue() * 100000; - if (!maxSize) maxSize = CACHE_SIZE_PIXELS; #ifdef WIN32 char buf [4096]; sprintf(buf, " Init TextureCache : %p\n", this); @@ -65,6 +64,8 @@ void TexturesCache::removeQuad(int id){ } int TexturesCache::cleanup(){ + int maxSize = options[Options::CACHESIZE].number * 100000; + if (!maxSize) maxSize = CACHE_SIZE_PIXELS; while (nb_textures >= MAX_CACHE_OBJECTS - 1 || totalsize > maxSize){ int i = getOldestQuad(); if (i == -1) return 0; @@ -76,7 +77,7 @@ int TexturesCache::cleanup(){ JQuad * TexturesCache::getQuad(MTGCard * card, int type){ int cache_id = getCacheById(card->getId(), type); if (cache_id == -1){ - + //Not found in the cache, we have to load the file and put it in the cache if (cleanup()){ cache_id = nb_textures; @@ -126,6 +127,7 @@ CardTexture::CardTexture(MTGCard * card, int _type): type(_type){ } if (tex){ quad = NEW JQuad(tex, 0.0f, 0.0f, tex->mWidth, tex->mHeight); + quad->SetHotSpot(tex->mWidth / 2, tex->mHeight / 2); nbpixels = tex->mTexHeight * tex->mTexWidth; } mtgid = card->getId(); @@ -200,4 +202,4 @@ SampleCache::~SampleCache(){ void SampleCache::DestroyInstance(){ SAFE_DELETE(mInstance); -} \ No newline at end of file +} diff --git a/projects/mtg/src/Token.cpp b/projects/mtg/src/Token.cpp index 0e83caf72..a32f33368 100644 --- a/projects/mtg/src/Token.cpp +++ b/projects/mtg/src/Token.cpp @@ -1,21 +1,19 @@ -#include "../include/Token.h" - -Token::Token(string _name, MTGCardInstance * source, int _power, int _toughness):MTGCardInstance(){ - isToken = true; - tokenSource = source; - power = _power; - toughness = _toughness; - life=toughness; - lifeOrig = life; - name = _name; - setMTGId(- source->getMTGId()); - setId = source->setId; +#include "../include/Token.h" + +Token::Token(string _name, MTGCardInstance * source, int _power, int _toughness):MTGCardInstance(){ + isToken = true; + tokenSource = source; + power = _power; + toughness = _toughness; + life=toughness; + lifeOrig = life; + name = _name; + setMTGId(- source->getMTGId()); + setId = source->setId; model = this; owner = source->owner; belongs_to=source->controller()->game; attacker = 0; defenser = NULL; banding = NULL; - mCache = source->mCache; - -} \ No newline at end of file +} diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index 341f1320f..27844179e 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -1,37 +1,26 @@ -#include "../include/WEvent.h" -#include "../include/MTGCardInstance.h" -#include "../include/MTGGameZones.h" -#include "../include/Damage.h" -#include "../include/PhaseRing.h" - - -WEvent::WEvent(int _type){ - type=_type; -} - -WEventZoneChange::WEventZoneChange(MTGCardInstance * _card, MTGGameZone * _from, MTGGameZone *_to):WEvent(CHANGE_ZONE){ - card = _card; - from = _from; - to = _to; -} - -WEventDamage::WEventDamage(Damage *_damage):WEvent(DAMAGE){ - damage = _damage; -} - -WEventPhaseChange::WEventPhaseChange(Phase * _from, Phase * _to):WEvent(CHANGE_PHASE){ - from = _from; - to = _to; -} - -WEventCardTap::WEventCardTap(MTGCardInstance * card, bool before, bool after) - :WEventCardUpdate(card), before(before), after(after){} - -WEventCreatureAttacker::WEventCreatureAttacker(MTGCardInstance * card,Targetable * before, Targetable * after) - :WEventCardUpdate(card), before(before), after(after){} - -WEventCreatureBlocker::WEventCreatureBlocker(MTGCardInstance * card,MTGCardInstance * from,MTGCardInstance * to) - :WEventCardUpdate(card), before(before), after(after){} - -WEventCreatureBlockerRank::WEventCreatureBlockerRank(MTGCardInstance * card,MTGCardInstance * exchangeWith, MTGCardInstance * attacker) - :WEventCardUpdate(card), exchangeWith(exchangeWith), attacker(attacker){} \ No newline at end of file +#include "../include/WEvent.h" +#include "../include/MTGCardInstance.h" +#include "../include/MTGGameZones.h" +#include "../include/Damage.h" +#include "../include/PhaseRing.h" + +WEvent::WEvent(int type) : type(type){} + +WEventZoneChange::WEventZoneChange(MTGCardInstance * card, MTGGameZone * from, MTGGameZone *to) : WEvent(CHANGE_ZONE), card(card), from(from), to(to){} + +WEventDamage::WEventDamage(Damage *damage) : WEvent(DAMAGE), damage(damage){} + +WEventCardUpdate::WEventCardUpdate(MTGCardInstance * card) : WEvent(), card(card) {}; + +WEventPhaseChange::WEventPhaseChange(Phase * from, Phase * to) : WEvent(CHANGE_PHASE), from(from), to(to){} + +WEventCardTap::WEventCardTap(MTGCardInstance * card, bool before, bool after) : WEventCardUpdate(card), before(before), after(after){} + +WEventCreatureAttacker::WEventCreatureAttacker(MTGCardInstance * card, Targetable * before, Targetable * after) : WEventCardUpdate(card), before(before), after(after){} + +WEventCreatureBlocker::WEventCreatureBlocker(MTGCardInstance * card, MTGCardInstance * from,MTGCardInstance * to) : WEventCardUpdate(card), before(before), after(after){} + +WEventCreatureBlockerRank::WEventCreatureBlockerRank(MTGCardInstance * card, MTGCardInstance * exchangeWith, MTGCardInstance * attacker) : WEventCardUpdate(card), exchangeWith(exchangeWith), attacker(attacker){} + +WEventEngageMana::WEventEngageMana(int color, MTGCardInstance* card) : WEvent(), color(color), card(card) {} +WEventConsumeMana::WEventConsumeMana(int color) : WEvent(), color(color) {}