diff --git a/projects/mtg/include/Damage.h b/projects/mtg/include/Damage.h index bc7f3d253..c87770822 100644 --- a/projects/mtg/include/Damage.h +++ b/projects/mtg/include/Damage.h @@ -52,6 +52,17 @@ class DamageStack :public GuiLayer, public Interruptible{ DamageStack(GameObserver* game); }; +class StableDamageStack : public Interruptible { + protected: + vector damage; + + public: + int resolve(); + void Render(); + void Add(Damage*); + virtual ostream& toString(ostream& out) const; +}; + #endif diff --git a/projects/mtg/include/GuiCombat.h b/projects/mtg/include/GuiCombat.h index 15f4560a7..c520e9816 100644 --- a/projects/mtg/include/GuiCombat.h +++ b/projects/mtg/include/GuiCombat.h @@ -23,6 +23,7 @@ class GuiCombat : public GuiLayer void removeOne(DefenserDamaged* blocker, CombatStep); void autoaffectDamage(AttackerDamaged* attacker, CombatStep); void remaskBlkViews(AttackerDamaged* before, AttackerDamaged* after); + void resolve(); public: GuiCombat(GameObserver* go); diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 554820e5e..0b6a6be2c 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -48,8 +48,6 @@ void CardGui::Render() 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); @@ -95,11 +93,10 @@ void CardGui::Render() } JQuad * CardGui::alternateThumbQuad(MTGCard * card){ - JRenderer * renderer = JRenderer::GetInstance(); JQuad * q; switch(card->getColor()) { - case Constants::MTG_COLOR_GREEN: q = cache.getQuad("sets/green_thumb.jpg");break; + case Constants::MTG_COLOR_GREEN: q = cache.getQuad("sets/green_thumb.jpg");break; case Constants::MTG_COLOR_BLUE : q = cache.getQuad("sets/blue_thumb.jpg");break; case Constants::MTG_COLOR_RED : q = cache.getQuad("sets/red_thumb.jpg");break; case Constants::MTG_COLOR_BLACK: q = cache.getQuad("sets/black_thumb.jpg");break; diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index b20d44f95..54b59f0da 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -130,3 +130,33 @@ ostream& DamageStack::toString(ostream& out) const { return (out << "DamageStack ::: currentState : " << currentState); } + + +int StableDamageStack::resolve() +{ + for (vector::iterator it = damage.begin(); it != damage.end(); ++it) + if ((*it)->state == NOT_RESOLVED) (*it)->resolve(); + for (vector::iterator it = damage.begin(); it != damage.end(); ++it) + if ((*it)->state == RESOLVED_OK) (*it)->target->afterDamage(); + return 1; +} + +void StableDamageStack::Render(){ + int currenty = y; + for (vector::iterator it = damage.begin(); it != damage.end(); ++it) + { + if ((*it)->state == NOT_RESOLVED){ + (*it)->x = x; + (*it)->y = currenty; + currenty += (*it)->mHeight; + (*it)->Render(); + } + } +} + +void StableDamageStack::Add(Damage* d) { damage.push_back(d); } + +ostream& StableDamageStack::toString(ostream& out) const +{ + return (out << "StableDamageStack ::: size : " << damage.size()); +} diff --git a/projects/mtg/src/DamagerDamaged.cpp b/projects/mtg/src/DamagerDamaged.cpp index 2aa5e3a6b..2720bf29b 100644 --- a/projects/mtg/src/DamagerDamaged.cpp +++ b/projects/mtg/src/DamagerDamaged.cpp @@ -28,7 +28,7 @@ void DamagerDamaged::addDamage(int damage, DamagerDamaged* source){ if (0 >= i->damage) damages.erase(i); return; } - if (0 < damage) damages.push_back(Damage(source->card, this->card,damage)); + if (0 < damage) damages.push_back(Damage(source->card, card, damage)); return; } diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index aa7472eb7..9aec73ebf 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -141,8 +141,8 @@ bool GuiCombat::CheckUserInput(u32 key) switch (step) { case ORDER : go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); break; - case FIRST_STRIKE : go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); break; - case DAMAGE : cursor_pos = NONE; go->userRequestNextGamePhase(); break; + case FIRST_STRIKE : resolve(); go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); break; + case DAMAGE : resolve(); cursor_pos = NONE; go->userRequestNextGamePhase(); break; } break; case PSP_CTRL_TRIANGLE: @@ -240,6 +240,20 @@ void GuiCombat::Render() } } +void GuiCombat::resolve() +{ + StableDamageStack stack; + for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) + { + for (vector::iterator q = (*it)->blockers.begin(); q != (*it)->blockers.end(); ++q) + for (vector::iterator d = (*q)->damages.begin(); d != (*q)->damages.end(); ++d) + stack.Add(&(*d)); + for (vector::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d) + stack.Add(&(*d)); + } + stack.resolve(); +} + int GuiCombat::receiveEventPlus(WEvent* e) { if (WEventCreatureAttacker* event = dynamic_cast(e)) @@ -318,7 +332,7 @@ int GuiCombat::receiveEventMinus(WEvent* e) case ORDER: { if (ORDER == step) return 0; // Why do I take this twice ? >.> - if (go->currentPlayer->isAI()) { go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); return 1; } + if (!go->currentPlayer->displayStack()) { go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); return 1; } for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) { (*it)->show = (1 < (*it)->blockers.size()); @@ -351,9 +365,8 @@ int GuiCombat::receiveEventMinus(WEvent* e) go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); return 1; case DAMAGE: DAMAGE: - if (go->currentPlayer->isAI()) { go->userRequestNextGamePhase(); return 1; } + if (!go->currentPlayer->displayStack()) { go->userRequestNextGamePhase(); return 1; } step = event->step; - cursor_pos = ATK; for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker) autoaffectDamage(*attacker, step); for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) @@ -366,9 +379,11 @@ int GuiCombat::receiveEventMinus(WEvent* e) active->zoom = 2.7; activeAtk = static_cast(active); remaskBlkViews(NULL, static_cast(active)); + cursor_pos = ATK; } else { + resolve(); if (FIRST_STRIKE == step) go->receiveEvent(NEW WEventCombatStepChange(DAMAGE)); else go->userRequestNextGamePhase(); } diff --git a/projects/mtg/src/GuiFrame.cpp b/projects/mtg/src/GuiFrame.cpp index cd758f4ac..c1b916131 100644 --- a/projects/mtg/src/GuiFrame.cpp +++ b/projects/mtg/src/GuiFrame.cpp @@ -52,7 +52,7 @@ void GuiFrame::Render() renderer->RenderQuad(gold1, -sized, 16); renderer->RenderQuad(gold1, -sized + 479, 16); - goldGlow->SetColor(ARGB(100+(rand()%50), 255, 255, 255)); + goldGlow->SetColor(ARGB((100+(rand()%50)), 255, 255, 255)); renderer->RenderQuad(goldGlow, -sized, 9); renderer->RenderQuad(goldGlow, -sized + 480, 9); diff --git a/projects/mtg/src/GuiMana.cpp b/projects/mtg/src/GuiMana.cpp index 905af2c3c..befe38121 100644 --- a/projects/mtg/src/GuiMana.cpp +++ b/projects/mtg/src/GuiMana.cpp @@ -168,7 +168,7 @@ int GuiMana::receiveEventMinus(WEvent* e) if ((event->color == (*it)->color) && (ManaIcon::ALIVE == (*it)->mode)) { (*it)->Wither(); return 1; } return 1; } - else if (WEventEmptyManaPool *event = dynamic_cast(e)) + else if (dynamic_cast(e)) { for (vector::iterator it = manas.begin(); it != manas.end(); ++it) (*it)->Drop(); //TODO: split according to which manapool was emptied... diff --git a/projects/mtg/src/GuiPhaseBar.cpp b/projects/mtg/src/GuiPhaseBar.cpp index 4b48e87a4..e621d33e1 100644 --- a/projects/mtg/src/GuiPhaseBar.cpp +++ b/projects/mtg/src/GuiPhaseBar.cpp @@ -2,6 +2,7 @@ #include "../include/GameApp.h" #include "../include/GuiPhaseBar.h" +/* static int colors[] = { ARGB(255, 255, 255, 255), @@ -17,6 +18,7 @@ static int colors[] = ARGB(255, 255, 255, 255), ARGB(255, 255, 255, 255) }; +*/ GuiPhaseBar::GuiPhaseBar() : phase(GameObserver::GetInstance()->phaseRing->getCurrentPhase()), angle(0.0f) { diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 038c81dcb..181c34d5a 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -193,7 +193,7 @@ int GuiPlay::receiveEventPlus(WEvent * e) battleField.removeAttacker(event->card); Replace(); } - else if (WEventCreatureBlocker* event = dynamic_cast(e)) + else if (dynamic_cast(e)) { Replace(); } diff --git a/projects/mtg/src/ShopItem.cpp b/projects/mtg/src/ShopItem.cpp index f4f8cd28e..eed34d069 100644 --- a/projects/mtg/src/ShopItem.cpp +++ b/projects/mtg/src/ShopItem.cpp @@ -296,7 +296,6 @@ void ShopItems::Render(){ } char credits[512]; sprintf(credits,_("credits: %i").c_str(), playerdata->credits); - unsigned int len = 4 + mFont->GetStringWidth(credits); mFont->SetColor(ARGB(200,0,0,0)); mFont->DrawString(credits, 5, SCREEN_HEIGHT - 13); mFont->SetColor(ARGB(255,255,255,255));