mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
134 lines
4.8 KiB
Python
134 lines
4.8 KiB
Python
from typing import List, Optional
|
|
|
|
from PySide2.QtCore import QRect
|
|
from PySide2.QtGui import QBrush
|
|
from PySide2.QtWidgets import QGraphicsItem
|
|
|
|
import qt_ui.uiconstants as const
|
|
from game import Game
|
|
from game.data.building_data import FORTIFICATION_BUILDINGS
|
|
from game.db import REWARDS
|
|
from game.theater import ControlPoint, TheaterGroundObject
|
|
from game.theater.theatergroundobject import MissileSiteGroundObject
|
|
from qt_ui.windows.groundobject.QGroundObjectMenu import QGroundObjectMenu
|
|
from .QMapObject import QMapObject
|
|
from ...displayoptions import DisplayOptions
|
|
|
|
|
|
class QMapGroundObject(QMapObject):
|
|
def __init__(self, parent, x: float, y: float, w: float, h: float,
|
|
control_point: ControlPoint,
|
|
ground_object: TheaterGroundObject, game: Game,
|
|
buildings: Optional[List[TheaterGroundObject]] = None) -> None:
|
|
super().__init__(x, y, w, h, mission_target=ground_object)
|
|
self.ground_object = ground_object
|
|
self.control_point = control_point
|
|
self.parent = parent
|
|
self.game = game
|
|
self.setZValue(2)
|
|
self.buildings = buildings if buildings is not None else []
|
|
self.setFlag(QGraphicsItem.ItemIgnoresTransformations, False)
|
|
self.ground_object_dialog: Optional[QGroundObjectMenu] = None
|
|
self.setToolTip(self.tooltip)
|
|
|
|
@property
|
|
def tooltip(self) -> str:
|
|
lines = [
|
|
f"[{self.ground_object.obj_name}]",
|
|
f"${self.production_per_turn} per turn",
|
|
]
|
|
if self.ground_object.groups:
|
|
units = {}
|
|
for g in self.ground_object.groups:
|
|
for u in g.units:
|
|
if u.type in units:
|
|
units[u.type] = units[u.type]+1
|
|
else:
|
|
units[u.type] = 1
|
|
|
|
for unit in units.keys():
|
|
lines.append(f"{unit} x {units[unit]}")
|
|
else:
|
|
for building in self.buildings:
|
|
if not building.is_dead:
|
|
lines.append(f"{building.dcs_identifier}")
|
|
|
|
return "\n".join(lines)
|
|
|
|
@property
|
|
def production_per_turn(self) -> int:
|
|
production = 0
|
|
for g in self.control_point.ground_objects:
|
|
if g.category in REWARDS.keys():
|
|
production += REWARDS[g.category]
|
|
return production
|
|
|
|
def paint(self, painter, option, widget=None) -> None:
|
|
player_icons = "_blue"
|
|
enemy_icons = ""
|
|
|
|
if DisplayOptions.ground_objects:
|
|
painter.save()
|
|
|
|
cat = self.ground_object.category
|
|
if cat == "aa" and self.ground_object.sea_object:
|
|
cat = "ship"
|
|
if isinstance(self.ground_object, MissileSiteGroundObject):
|
|
cat = "missile"
|
|
|
|
rect = QRect(option.rect.x() + 2, option.rect.y(),
|
|
option.rect.width() - 2, option.rect.height())
|
|
|
|
is_dead = self.ground_object.is_dead
|
|
for building in self.buildings:
|
|
if not building.is_dead:
|
|
is_dead = False
|
|
break
|
|
|
|
if not is_dead and not self.control_point.captured:
|
|
painter.drawPixmap(rect, const.ICONS[cat + enemy_icons])
|
|
elif not is_dead:
|
|
painter.drawPixmap(rect, const.ICONS[cat + player_icons])
|
|
else:
|
|
painter.drawPixmap(rect, const.ICONS["destroyed"])
|
|
|
|
self.draw_health_gauge(painter, option)
|
|
painter.restore()
|
|
|
|
def draw_health_gauge(self, painter, option) -> None:
|
|
units_alive = 0
|
|
units_dead = 0
|
|
|
|
if len(self.ground_object.groups) == 0:
|
|
for building in self.buildings:
|
|
if building.dcs_identifier in FORTIFICATION_BUILDINGS:
|
|
continue
|
|
if building.is_dead:
|
|
units_dead += 1
|
|
else:
|
|
units_alive += 1
|
|
|
|
for g in self.ground_object.groups:
|
|
units_alive += len(g.units)
|
|
if hasattr(g, "units_losts"):
|
|
units_dead += len(g.units_losts)
|
|
|
|
if units_dead + units_alive > 0:
|
|
ratio = float(units_alive)/(float(units_dead) + float(units_alive))
|
|
bar_height = ratio * option.rect.height()
|
|
painter.fillRect(option.rect.x(), option.rect.y(), 2,
|
|
option.rect.height(),
|
|
QBrush(const.COLORS["dark_red"]))
|
|
painter.fillRect(option.rect.x(), option.rect.y(), 2, bar_height,
|
|
QBrush(const.COLORS["green"]))
|
|
|
|
def on_click(self) -> None:
|
|
self.ground_object_dialog = QGroundObjectMenu(
|
|
self.window(),
|
|
self.ground_object,
|
|
self.buildings,
|
|
self.control_point,
|
|
self.game
|
|
)
|
|
self.ground_object_dialog.show()
|