0a60979554
moved it out of rules, it was FAR to error prone and after fixing bugs on this ability about 12 times, im done with it. noticed yesterday that it was removing the completely wrong amounts, and not maintaining its cost AT ALL. so i got sick of adjusting it as a rule, its now a statebased effect, called through gamestatebasedeffect as a side function. the new affinity is less then 100 lines of code, down from 300. to acomplish the effect with FAR less effort. it is also FAR easier to maintain in the future if i die or leave the scene or whatever. added a new count tool for MTGGameZones canByCanTarget...which allows for returns of amounts based on if it can be targetted by a tc. much like how listmaintainer does it. affinitygreencreature will not be the only ability to use this function, just a heads up. its just the first to do so. hopefully this much more accurate affinity will be the last version...considering adding the other types which old affinity couldnt handle :D
232 lines
5.9 KiB
C++
232 lines
5.9 KiB
C++
#include "PrecompiledHeader.h"
|
|
|
|
#include "MTGRules.h"
|
|
#include "CardSelectorSingleton.h"
|
|
#include "GuiCombat.h"
|
|
#include "GuiBackground.h"
|
|
#include "GuiFrame.h"
|
|
#include "GuiPhaseBar.h"
|
|
#include "GuiAvatars.h"
|
|
#include "GuiHand.h"
|
|
#include "GuiPlay.h"
|
|
#include "GuiMana.h"
|
|
#include "Trash.h"
|
|
#include "DuelLayers.h"
|
|
|
|
void DuelLayers::init()
|
|
{
|
|
|
|
GameObserver* go = GameObserver::GetInstance();
|
|
|
|
mCardSelector = CardSelectorSingleton::Create(this);
|
|
//1 Action Layer
|
|
action = NEW ActionLayer();
|
|
action->Add(NEW MTGGamePhase(action->getMaxId()));
|
|
//Add Magic Specific Rules
|
|
action->Add(NEW MTGPutInPlayRule(-1));
|
|
action->Add(NEW MTGAlternativeCostRule(-1));
|
|
action->Add(NEW MTGBuyBackRule(-1));
|
|
action->Add(NEW MTGFlashBackRule(-1));
|
|
action->Add(NEW MTGRetraceRule(-1));
|
|
action->Add(NEW MTGAttackRule(-1));
|
|
action->Add(NEW MTGBlockRule(-1));
|
|
action->Add(NEW MTGCombatTriggersRule(-1));
|
|
action->Add(NEW MTGLegendRule(-1));
|
|
action->Add(NEW MTGPlaneWalkerRule(-1));
|
|
action->Add(NEW MTGTokensCleanup(-1)); // needs to be before persist
|
|
action->Add(NEW MTGPersistRule(-1));
|
|
action->Add(NEW MTGUnearthRule(-1));
|
|
action->Add(NEW MTGLifelinkRule(-1));
|
|
action->Add(NEW MTGDeathtouchRule(-1));
|
|
action->Add(NEW OtherAbilitiesEventReceiver(-1));
|
|
action->Add(NEW MTGMorphCostRule(-1));
|
|
//Other display elements
|
|
action->Add(NEW HUDDisplay(-1));
|
|
|
|
Add(NEW GuiMana(20, 20, go->players[1]));
|
|
Add(NEW GuiMana(440, 20, go->players[0]));
|
|
Add(stack = NEW ActionStack(go));
|
|
Add(combat = NEW GuiCombat(go));
|
|
Add(action);
|
|
Add(mCardSelector);
|
|
Add(hand = NEW GuiHandSelf(go->players[0]->game->hand));
|
|
Add(avatars = NEW GuiAvatars());
|
|
Add(NEW GuiHandOpponent(go->players[1]->game->hand));
|
|
Add(NEW GuiPlay(go));
|
|
Add(NEW GuiPhaseBar());
|
|
Add(NEW GuiFrame());
|
|
Add(NEW GuiBackground());
|
|
}
|
|
|
|
void DuelLayers::CheckUserInput(int isAI)
|
|
{
|
|
JButton key;
|
|
int x, y;
|
|
while ((key = JGE::GetInstance()->ReadButton()))
|
|
{
|
|
if ((!isAI) && (0 != key))
|
|
{
|
|
if (stack->CheckUserInput(key))
|
|
break;
|
|
if (combat->CheckUserInput(key))
|
|
break;
|
|
if (avatars->CheckUserInput(key))
|
|
break; //avatars need to check their input before action (CTRL_CROSS)
|
|
if (action->CheckUserInput(key))
|
|
break;
|
|
if (hand->CheckUserInput(key))
|
|
break;
|
|
if (CardSelectorSingleton::Instance()->CheckUserInput(key))
|
|
break;
|
|
}
|
|
}
|
|
if (JGE::GetInstance()->GetLeftClickCoordinates(x, y))
|
|
{
|
|
if (avatars->CheckUserInput(x, y))
|
|
{
|
|
JGE::GetInstance()->LeftClickedProcessed();
|
|
}
|
|
else if (CardSelectorSingleton::Instance()->CheckUserInput(x, y))
|
|
{
|
|
JGE::GetInstance()->LeftClickedProcessed();
|
|
}
|
|
}
|
|
}
|
|
|
|
void DuelLayers::Update(float dt, Player * currentPlayer)
|
|
{
|
|
for (int i = 0; i < nbitems; ++i)
|
|
objects[i]->Update(dt);
|
|
int isAI = currentPlayer->isAI();
|
|
if (isAI)
|
|
currentPlayer->Act(dt);
|
|
CheckUserInput(isAI);
|
|
}
|
|
|
|
ActionStack * DuelLayers::stackLayer()
|
|
{
|
|
return stack;
|
|
}
|
|
|
|
GuiCombat * DuelLayers::combatLayer()
|
|
{
|
|
return combat;
|
|
}
|
|
|
|
ActionLayer * DuelLayers::actionLayer()
|
|
{
|
|
return action;
|
|
}
|
|
|
|
GuiAvatars * DuelLayers::GetAvatars()
|
|
{
|
|
return avatars;
|
|
}
|
|
|
|
DuelLayers::DuelLayers() :
|
|
nbitems(0)
|
|
{
|
|
}
|
|
|
|
DuelLayers::~DuelLayers()
|
|
{
|
|
int _nbitems = nbitems;
|
|
nbitems = 0;
|
|
for (int i = 0; i < _nbitems; ++i)
|
|
{
|
|
if (objects[i] != mCardSelector)
|
|
{
|
|
delete objects[i];
|
|
objects[i] = NULL;
|
|
}
|
|
}
|
|
|
|
for (size_t i = 0; i < waiters.size(); ++i)
|
|
delete (waiters[i]);
|
|
Trash::cleanup();
|
|
|
|
CardSelectorSingleton::Terminate();
|
|
mCardSelector = NULL;
|
|
}
|
|
|
|
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<type*>(e); if (foo) cout << "Is a " #type " " << *foo << endl; }
|
|
cout << "Received event " << e << " ";
|
|
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(WEventCombatStepChange);
|
|
PRINT_IF(WEventEngageMana);
|
|
PRINT_IF(WEventConsumeMana);
|
|
PRINT_IF(WEventEmptyManaPool);
|
|
#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<WEventZoneChange*>(e))
|
|
{
|
|
MTGCardInstance* card = event->card;
|
|
if (card->view)
|
|
waiters.push_back(p = NEW Pos(*(card->view)));
|
|
else
|
|
waiters.push_back(p = NEW Pos(0, 0, 0, 0, 255));
|
|
const Pos* ref = card->view;
|
|
while (card)
|
|
{
|
|
if (ref == card->view)
|
|
card->view = p;
|
|
card = card->next;
|
|
}
|
|
}
|
|
}
|
|
for (int i = 0; i < nbitems; ++i)
|
|
objects[i]->receiveEventMinus(e);
|
|
|
|
if (WEventPhaseChange *event = dynamic_cast<WEventPhaseChange*>(e))
|
|
if (Constants::MTG_PHASE_BEFORE_BEGIN == event->to->id)
|
|
Trash::cleanup();
|
|
|
|
return 1;
|
|
}
|
|
|
|
float DuelLayers::RightBoundary()
|
|
{
|
|
return MIN (hand->LeftBoundary(), avatars->LeftBoundarySelf());
|
|
}
|