int gaugeWidth(width - gaugeX - (align == LEFT ? 1 : 5) * res->heroTagFont->CharWidth());
// health gauge, second line
Vector<int> healthGaugeOffset(gaugeX, frameOffset.Y() + res->heroTagFont->CharHeight());
- res->healthGauge->Draw(screen, position + healthGaugeOffset, gaugeWidth, hero->RelativeHealth(gaugeWidth));
+ res->healthGauge->Draw(screen, position + healthGaugeOffset, gaugeWidth, hero->RelativeHealth(255));
// mana gauge, third line
Vector<int> manaGaugeOffset(gaugeX, frameOffset.Y() + 2 * res->heroTagFont->CharHeight());
- res->manaGauge->Draw(screen, position + manaGaugeOffset, gaugeWidth, hero->RelativeMana(gaugeWidth));
+ res->manaGauge->Draw(screen, position + manaGaugeOffset, gaugeWidth, hero->RelativeMana(255));
// ikari gauge, fourth line
Vector<int> ikariGaugeOffset(gaugeX, frameOffset.Y() + 3 * res->heroTagFont->CharHeight());
- res->ikariGauge->Draw(screen, position + ikariGaugeOffset, gaugeWidth, hero->RelativeIP(gaugeWidth));
+ res->ikariGauge->Draw(screen, position + ikariGaugeOffset, gaugeWidth, hero->RelativeIP(255));
// labels
int labelX((align == LEFT ? 5 : 1) * res->heroTagFont->CharWidth());
namespace graphics {
-// TODO: add start and end "ignore" offsets
-void Gauge::Draw(SDL_Surface *dest, Point<int> position, int width, int fullWidth) const {
+void Gauge::Draw(SDL_Surface *dest, Point<int> position, int width, Uint8 fill) const {
SDL_Rect srcRect, destRect;
+ int filledWidth = fill * (width - startWidth - endWidth) / 255;
+ int emptyWidth = (255 - fill) * (width - startWidth - endWidth) / 255;
+
// start
+ srcRect.w = startWidth;
srcRect.h = height;
destRect.x = position.X();
destRect.y = position.Y();
// full part
- if (fullWidth >= startWidth) { // completely filled
- srcRect.x = fullX;
- srcRect.y = fullY;
- srcRect.w = startWidth;
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- } else if (fullWidth > 0) { // partially filled
- srcRect.x = fullX;
- srcRect.y = fullY;
- srcRect.w = fullWidth;
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- }
- // empty part
- if (fullWidth == 0) { // completely empty
+ if (fill == 0) {
srcRect.x = emptyX;
srcRect.y = emptyY;
- srcRect.w = startWidth;
SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- } else if (fullWidth < startWidth) { // partially empty
- srcRect.x = emptyX + fullWidth;
- srcRect.y = emptyY;
- srcRect.w = startWidth - fullWidth;
- destRect.x = position.X() + fullWidth;
+ } else {
+ srcRect.x = fullX;
+ srcRect.y = fullY;
SDL_BlitSurface(surface, &srcRect, dest, &destRect);
}
destRect.x = position.X() + startWidth;
// fill
- if (fullWidth >= width - endWidth) { // completely filled
- srcRect.x = fullX + startWidth;
- srcRect.y = fullY;
- srcRect.w = repeatWidth;
- int fillWidth(width - startWidth - endWidth);
- int fillCursor(0);
- while (fillCursor < fillWidth) {
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- destRect.x += repeatWidth;
- fillCursor += repeatWidth;
- }
- } else if (fullWidth <= startWidth) { // completely empty
- srcRect.x = emptyX + startWidth;
- srcRect.y = emptyY;
- srcRect.w = repeatWidth;
- int fillWidth(width - startWidth - endWidth);
- int fillCursor(0);
- while (fillCursor < fillWidth) {
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- destRect.x += repeatWidth;
- fillCursor += repeatWidth;
- }
- } else { // partially filled/empty
- srcRect.x = fullX + startWidth;
- srcRect.y = fullY;
- srcRect.w = repeatWidth;
- int fillCursor(0);
- while (fillCursor < fullWidth) {
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- destRect.x += repeatWidth;
- fillCursor += repeatWidth;
- }
- srcRect.x = emptyX + startWidth;
- srcRect.y = emptyY;
- int remaining(width - startWidth - endWidth);
- while (fillCursor < remaining) {
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- destRect.x += repeatWidth;
- fillCursor += repeatWidth;
- }
+ srcRect.x = fullX + startWidth;
+ srcRect.y = fullY;
+ srcRect.w = repeatWidth;
+ while (filledWidth > repeatWidth) {
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ destRect.x += repeatWidth;
+ filledWidth -= repeatWidth;
+ }
+ srcRect.x = emptyX + startWidth;
+ srcRect.y = emptyY;
+ while (emptyWidth > repeatWidth) {
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ destRect.x += repeatWidth;
+ emptyWidth -= repeatWidth;
}
// end
- // full part
- if (fullWidth >= width) { // completely filled
+ srcRect.w = endWidth;
+ if (fill == 255) {
srcRect.x = fullX + startWidth + repeatWidth;
srcRect.y = fullY;
- srcRect.w = endWidth;
SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- } else if (fullWidth > (width - endWidth)) { // partially filled
- srcRect.x = fullX + startWidth + repeatWidth;
- srcRect.y = fullY;
- srcRect.w = endWidth - width + fullWidth;
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- }
- // empty part
- if (fullWidth <= width - endWidth) { // completely empty
+ } else {
srcRect.x = emptyX + startWidth + repeatWidth;
srcRect.y = emptyY;
- srcRect.w = startWidth;
- SDL_BlitSurface(surface, &srcRect, dest, &destRect);
- } else if (fullWidth > (width - endWidth) && fullWidth < width) { // partially empty
- srcRect.x = emptyX + startWidth + repeatWidth + fullWidth - width + endWidth;
- srcRect.y = emptyY;
- srcRect.w = width - fullWidth;
- destRect.x = position.X() + fullWidth;
SDL_BlitSurface(surface, &srcRect, dest, &destRect);
}