Files
wagic/projects/mtg/src/GuiPhaseBar.cpp
Tobias Loose 5d92553017 Fix bug where the phase wheel got out of sync
The phase wheel messures phases within another unit and not
mtg phases. It is important to map between those
2013-12-11 01:53:05 +01:00

178 lines
5.2 KiB
C++

#include "PrecompiledHeader.h"
#include "GameApp.h"
#include "GuiPhaseBar.h"
#include "GameObserver.h"
#include "Translate.h"
#include "CardSelector.h"
/*
static int colors[] =
{
ARGB(255, 255, 255, 255),
ARGB(255, 255, 000, 000),
ARGB(255, 000, 255, 000),
ARGB(255, 000, 000, 255),
ARGB(255, 255, 255, 000),
ARGB(255, 255, 000, 255),
ARGB(255, 000, 255, 255),
ARGB(255, 000, 000, 000),
ARGB(255, 255, 255, 255),
ARGB(255, 255, 255, 255),
ARGB(255, 255, 255, 255),
ARGB(255, 255, 255, 255)
};
*/
const float GuiPhaseBar::zoom_big = (float)(1.5 * 1.4);
const float GuiPhaseBar::zoom_small = 1.5;
const float GuiPhaseBar::step = M_PI/6.0f;
namespace
{
//width and height of the phase symbol textures
const float kWidth = 28;
const float kHeight = kWidth;
const unsigned kPhases = NB_MTG_PHASES - 2; //there are two phases we do not show
}
void GuiPhaseBar::DrawGlyph(JQuad *inQuad, int phaseId, float x, float y, float scale)
{
inQuad->SetTextureRect(phaseId * (kWidth + 1), 0, kWidth, kHeight);
JRenderer::GetInstance()->RenderQuad(inQuad, x, y - scale * kWidth/2, 0.0f, scale, scale);
}
GuiPhaseBar::GuiPhaseBar(DuelLayers* duelLayers) :
GuiLayer(duelLayers->getObserver()), PlayGuiObject(80, 0, 106, 0, false),
displayedPhaseId(0), angle(0.0f), zoomFactor(zoom_small), angleEasing(angle),
zoomFactorEasing(zoomFactor), mpDuelLayers(duelLayers)
{
if(duelLayers->getObserver()->getResourceManager())
{
JQuadPtr quad = WResourceManager::Instance()->GetQuad("phasebar");
if (quad.get() != NULL)
{
quad->mHeight = kHeight;
quad->mWidth = kWidth;
}
else
GameApp::systemError = "Error loading phasebar texture : " __FILE__;
}
mpDuelLayers->getCardSelector()->Add(this);
}
GuiPhaseBar::~GuiPhaseBar()
{
}
void GuiPhaseBar::Update(float dt)
{
angleEasing.update(dt);
if(angle <= -step)
{
displayedPhaseId = (displayedPhaseId + 1) % kPhases;
angleEasing.translate(step);
}
zoomFactorEasing.update(dt);
}
void GuiPhaseBar::Entering()
{
mHasFocus = true;
zoomFactorEasing.start(zoom_big, 0.3f);
}
bool GuiPhaseBar::Leaving(JButton)
{
mHasFocus = false;
zoomFactorEasing.start(zoom_small, 0.6f);
return true;
}
void GuiPhaseBar::Render()
{
JQuadPtr quad = WResourceManager::Instance()->GetQuad("phasebar");
//uncomment to draw a hideous line across hires screens.
// JRenderer::GetInstance()->DrawLine(0, CENTER, SCREEN_WIDTH, CENTER, ARGB(255, 255, 255, 255));
const float radius = 25 * zoomFactor;
for(int i = 0; i < 6; ++i)
{
//the position of the glyphe in the circle
const float circPos = (i - 2) * step + angle;
const float glyphY = this->y + this->mHeight / 2 + sin(circPos) * radius;
//the scale is computed so that the glyphes touch each other
//hint: sin(circPos + PI/2) = cos(circPos)
const float glyphScale = float(zoomFactor * cosf(circPos) * 0.5f);
DrawGlyph(quad.get(), (displayedPhaseId - 2 + i + kPhases) % kPhases, 0, glyphY, glyphScale);
}
//print phase name
WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
string currentP = _("your turn");
string interrupt = "";
if (observer->currentPlayer == mpDuelLayers->getRenderedPlayerOpponent())
{
currentP = _("opponent's turn");
}
font->SetColor(ARGB(255, 255, 255, 255));
if (observer->currentlyActing() && observer->currentlyActing()->isAI())
{
font->SetColor(ARGB(255, 128, 128, 128));
}
if (observer->currentlyActing() != observer->currentPlayer)
{
if (observer->currentPlayer == mpDuelLayers->getRenderedPlayer())
{
interrupt = _(" - ") + _("opponent plays");
}
else
{
interrupt = _(" - ") + _("you play");
}
}
char buf[200];
//running this string through translate returns gibberish even though we defined the variables in the lang.txt
//the conversion from phase bar phases to mtg phases is x%kPhases + 1
//todo: just to this when the displayedPhaseId updates
string phaseNameToTranslate = observer->phaseRing->phaseName(displayedPhaseId%kPhases + 1);
phaseNameToTranslate = _(phaseNameToTranslate);
sprintf(buf, _("(%s%s) %s").c_str(), currentP.c_str(), interrupt.c_str(),phaseNameToTranslate.c_str());
font->DrawString(buf, SCREEN_WIDTH - 5, 2, JGETEXT_RIGHT);
}
int GuiPhaseBar::receiveEventMinus(WEvent *e)
{
WEventPhaseChange *event = dynamic_cast<WEventPhaseChange*> (e);
if (event)
{
//convert the mtg phase to the phases of the phase wheel
//the mapping is
//0 -> none
//1..12 -> 0..11
//13 -> none
int targetPhase = event->to->id;
if(targetPhase != 0 && targetPhase != 13)
{
targetPhase -= 1;
int phasesToAnimate = (targetPhase - displayedPhaseId + kPhases) % kPhases;
angleEasing.start(float(phasesToAnimate * (- step)), 0.3f * float(sqrt(float(phasesToAnimate))));
}
}
return 1;
}
ostream& GuiPhaseBar::toString(ostream& out) const
{
return out << "GuiPhaseBar";
}