From f407fa31efc48f7071cdc075f5e7934c43834e69 Mon Sep 17 00:00:00 2001 From: "jean.chalard" Date: Mon, 31 Aug 2009 12:35:16 +0000 Subject: [PATCH] J : * Display the avatar in the damaged list if the attacker has trample. --- projects/mtg/include/GuiCombat.h | 4 +-- projects/mtg/src/GuiCombat.cpp | 47 ++++++++++++++++++++++------ projects/mtg/src/GuiStatic.cpp | 10 +++--- projects/mtg/src/MTGCardInstance.cpp | 2 +- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/projects/mtg/include/GuiCombat.h b/projects/mtg/include/GuiCombat.h index 768d7ddd7..15f4560a7 100644 --- a/projects/mtg/include/GuiCombat.h +++ b/projects/mtg/include/GuiCombat.h @@ -14,14 +14,14 @@ class GuiCombat : public GuiLayer DamagerDamaged* active; AttackerDamaged* activeAtk; static JQuad* ok_quad; - Pos ok; + Pos ok, enemy_avatar; vector attackers; DamagerDamaged* current; enum { BLK, ATK, OK, NONE } cursor_pos; CombatStep step; void addOne(DefenserDamaged* blocker, CombatStep); void removeOne(DefenserDamaged* blocker, CombatStep); - void reaffectDamage(AttackerDamaged* attacker, CombatStep); + void autoaffectDamage(AttackerDamaged* attacker, CombatStep); void remaskBlkViews(AttackerDamaged* before, AttackerDamaged* after); public: diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index 1ed7c3a2e..aa7472eb7 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -13,7 +13,10 @@ struct Right : public Exp { static inline bool test(DamagerDamaged* ref, Damager JQuad* GuiCombat::ok_quad = NULL; -GuiCombat::GuiCombat(GameObserver* go) : GuiLayer(), go(go), active(false), activeAtk(NULL), ok(SCREEN_WIDTH - MARGIN, 210, 1, 0, 255), cursor_pos(NONE), step(DAMAGE) +GuiCombat::GuiCombat(GameObserver* go) : GuiLayer(), go(go), active(false), activeAtk(NULL), + ok(SCREEN_WIDTH - MARGIN, 210, 1, 0, 255), + enemy_avatar(SCREEN_WIDTH - MARGIN, TOP_LINE, 2, 0, 255), + cursor_pos(NONE), step(DAMAGE) { if (NULL == ok_quad) { @@ -30,7 +33,11 @@ GuiCombat::GuiCombat(GameObserver* go) : GuiLayer(), go(go), active(false), acti GuiCombat::~GuiCombat() { for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) - delete (*it); + { + for (vector::iterator q = (*it)->blockers.begin(); q != (*it)->blockers.end(); ++q) + delete(*q); + delete (*it); + } } template @@ -56,6 +63,7 @@ void GuiCombat::Update(float dt) for (vector::iterator q = activeAtk->blockers.begin(); q != activeAtk->blockers.end(); ++q) (*q)->Update(dt); ok.Update(dt); + enemy_avatar.Update(dt); } void GuiCombat::remaskBlkViews(AttackerDamaged* before, AttackerDamaged* after) @@ -67,11 +75,12 @@ void GuiCombat::remaskBlkViews(AttackerDamaged* before, AttackerDamaged* after) (*q)->actX = MARGIN; (*q)->y = TOP_LINE; (*q)->zoom = 2.2; (*q)->t = 0; } - repos(after->blockers.begin(), after->blockers.end()); + repos(after->blockers.begin(), after->blockers.end(), after->card->has(Constants::TRAMPLE) ? 0 : -1); + enemy_avatar.actX = MARGIN; enemy_avatar.x = SCREEN_WIDTH - MARGIN; } } -void GuiCombat::reaffectDamage(AttackerDamaged* attacker, CombatStep step) +void GuiCombat::autoaffectDamage(AttackerDamaged* attacker, CombatStep step) { attacker->clearDamage(); unsigned damage = attacker->card->stepPower(step); @@ -201,8 +210,26 @@ void GuiCombat::Render() for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) if ((*it)->show) (*it)->Render(step); if (activeAtk) - for (vector::iterator q = activeAtk->blockers.begin(); q != activeAtk->blockers.end(); ++q) - (*q)->Render(step); + { + signed damage = activeAtk->card->stepPower(step); + for (vector::iterator q = activeAtk->blockers.begin(); q != activeAtk->blockers.end(); ++q) + { + (*q)->Render(step); + damage -= (*q)->sumDamages(); + } + if (damage < 0) damage = 0; + if (activeAtk->card->has(Constants::TRAMPLE)) + { + go->opponent()->mAvatar->SetHotSpot(18, 25); + enemy_avatar.Render(go->opponent()->mAvatar); + JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT); + mFont->SetColor(ARGB(255, 255, 64, 0)); + { + char buf[10]; sprintf(buf, "%i", damage); + mFont->DrawString(buf, enemy_avatar.actX - 25, enemy_avatar.actY - 40); + } + } + } if (ok_quad) ok.Render(ok_quad); renderer->DrawLine(0, SCREEN_HEIGHT / 2 + 10, SCREEN_WIDTH, SCREEN_HEIGHT / 2 + 10, ARGB(255, 255, 64, 0)); if (FIRST_STRIKE == step) @@ -251,7 +278,7 @@ int GuiCombat::receiveEventPlus(WEvent* e) (*it1)->x = (*it2)->x; (*it2)->x = x; std::iter_swap(it1, it2); - reaffectDamage(*it, DAMAGE); + autoaffectDamage(*it, DAMAGE); } return 1; } @@ -291,11 +318,11 @@ 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->isAI()) { go->receiveEvent(NEW WEventCombatStepChange(FIRST_STRIKE)); return 1; } for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) { (*it)->show = (1 < (*it)->blockers.size()); - reaffectDamage(*it, DAMAGE); + autoaffectDamage(*it, DAMAGE); } active = NULL; for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) @@ -328,7 +355,7 @@ int GuiCombat::receiveEventMinus(WEvent* e) step = event->step; cursor_pos = ATK; for (inner_iterator attacker = attackers.begin(); attacker != attackers.end(); ++attacker) - reaffectDamage(*attacker, step); + autoaffectDamage(*attacker, step); for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it) (*it)->show = ((*it)->card->has(Constants::DOUBLESTRIKE) || ((*it)->card->has(Constants::FIRSTSTRIKE) ^ (DAMAGE == step))) && (1 < (*it)->blockers.size()); repos(attackers.begin(), attackers.end(), 0); diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index 3b0cbf569..f57c9dc7d 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -14,11 +14,6 @@ bool GuiStatic::Leaving(u32 key) GuiAvatar::GuiAvatar(float x, float y, bool hasFocus, Player * player, Corner corner, GuiAvatars* parent) : GuiStatic(GuiAvatar::Height, x, y, hasFocus, parent), avatarRed(255), currentLife(player->life), corner(corner), player(player) { type = GUI_AVATAR; - switch (corner) - { - case TOP_LEFT : player->mAvatar->SetHotSpot(0, 0); break; - case BOTTOM_RIGHT : player->mAvatar->SetHotSpot(35, 50); break; - } } void GuiAvatar::Render() @@ -41,6 +36,11 @@ void GuiAvatar::Render() JQuad * quad = player->mAvatar; if (quad) { + switch (corner) + { + case TOP_LEFT : quad->SetHotSpot(0, 0); break; + case BOTTOM_RIGHT : quad->SetHotSpot(35, 50); break; + } quad->SetColor(ARGB((int)actA, 255, avatarRed, avatarRed)); r->RenderQuad(quad, actX, actY, actT, actZ, actZ); } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index efb7ce31e..549a5ba9b 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -638,7 +638,7 @@ int MTGCardInstance::stepPower(CombatStep step) case FIRST_STRIKE : if (has(Constants::FIRSTSTRIKE) || has(Constants::DOUBLESTRIKE)) return MAX(0, power); else return 0; case DAMAGE : + default : if (has(Constants::FIRSTSTRIKE)) return 0; else return MAX(0, power); - default : return 0; } }