diff --git a/projects/mtg/include/ActionStack.h b/projects/mtg/include/ActionStack.h index 51010c208..725d72637 100644 --- a/projects/mtg/include/ActionStack.h +++ b/projects/mtg/include/ActionStack.h @@ -53,6 +53,7 @@ class Interruptible: public PlayGuiObject, public Targetable{ 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";}; #if defined (WIN32) || defined (LINUX) virtual void Dump(); #endif @@ -76,6 +77,7 @@ class Spell: public Interruptible, public TargetsList { ~Spell(); int resolve(); void Render(); + const char *getDisplayName(); virtual ostream& toString(ostream& out) const; }; @@ -122,6 +124,14 @@ class ActionStack :public GuiLayer{ void unpackDamageStack(DamageStack * ds); void repackDamageStacks(); public: + + enum{ + NOT_DECIDED = 0, + INTERRUPT = -1, + DONT_INTERRUPT = 1, + DONT_INTERRUPT_ALL = 2, + }; + int setIsInterrupting(Player * player); int count( int type = 0 , int state = 0 , int display = -1); Interruptible * getPrevious(Interruptible * next, int type = 0, int state = 0 , int display = -1); diff --git a/projects/mtg/include/GameOptions.h b/projects/mtg/include/GameOptions.h index 27b02f7ad..df309bc2b 100644 --- a/projects/mtg/include/GameOptions.h +++ b/projects/mtg/include/GameOptions.h @@ -13,6 +13,8 @@ using std::string; #define OPTIONS_DIFFICULTY "difficulty" #define OPTIONS_CACHESIZE "cacheSize" #define OPTIONS_PLASMAEFFECT "plasmaEffect" +#define OPTIONS_INTERRUPTMYSPELLS "interruptMySpells" +#define OPTIONS_INTERRUPTMYABILITIES "interruptMyAbilities" // WALDORF - added #define OPTIONS_INTERRUPT_SECONDS "interruptSeconds" diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 0cccdb161..50b2653f9 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -56,6 +56,7 @@ class MTGCardInstance: public MTGCard, public Damageable { Player * owner; Counters * counters; int typeAsTarget(){return TARGET_CARD;} + const char * getDisplayName(); MTGCardInstance * target; void addType(int type); diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index d6aa99f6a..006e5815d 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -180,4 +180,33 @@ class MTGLifelinkRule:public MTGAbility{ }; +/* HUD Display */ + +class HUDString { +public: + string value; + int timestamp; + int quantity; + HUDString(string s, int ts):value(s),timestamp(ts){quantity = 1;}; +}; + +class HUDDisplay:public MTGAbility{ +private: + list events; + float timestamp; + float popdelay; + JLBFont * f; + float maxWidth; + int addEvent(string s); +public: + int testDestroy(); + int receiveEvent(WEvent * event); + void Update(float dt); + void Render(); + HUDDisplay(int _id); + ~HUDDisplay(); +}; + + + #endif diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index f40700298..c40abbab6 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -17,6 +17,7 @@ class Player: public Damageable{ public: virtual void End(); int typeAsTarget(){return TARGET_PLAYER;} + const char * getDisplayName(); virtual int displayStack(){return 1;} JTexture * mAvatarTex; JQuad * mAvatar; diff --git a/projects/mtg/include/Targetable.h b/projects/mtg/include/Targetable.h index 1a2581f7a..f55446793 100644 --- a/projects/mtg/include/Targetable.h +++ b/projects/mtg/include/Targetable.h @@ -8,6 +8,7 @@ class Targetable{ public: virtual int typeAsTarget() = 0; + virtual const char * getDisplayName() =0; }; #endif diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index a44d1768b..7db08fff7 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -42,6 +42,11 @@ int ActionLayer::unstoppableRenderInProgress(){ bool ActionLayer::CheckUserInput(u32 key){ + GameObserver * g = GameObserver::GetInstance(); + if (g->waitForExtraPayment && key == PSP_CTRL_CROSS){ + game->waitForExtraPayment = NULL; + return 1; + } if (menuObject){ return false; } diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index d09400328..58ee65e7a 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -92,6 +92,10 @@ Spell::Spell(int id, MTGCardInstance * _source, Targetable * _targets[], int nb_ } +const char * Spell::getDisplayName(){ + return source->getName(); +} + Spell::~Spell(){ SAFE_DELETE(cost); } @@ -265,8 +269,13 @@ int ActionStack::addPutInGraveyard(MTGCardInstance * card){ int ActionStack::addAbility(MTGAbility * ability){ StackAbility * stackAbility = NEW StackAbility(mCount,ability); - addAction(stackAbility); - return 1; + 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; + } + return result; } int ActionStack::addDraw(Player * player, int nb_cards){ @@ -318,7 +327,13 @@ int ActionStack::addSpell(MTGCardInstance * _source, Targetable * _targets[], in OutputDebugString(buf); #endif Spell * spell = NEW Spell(mCount,_source,_targets,_nbtargets, mana); - return addAction(spell); + int result = addAction(spell); + if (!game->players[0]->isAI() && + _source->controller()==game->players[0] && + GameOptions::GetInstance()->values[OPTIONS_INTERRUPTMYSPELLS].getIntValue() == 0){ + interruptDecision[0] = DONT_INTERRUPT; + } + return result; } diff --git a/projects/mtg/src/DuelLayers.cpp b/projects/mtg/src/DuelLayers.cpp index 96bfc17b2..8f5dbba14 100644 --- a/projects/mtg/src/DuelLayers.cpp +++ b/projects/mtg/src/DuelLayers.cpp @@ -25,6 +25,8 @@ void DuelLayers::init(){ actionLayer->Add(NEW MTGLegendRule(-1)); actionLayer->Add(NEW MTGPersistRule(-1)); actionLayer->Add(NEW MTGLifelinkRule(-1)); + //Other display elements + actionLayer->Add(NEW HUDDisplay(-1)); //2 Hand Layer MTGGuiHand * mGuiHand = NEW MTGGuiHand(3, GameObserver::GetInstance()); diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index 215a44702..da879b9ed 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -27,6 +27,8 @@ void GameStateOptions::Start() 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")); // 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()) { diff --git a/projects/mtg/src/GuiLayers.cpp b/projects/mtg/src/GuiLayers.cpp index 36e71c4b5..1cd338c80 100644 --- a/projects/mtg/src/GuiLayers.cpp +++ b/projects/mtg/src/GuiLayers.cpp @@ -145,11 +145,6 @@ void GuiLayers::Update(float dt, Player * currentPlayer){ int isAI = currentPlayer->isAI(); u32 key; while ((key = JGE::GetInstance()->ReadButton())){ - GameObserver * game = GameObserver::GetInstance(); - if (game->waitForExtraPayment && key == PSP_CTRL_CROSS){ - game->waitForExtraPayment = NULL; - continue; - } for (int i=0; i::iterator it = events.begin(); + HUDString * hs = *it; + if (popdelay > 1 && timestamp - hs->timestamp > 2){ + events.pop_front(); + delete hs; + if (events.size()) popdelay = 0; + } + }else{ + maxWidth = 0; + } +} + +int HUDDisplay::addEvent(string s){ + events.push_back(NEW HUDString(s, timestamp)); + float width = f->GetStringWidth(s.c_str()); + if (width > maxWidth) maxWidth = width; + return 1; +} + +int HUDDisplay::receiveEvent(WEvent * event){ + + WEventZoneChange * ezc = dynamic_cast(event); + if (ezc) { + int ok = 0; + for (int i = 0; i < 2 ; i++){ + Player * p = game->players[i]; + if (ezc->from == p->game->graveyard || ezc->to == p->game->graveyard ) ok = 1; + } + if (!ok) return 0; + char buffer[512]; + sprintf(buffer,"%s goes to graveyard", ezc->card->getName()); + string s = buffer; + return addEvent(s); + } + + WEventDamage * ed = dynamic_cast(event); + if (ed) { + char buffer[512]; + sprintf(buffer, "%s: %i -> %s", ed->damage->source->getName(), ed->damage->damage, ed->damage->target->getDisplayName()); + string s = buffer; + return addEvent(s); + } + + return 0; +} +void HUDDisplay::Render(){ + if (!events.size()) return; + + f->SetColor(ARGB(255,255,255,255)); + + list::reverse_iterator it; + + float x0 = SCREEN_WIDTH-10-maxWidth-10; + float y0 = 20; + float size = events.size() * 16; + JRenderer * r = JRenderer::GetInstance(); + r->FillRoundRect(x0,y0,maxWidth + 10,size,5,ARGB(50,0,0,0)); + + int i = 0; + for (it = events.rbegin(); it !=events.rend(); ++it){ + HUDString * hs = *it; + f->DrawString(hs->value.c_str(),x0 + 5, y0 + 16 * i); + i++; + } +} +HUDDisplay::HUDDisplay(int _id):MTGAbility(_id, NULL){ + timestamp = 0; + popdelay = 2; + f = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT); + maxWidth = 0; +} + +HUDDisplay::~HUDDisplay(){ + list::iterator it; + for (it = events.begin(); it !=events.end(); ++it){ + HUDString * hs = *it; + delete hs; + } + events.clear(); +} \ No newline at end of file diff --git a/projects/mtg/src/OptionItem.cpp b/projects/mtg/src/OptionItem.cpp index 9642cb6d3..a0c9b2e82 100644 --- a/projects/mtg/src/OptionItem.cpp +++ b/projects/mtg/src/OptionItem.cpp @@ -34,7 +34,15 @@ void OptionItem::Render(){ renderer->FillRoundRect(x-5,y-2,SCREEN_WIDTH -x - 5,20,2,ARGB(150,50,50,50)); mFont->DrawString(displayValue.c_str(),x,y); char buf[512]; - sprintf(buf, "%i", value); + if (maxValue == 1){ + if (value){ + sprintf(buf, "yes"); + }else{ + sprintf(buf,"no"); + } + }else{ + sprintf(buf, "%i", value); + } mFont->DrawString(buf,SCREEN_WIDTH -10 ,y,JGETEXT_RIGHT); } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 8f5664fd8..5e867db2b 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -25,6 +25,12 @@ Player::~Player(){ if (mAvatar) delete mAvatar; } +const char * Player::getDisplayName(){ + GameObserver * g = GameObserver::GetInstance(); + if (this == g->players[0]) return "Player 1"; + return "Player 2"; +} + MTGInPlay * Player::inPlay(){ return game->inPlay; }