/** ** Draw additional informations of a unit. ** ** @param unit Unit pointer of drawn unit. ** @param type Unit-type pointer. ** @param x X screen pixel position of unit. ** @param y Y screen pixel position of unit. ** ** @todo FIXME: The different styles should become a function call. */ static void DrawInformations(const CUnit &unit, const CUnitType *type, int x, int y) { const CUnitStats *stats; int r; #if 0 && DEBUG // This is for showing vis counts and refs. char buf[10]; sprintf(buf, "%d%c%c%d", unit.VisCount[ThisPlayer->Index], unit.Seen.ByPlayer & (1 << ThisPlayer->Index) ? 'Y' : 'N', unit.Seen.Destroyed & (1 << ThisPlayer->Index) ? 'Y' : 'N', unit.Refs); VideoDrawTextClip(x + 10, y + 10, 1, buf); #endif stats = unit.Stats; // // For debug draw sight, react and attack range! // if (NumSelected == 1 && unit.Selected) { if (Preference.ShowSightRange) { // Radius -1 so you can see all ranges Video.DrawCircleClip(ColorGreen, x + type->TileWidth * TileSizeX / 2, y + type->TileHeight * TileSizeY / 2, ((stats->Variables[SIGHTRANGE_INDEX].Max + (type->TileWidth - 1)) * TileSizeX) - 1); } if (type->CanAttack) { if (Preference.ShowReactionRange) { r = (unit.Player->Type == PlayerPerson) ? type->ReactRangePerson : type->ReactRangeComputer; if (r) { Video.DrawCircleClip(ColorBlue, x + type->TileWidth * TileSizeX / 2, y + type->TileHeight * TileSizeY / 2, (r + (type->TileWidth - 1)) * TileSizeX); } } if (Preference.ShowAttackRange && stats->Variables[ATTACKRANGE_INDEX].Max) { // Radius + 1 so you can see all ranges Video.DrawCircleClip(ColorRed, x + type->TileWidth * TileSizeX / 2, y + type->TileHeight * TileSizeY / 2, (stats->Variables[ATTACKRANGE_INDEX].Max + (type->TileWidth - 1)) * TileSizeX + 1); } } } // FIXME: johns: ugly check here, should be removed! if (unit.CurrentAction() != UnitActionDie && unit.IsVisible(ThisPlayer)) { DrawDecoration(unit, type, x, y); } }
/** ** Draw additional informations of a unit. ** ** @param unit Unit pointer of drawn unit. ** @param type Unit-type pointer. ** @param screenPos screen pixel (top left) position of unit. ** ** @todo FIXME: The different styles should become a function call. */ static void DrawInformations(const CUnit &unit, const CUnitType &type, const PixelPos &screenPos) { #if 0 && DEBUG // This is for showing vis counts and refs. char buf[10]; sprintf(buf, "%d%c%c%d", unit.VisCount[ThisPlayer->Index], unit.Seen.ByPlayer & (1 << ThisPlayer->Index) ? 'Y' : 'N', unit.Seen.Destroyed & (1 << ThisPlayer->Index) ? 'Y' : 'N', unit.Refs); CLabel(GetSmallFont()).Draw(screenPos.x + 10, screenPos.y + 10, buf); #endif const CUnitStats &stats = *unit.Stats; // For debug draw sight, react and attack range! if (IsOnlySelected(unit)) { const PixelPos center(screenPos + type.GetPixelSize() / 2); if (Preference.ShowSightRange) { const int value = stats.Variables[SIGHTRANGE_INDEX].Max; const int radius = value * PixelTileSize.x + (type.TileWidth - 1) * PixelTileSize.x / 2; if (value) { // Radius -1 so you can see all ranges Video.DrawCircleClip(ColorGreen, center.x, center.y, radius - 1); } } if (type.CanAttack) { if (Preference.ShowReactionRange) { const int value = (unit.Player->Type == PlayerPerson) ? type.ReactRangePerson : type.ReactRangeComputer; const int radius = value * PixelTileSize.x + (type.TileWidth - 1) * PixelTileSize.x / 2; if (value) { Video.DrawCircleClip(ColorBlue, center.x, center.y, radius); } } if (Preference.ShowAttackRange) { const int value = stats.Variables[ATTACKRANGE_INDEX].Max; const int radius = value * PixelTileSize.x + (type.TileWidth - 1) * PixelTileSize.x / 2; if (value) { // Radius +1 so you can see all ranges Video.DrawCircleClip(ColorGreen, center.x, center.y, radius - 1); } } } } // FIXME: johns: ugly check here, should be removed! if (unit.CurrentAction() != UnitActionDie && (unit.IsVisible(*ThisPlayer) || ReplayRevealMap)) { DrawDecoration(unit, type, screenPos); } }
/** ** Draw unit on map. ** ** @param unit Pointer to the unit. */ local void DrawUnit(Unit* unit) { int x; int y; int r; UnitType* type; UnitStats* stats; type=unit->Type; x=Map2ScreenX(unit->X)+unit->IX; y=Map2ScreenY(unit->Y)+unit->IY; if( type->UnitType==UnitTypeFly ) { DrawShadow(unit,type,x,y); } DrawSelectionRectangle(unit,type,x,y); PlayerPixels(unit->Player); DrawUnitType(type,unit->Frame,x,y); stats=unit->Stats; // // For debug draw sight, react and attack range! // if( NumSelected==1 && unit->Selected ) { if( ShowSightRange ) { DrawRectangle(ColorGreen ,x+TileSizeX/2-stats->SightRange*TileSizeX ,y+TileSizeY/2-stats->SightRange*TileSizeY ,stats->SightRange*TileSizeX*2 ,stats->SightRange*TileSizeY*2); } if( type->CanAttack ) { if( ShowReactRange ) { r= (unit->Player->Type==PlayerHuman) ? type->ReactRangeHuman : type->ReactRangeComputer; if( r ) { DrawRectangle(ColorBlue ,x+TileSizeX/2-r*TileSizeX ,y+TileSizeY/2-r*TileSizeY ,r*TileSizeX*2 ,r*TileSizeY*2); } } if( ShowAttackRange && stats->AttackRange ) { DrawRectangle(ColorRed ,x+TileSizeX/2-stats->AttackRange*TileSizeX ,y+TileSizeY/2-stats->AttackRange*TileSizeY ,stats->AttackRange*TileSizeX*2 ,stats->AttackRange*TileSizeY*2); } } } // // For debug draw destination. FIXME: should become orders // if( ShowOrders && unit->Selected && (KeyModifiers&ModifierShift)) { DrawPath(unit); } // FIXME: johns: ugly check here should be removed! if( unit->Command.Action!=UnitActionDie ) { DrawDecoration(unit,type,x,y); } }
/** ** Draw building on map. ** ** @param unit Pointer to the building */ local void DrawBuilding(Unit* unit) { int x; int y; UnitType* type; int frame; int n_frame; // FIXME: This should I rewrite, without checks here!! type=unit->Type; x = unit->X; y = unit->Y; // FIXME: johns: this isn't 100% correct, building which are partly // FIXME: johns: under the fog are shown partly. // FIXME: There is already a check in the main loop UnitVisibile! if ( !MAPEXPLORED( x, y ) ) { return; } if ( !TheMap.NoFogOfWar && !MAPVISIBLE( x, y ) ) { frame = unit->SeenFrame; if (frame == 255) { return; } } else { frame = unit->SeenFrame = unit->Frame; } #if 0 if( type->Type==UnitOilPlatformHuman || type->Type==UnitOilPlatformOrc ) { DebugLevel0("%d -> %d\n",unit->Frame,frame); } #endif n_frame = 0; if ((frame & 128) == 0 && unit->Rs > 50) { n_frame = 128; // fancy buildings } PlayerPixels(unit->Player); x=Map2ScreenX(unit->X)+unit->IX; y=Map2ScreenY(unit->Y)+unit->IY; // // Buildings under construction/upgrade/ready. // if( unit->Command.Action==UnitActionBuilded ) { if( unit->Constructed || type->RleSprite->NumFrames<=1 ) { DrawConstruction(type->OverlapFrame ,frame ,x+(type->TileWidth*TileSizeX)/2 ,y+(type->TileHeight*TileSizeY)/2); } else { #if 0 DebugLevel0("Remove this %d\n",n_frame); if ( strcmp(type->Ident,"dark-portal") == 0 || strcmp(type->Ident,"runestone") == 0 ) //FIXME: dark-portal and runestone haven't reqiured frames, so we draw construction instead DrawConstruction(type->OverlapFrame ,frame ,x+(type->TileWidth*TileSizeX)/2 ,y+(type->TileHeight*TileSizeY)/2); else #endif DrawUnitType(type,frame+n_frame,x,y); } } else if( unit->Command.Action==UnitActionUpgradeTo ) { DrawUnitType(unit->Command.Data.UpgradeTo.What,1+n_frame,x,y); } else { DrawUnitType(type,frame+n_frame,x,y); } // FIXME: johns: ugly check here should be removed! if( unit->Command.Action!=UnitActionDie ) { DrawDecoration(unit,type,x,y); DrawSelectionRectangle(unit,type,x,y); } }