Files
wagic/projects/mtg/src/DuelLayers.cpp
wrenczes d5f3e4cfea Enabled precompiled headers for the build. This cuts the win compile time in debug by at least half on my laptop; on the psp compile, it shaves it down by ~ 45 seconds. I only did a cursory inspection of what to add to PrecompiledHeader.h, there's probably more that we can throw in there for more incremental speed improvements.
Also fixed the project includes so that we don't need to always use the indirect include path, ie:
#include "../include/foo.h" -> #include "foo.h"

I'm don't know much about make files - if I busted the linux build, mea culpa, but I think we're okay on that front too.  For future reference, here's the most straightforward link on the topic of adding pch support to make files:

http://www.mercs-eng.com/~hulud/index.php?2008/06/13/6-writing-a-good-makefile-for-a-c-project
2010-10-24 05:55:24 +00:00

210 lines
5.3 KiB
C++

#include "PrecompiledHeader.h"
#include "MTGRules.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 MTGTokensCleanup(-1)); // needs to be before persist
action->Add(NEW MTGPersistRule(-1));
action->Add(NEW MTGAffinityRule(-1));
action->Add(NEW MTGUnearthRule(-1));
action->Add(NEW MTGCantCasterstart(-1));
action->Add(NEW MTGSneakAttackRule(-1));
action->Add(NEW MTGLifelinkRule(-1));
action->Add(NEW MTGDeathtouchRule(-1));
action->Add(NEW OtherAbilitiesEventReceiver(-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());
}