/** ** Draw transporting units */ static void DrawTransportingUnits(const CUnit *unit) { const CUnit *insideUnit = unit->UnitInside; int currentButton = 0; for (int i = 0; i < unit->InsideCount; ++i, insideUnit = insideUnit->NextContained) { if (insideUnit->Boarded && currentButton < (int)UI.TransportingButtons.size()) { CUIButton *button = &UI.TransportingButtons[currentButton]; bool mouseOver = (ButtonAreaUnderCursor == ButtonAreaTransporting && ButtonUnderCursor == currentButton); insideUnit->Type->Icon.Icon->DrawUnitIcon(unit->Player, button->Style, mouseOver ? (IconActive | (MouseButtons & LeftButton)) : 0, button->X, button->Y, ""); UiDrawLifeBar(insideUnit, button->X, button->Y); if (insideUnit->Type->CanCastSpell && insideUnit->Variable[MANA_INDEX].Max) { UiDrawManaBar(insideUnit, button->X, button->Y); } if (mouseOver) { UI.StatusLine.Set(insideUnit->Type->Name); } ++currentButton; } } }
/** ** Draw info panel with more than one unit selected */ static void DrawInfoPanelMultipleSelected() { // Draw icons and a health bar for (int i = 0; i < std::min(NumSelected, (int)UI.SelectedButtons.size()); ++i) { CUIButton *button = &UI.SelectedButtons[i]; bool mouseOver = (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == i); Selected[i]->Type->Icon.Icon->DrawUnitIcon(ThisPlayer, button->Style, mouseOver ? (IconActive | (MouseButtons & LeftButton)) : 0, button->X, button->Y, ""); UiDrawLifeBar(Selected[i], button->X, button->Y); if (mouseOver) { UI.StatusLine.Set(Selected[i]->Type->Name); } } // Selected more than we can display if (NumSelected > (int)UI.SelectedButtons.size()) { std::ostringstream os; os << "+" << (unsigned)(NumSelected - UI.SelectedButtons.size()); VideoDrawText(UI.MaxSelectedTextX, UI.MaxSelectedTextY, UI.MaxSelectedFont, os.str()); } }
static void DrawUnitInfo_transporter(CUnit &unit) { CUnit *uins = unit.UnitInside; size_t j = 0; for (int i = 0; i < unit.InsideCount; ++i, uins = uins->NextContained) { if (!uins->Boarded || j >= UI.TransportingButtons.size()) { continue; } CIcon &icon = *uins->Type->Icon.Icon; int flag = (ButtonAreaUnderCursor == ButtonAreaTransporting && static_cast<size_t>(ButtonUnderCursor) == j) ? (IconActive | (MouseButtons & LeftButton)) : 0; const PixelPos pos(UI.TransportingButtons[j].X, UI.TransportingButtons[j].Y); icon.DrawUnitIcon(*UI.TransportingButtons[j].Style, flag, pos, "", uins->RescuedFrom ? GameSettings.Presets[uins->RescuedFrom->Index].PlayerColor : GameSettings.Presets[uins->Player->Index].PlayerColor); UiDrawLifeBar(*uins, pos.x, pos.y); if (uins->Type->CanCastSpell && uins->Variable[MANA_INDEX].Max) { UiDrawManaBar(*uins, pos.x, pos.y); } if (ButtonAreaUnderCursor == ButtonAreaTransporting && static_cast<size_t>(ButtonUnderCursor) == j) { UI.StatusLine.Set(uins->Type->Name); } ++j; } }
static void InfoPanel_draw_multiple_selection() { // If there are more units selected draw their pictures and a health bar DrawInfoPanelBackground(0); for (size_t i = 0; i != std::min(Selected.size(), UI.SelectedButtons.size()); ++i) { const CIcon &icon = *Selected[i]->Type->Icon.Icon; const PixelPos pos(UI.SelectedButtons[i].X, UI.SelectedButtons[i].Y); icon.DrawUnitIcon(*UI.SelectedButtons[i].Style, (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == (int)i) ? (IconActive | (MouseButtons & LeftButton)) : 0, pos, "", Selected[i]->RescuedFrom ? GameSettings.Presets[Selected[i]->RescuedFrom->Index].PlayerColor : GameSettings.Presets[Selected[i]->Player->Index].PlayerColor); UiDrawLifeBar(*Selected[i], UI.SelectedButtons[i].X, UI.SelectedButtons[i].Y); if (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == (int) i) { UI.StatusLine.Set(Selected[i]->Type->Name); } } if (Selected.size() > UI.SelectedButtons.size()) { char buf[5]; sprintf(buf, "+%lu", (long unsigned int)(Selected.size() - UI.SelectedButtons.size())); CLabel(*UI.MaxSelectedFont).Draw(UI.MaxSelectedTextX, UI.MaxSelectedTextY, buf); } }
static void InfoPanel_draw_multiple_selection() { // If there are more units selected draw their pictures and a health bar DrawInfoPanelBackground(0); for (size_t i = 0; i != std::min(Selected.size(), UI.SelectedButtons.size()); ++i) { const CIcon &icon = *Selected[i]->Type->Icon.Icon; const PixelPos pos(UI.SelectedButtons[i].X, UI.SelectedButtons[i].Y); //Wyrmgus start // icon.DrawUnitIcon(*UI.SelectedButtons[i].Style, Selected[i]->GetIcon().Icon->DrawUnitIcon(*UI.SelectedButtons[i].Style, //Wyrmgus end (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == (int)i) ? (IconActive | (MouseButtons & LeftButton)) : 0, pos, "", Selected[i]->RescuedFrom ? Selected[i]->RescuedFrom->Index : Selected[i]->Player->Index); UiDrawLifeBar(*Selected[i], UI.SelectedButtons[i].X, UI.SelectedButtons[i].Y); if (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == (int) i) { //Wyrmgus start // UI.StatusLine.Set(Selected[i]->Type->Name); if (!Preference.NoStatusLineTooltips) { UI.StatusLine.Set(Selected[i]->GetMessageName()); } DrawGenericPopup(Selected[i]->GetMessageName(), UI.SelectedButtons[i].X, UI.SelectedButtons[i].Y); //Wyrmgus end } } if (Selected.size() > UI.SelectedButtons.size()) { char buf[5]; sprintf(buf, "+%lu", (long unsigned int)(Selected.size() - UI.SelectedButtons.size())); CLabel(*UI.MaxSelectedFont).Draw(UI.MaxSelectedTextX, UI.MaxSelectedTextY, buf); } }
static void DrawUnitInfo_transporter(CUnit &unit) { CUnit *uins = unit.UnitInside; size_t j = 0; for (int i = 0; i < unit.InsideCount; ++i, uins = uins->NextContained) { //Wyrmgus start // if (!uins->Boarded || j >= UI.TransportingButtons.size()) { if (!uins->Boarded || j >= UI.TransportingButtons.size() || (unit.Player != ThisPlayer && uins->Player != ThisPlayer)) { //Wyrmgus end continue; } CIcon &icon = *uins->Type->Icon.Icon; int flag = (ButtonAreaUnderCursor == ButtonAreaTransporting && static_cast<size_t>(ButtonUnderCursor) == j) ? (IconActive | (MouseButtons & LeftButton)) : 0; const PixelPos pos(UI.TransportingButtons[j].X, UI.TransportingButtons[j].Y); //Wyrmgus start // icon.DrawUnitIcon(*UI.TransportingButtons[j].Style, flag, pos, "", uins->RescuedFrom ? uins->RescuedFrom->Index : uins->Player->Index); uins->GetIcon().Icon->DrawUnitIcon(*UI.TransportingButtons[j].Style, flag, pos, "", uins->RescuedFrom ? uins->RescuedFrom->Index : uins->Player->Index); //Wyrmgus end UiDrawLifeBar(*uins, pos.x, pos.y); //Wyrmgus start // if (uins->Type->CanCastSpell && uins->Variable[MANA_INDEX].Max) { if (uins->Type->CanCastSpell && uins->Variable[MANA_INDEX].Enable && uins->Variable[MANA_INDEX].Max) { //Wyrmgus end //Wyrmgus start // UiDrawManaBar(*uins, pos.x, pos.y); // don't draw the mana bar when within transporters, as there's not enough space for it //Wyrmgus end } if (ButtonAreaUnderCursor == ButtonAreaTransporting && static_cast<size_t>(ButtonUnderCursor) == j) { //Wyrmgus start // UI.StatusLine.Set(uins->Type->Name); if (!Preference.NoStatusLineTooltips) { UI.StatusLine.Set(uins->GetMessageName()); } //Wyrmgus end } ++j; } }
/** ** Draw the unit info into top-panel. ** ** @param unit Pointer to unit. */ static void DrawUnitInfo(CUnit *unit) { int i; CUnitType *type; const CUnitStats *stats; int x; int y; CUnit *uins; Assert(unit); UpdateUnitVariables(unit); for (i = 0; i < (int)UI.InfoPanelContents.size(); ++i) { if (CanShowContent(UI.InfoPanelContents[i]->Condition, unit)) { for (std::vector<CContentType *>::const_iterator content = UI.InfoPanelContents[i]->Contents.begin(); content != UI.InfoPanelContents[i]->Contents.end(); ++content) { if (CanShowContent((*content)->Condition, unit)) { (*content)->Draw(unit, UI.InfoPanelContents[i]->DefaultFont); } } } } type = unit->Type; stats = unit->Stats; Assert(type); Assert(stats); // Draw IconUnit #ifdef USE_MNG if (type->Portrait.Num) { type->Portrait.Mngs[type->Portrait.CurrMng]->Draw( UI.SingleSelectedButton->X, UI.SingleSelectedButton->Y); if (type->Portrait.Mngs[type->Portrait.CurrMng]->iteration == type->Portrait.NumIterations) { type->Portrait.Mngs[type->Portrait.CurrMng]->Reset(); // FIXME: should be configurable if (type->Portrait.CurrMng == 0) { type->Portrait.CurrMng = (SyncRand() % (type->Portrait.Num - 1)) + 1; type->Portrait.NumIterations = 1; } else { type->Portrait.CurrMng = 0; type->Portrait.NumIterations = SyncRand() % 16 + 1; } } } else #endif if (UI.SingleSelectedButton) { x = UI.SingleSelectedButton->X; y = UI.SingleSelectedButton->Y; type->Icon.Icon->DrawUnitIcon(unit->Player, UI.SingleSelectedButton->Style, (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == 0) ? (IconActive | (MouseButtons & LeftButton)) : 0, x, y, ""); } x = UI.InfoPanel.X; y = UI.InfoPanel.Y; // // Show progress if they are selected. // if (NumSelected == 1 && Selected[0] == unit) { // // Building training units. // if (unit->Orders[0]->Action == UnitActionTrain) { if (unit->OrderCount == 1 || unit->Orders[1]->Action != UnitActionTrain) { if (!UI.SingleTrainingText.empty()) { VideoDrawText(UI.SingleTrainingTextX, UI.SingleTrainingTextY, UI.SingleTrainingFont, UI.SingleTrainingText); } if (UI.SingleTrainingButton) { unit->Orders[0]->Type->Icon.Icon->DrawUnitIcon(unit->Player, UI.SingleTrainingButton->Style, (ButtonAreaUnderCursor == ButtonAreaTraining && ButtonUnderCursor == 0) ? (IconActive | (MouseButtons & LeftButton)) : 0, UI.SingleTrainingButton->X, UI.SingleTrainingButton->Y, ""); } } else { if (!UI.TrainingText.empty()) { VideoDrawTextCentered(UI.TrainingTextX, UI.TrainingTextY, UI.TrainingFont, UI.TrainingText); } if (!UI.TrainingButtons.empty()) { for (i = 0; i < unit->OrderCount && i < (int)UI.TrainingButtons.size(); ++i) { if (unit->Orders[i]->Action == UnitActionTrain) { unit->Orders[i]->Type->Icon.Icon->DrawUnitIcon(unit->Player, UI.TrainingButtons[i].Style, (ButtonAreaUnderCursor == ButtonAreaTraining && ButtonUnderCursor == i) ? (IconActive | (MouseButtons & LeftButton)) : 0, UI.TrainingButtons[i].X, UI.TrainingButtons[i].Y, ""); } } } } return; } // // Building upgrading to better type. // if (unit->Orders[0]->Action == UnitActionUpgradeTo) { if (UI.UpgradingButton) { unit->Orders[0]->Type->Icon.Icon->DrawUnitIcon(unit->Player, UI.UpgradingButton->Style, (ButtonAreaUnderCursor == ButtonAreaUpgrading && ButtonUnderCursor == 0) ? (IconActive | (MouseButtons & LeftButton)) : 0, UI.UpgradingButton->X, UI.UpgradingButton->Y, ""); } return; } // // Building research new technology. // if (unit->Orders[0]->Action == UnitActionResearch) { if (UI.ResearchingButton) { unit->Data.Research.Upgrade->Icon->DrawUnitIcon(unit->Player, UI.ResearchingButton->Style, (ButtonAreaUnderCursor == ButtonAreaResearching && ButtonUnderCursor == 0) ? (IconActive | (MouseButtons & LeftButton)) : 0, UI.ResearchingButton->X, UI.ResearchingButton->Y, ""); } return; } } // // Transporting units. // if (type->CanTransport && unit->BoardCount) { int j; uins = unit->UnitInside; for (i = j = 0; i < unit->InsideCount; ++i, uins = uins->NextContained) { if (uins->Boarded && j < (int)UI.TransportingButtons.size()) { uins->Type->Icon.Icon->DrawUnitIcon(unit->Player, UI.TransportingButtons[j].Style, (ButtonAreaUnderCursor == ButtonAreaTransporting && ButtonUnderCursor == j) ? (IconActive | (MouseButtons & LeftButton)) : 0, UI.TransportingButtons[j].X, UI.TransportingButtons[j].Y, ""); UiDrawLifeBar(uins, UI.TransportingButtons[j].X, UI.TransportingButtons[j].Y); if (uins->Type->CanCastSpell && uins->Variable[MANA_INDEX].Max) { UiDrawManaBar(uins, UI.TransportingButtons[j].X, UI.TransportingButtons[j].Y); } if (ButtonAreaUnderCursor == ButtonAreaTransporting && ButtonUnderCursor == j) { UI.StatusLine.Set(uins->Type->Name); } ++j; } } return; } }
/** ** Draw info panel. ** ** Panel: ** neutral - neutral or opponent ** normal - not 1,3,4 ** magic unit - magic units ** construction - under construction */ void CInfoPanel::Draw(void) { int i; if (NumSelected) { if (NumSelected > 1) { // // If there are more units selected draw their pictures and a health bar // DrawInfoPanelBackground(0); for (i = 0; i < (NumSelected > (int)UI.SelectedButtons.size() ? (int)UI.SelectedButtons.size() : NumSelected); ++i) { Selected[i]->Type->Icon.Icon->DrawUnitIcon(ThisPlayer, UI.SelectedButtons[i].Style, (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == i) ? (IconActive | (MouseButtons & LeftButton)) : 0, UI.SelectedButtons[i].X, UI.SelectedButtons[i].Y, ""); UiDrawLifeBar(Selected[i], UI.SelectedButtons[i].X, UI.SelectedButtons[i].Y); if (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == i) { UI.StatusLine.Set(Selected[i]->Type->Name); } } if (NumSelected > (int)UI.SelectedButtons.size()) { char buf[5]; sprintf(buf, "+%u", static_cast<unsigned int> (NumSelected - UI.SelectedButtons.size())); VideoDrawText(UI.MaxSelectedTextX, UI.MaxSelectedTextY, UI.MaxSelectedFont, buf); } return; } else { // FIXME: not correct for enemy's units if (Selected[0]->Player == ThisPlayer || ThisPlayer->IsTeamed(Selected[0]) || ThisPlayer->IsAllied(Selected[0]) || ReplayRevealMap) { if (Selected[0]->Orders[0]->Action == UnitActionBuilt || Selected[0]->Orders[0]->Action == UnitActionResearch || Selected[0]->Orders[0]->Action == UnitActionUpgradeTo || Selected[0]->Orders[0]->Action == UnitActionTrain) { i = 3; } else if (Selected[0]->Stats->Variables[MANA_INDEX].Max) { i = 2; } else { i = 1; } } else { i = 0; } DrawInfoPanelBackground(i); DrawUnitInfo(Selected[0]); if (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == 0) { UI.StatusLine.Set(Selected[0]->Type->Name); } return; } } // Nothing selected DrawInfoPanelBackground(0); if (UnitUnderCursor && UnitUnderCursor->IsVisible(ThisPlayer)) { // FIXME: not correct for enemies units DrawUnitInfo(UnitUnderCursor); } else { int x; int y; std::string nc; std::string rc; // FIXME: need some cool ideas for this. x = UI.InfoPanel.X + 16; y = UI.InfoPanel.Y + 8; VideoDrawText(x, y, GameFont, "Stratagus"); y += 16; VideoDrawText(x, y, GameFont, "Cycle:"); VideoDrawNumber(x + 48, y, GameFont, GameCycle); VideoDrawNumber(x + 110, y, GameFont, CYCLES_PER_SECOND * VideoSyncSpeed / 100); y += 20; GetDefaultTextColors(nc, rc); for (i = 0; i < PlayerMax - 1; ++i) { if (Players[i].Type != PlayerNobody) { if (ThisPlayer->Allied & (1 << Players[i].Index)) { SetDefaultTextColors(FontGreen, rc); } else if (ThisPlayer->Enemy & (1 << Players[i].Index)) { SetDefaultTextColors(FontRed, rc); } else { SetDefaultTextColors(nc, rc); } VideoDrawNumber(x + 15, y, GameFont, i); Video.DrawRectangle(ColorWhite,x, y, 12, 12); Video.FillRectangle(Players[i].Color, x + 1, y + 1, 10, 10); VideoDrawText(x + 27, y, GameFont,Players[i].Name); VideoDrawNumber(x + 117, y, GameFont,Players[i].Score); y += 14; } } SetDefaultTextColors(nc, rc); } }
/** ** Draw the unit info in the info panel. ** Called when a single unit is selected or the mouse hovers over a unit. ** ** @param unit Pointer to unit. */ static void DrawUnitInfo(CUnit *unit) { int x = UI.InfoPanel.X; int y = UI.InfoPanel.Y; bool isEnemy = unit->IsEnemy(ThisPlayer); bool isNeutral = (unit->Player->Type == PlayerNeutral); UpdateUnitVariables(unit); // Draw icon and life bar if (UI.SingleSelectedButton) { CUIButton *button = UI.SingleSelectedButton; bool mouseOver = (ButtonAreaUnderCursor == ButtonAreaSelected && ButtonUnderCursor == 0); unit->Type->Icon.Icon->DrawUnitIcon(unit->Player, button->Style, mouseOver ? (IconActive | (MouseButtons & LeftButton)) : 0, button->X, button->Y, ""); if (!isNeutral) { UiDrawLifeBar(unit, button->X, button->Y); } } // Unit type name VideoDrawTextCentered(x + 114, y + 25, GameFont, unit->Type->Name); // Hit points if (!isEnemy && !isNeutral) { std::ostringstream os; os << unit->Variable[HP_INDEX].Value << "/" << unit->Variable[HP_INDEX].Max; VideoDrawTextCentered(x + 38, y + 62, SmallFont, os.str()); } // Resource amount if (unit->Type->CanHarvestFrom && isNeutral) { std::string resourceName; int amount = 0; for (int i = 0; i < MaxCosts; ++i) { if (unit->ResourcesHeld[i] != 0) { resourceName = _(DefaultDisplayResourceNames[i].c_str()); amount = unit->ResourcesHeld[i] / CYCLES_PER_SECOND; break; } } std::ostringstream os; os << resourceName << ": " << amount; VideoDrawTextCentered(x + 76, y + 86, GameFont, os.str()); } // // Show extra info if only one unit is selected. // if (NumSelected == 1 && Selected[0] == unit) { // Training units. if (!isEnemy && unit->Orders[0]->Action == UnitActionTrain) { DrawTrainingUnits(unit); return; } // Transporting units. if (!isEnemy && unit->Type->CanTransport && unit->BoardCount) { DrawTransportingUnits(unit); return; } // My unit stats if (!isEnemy && !isNeutral && unit->Orders[0]->Action != UnitActionBuilt) { DrawUnitStats(unit); } } }