1-- Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details 2-- Licensed under the terms of the GPL v3. See licenses/GPL-3.txt 3 4local Engine = require 'Engine' 5local Game = require 'Game' 6local utils = require 'utils' 7local Event = require 'Event' 8 9local Lang = require 'Lang' 10local lc = Lang.GetResource("core"); 11local lui = Lang.GetResource("ui-core"); 12local lec = Lang.GetResource("equipment-core"); 13 14local ui = require 'pigui' 15 16local player = nil 17local colors = ui.theme.colors 18local icons = ui.theme.icons 19 20local mainIconSize = Vector2(32,32) * (ui.screenHeight / 1200) 21local mainWideIconSize = Vector2(64,32) * (ui.screenHeight / 1200) 22local mainForegroundColor = colors.reticuleCircle 23local mainBackgroundColor = colors.lightBlueBackground 24local mainHoverColor = colors.lightBlueBackground:tint(0.2) 25local mainPressedColor = colors.lightBlueBackground:tint(0.5) 26local mainButtonPadding = 3 27local function iconButton(leftupper, icon, is_wide, icon_size, text, is_disabled, bg_color, fg_color, hover_color, pressed_color, tooltip) 28 local textsize = ui.calcTextSize(text) 29 local x = icon_size.x + textsize.x + mainButtonPadding * 2 30 local y = math.max(icon_size.y, textsize.y) -- + mainButtonPadding * 2 31 local delta = Vector2(x, y) 32 local clicked = false 33 if is_disabled then 34 bg_color = colors.grey 35 end 36 if ui.isMouseHoveringRect(leftupper, leftupper + delta) and not ui.isAnyWindowHovered() then 37 if not is_disabled then 38 if ui.isMouseDown(0) then 39 bg_color = pressed_color 40 else 41 bg_color = hover_color 42 end 43 if ui.isMouseReleased(0) then 44 clicked = true 45 end 46 end 47 ui.setTooltip(tooltip) 48 end 49 ui.addRectFilled(leftupper, leftupper + delta, bg_color, 0.1, 15) 50 if is_wide then 51 ui.addWideIcon(leftupper + Vector2(mainButtonPadding, mainButtonPadding), icon, fg_color, icon_size, ui.anchor.left, ui.anchor.top) 52 else 53 ui.addIcon(leftupper + Vector2(mainButtonPadding, mainButtonPadding), icon, fg_color, icon_size, ui.anchor.left, ui.anchor.top) 54 end 55 ui.addText(leftupper + Vector2(icon_size.x + mainButtonPadding, (icon_size.y - textsize.y)/2), fg_color, text) -- + mainButtonPadding 56 return delta, clicked 57end 58 59local function displayECM(uiPos) 60 player = Game.player 61 local current_view = Game.CurrentView() 62 if current_view == "world" then 63 local ecms = player:GetEquip('ecm') 64 for i,ecm in ipairs(ecms) do 65 local size, clicked = iconButton(uiPos, icons[ecm.ecm_type], false, mainIconSize, "ECM", not player:IsECMReady(), mainBackgroundColor, mainForegroundColor, mainHoverColor, mainPressedColor, 'ECM') 66 uiPos.y = uiPos.y + size.y + 10 67 if clicked then 68 player:UseECM() 69 end 70 end 71 end 72 return uiPos 73end 74 75local function displayBodyScanner(uiPos) 76 player = Game.player 77 local current_view = Game.CurrentView() 78 if current_view == "world" then 79 local sensors = player:GetEquip('sensor') 80 for i,sensor in ipairs(sensors) do 81 local size,clicked = iconButton(uiPos, icons.scanner, false, mainIconSize, sensor:GetName(), false, mainBackgroundColor, mainForegroundColor, mainHoverColor, mainPressedColor, 'Body scanner') 82 uiPos.y = uiPos.y + size.y + 10 83 if clicked then 84 player:StartSensor(i) 85 -- or StopSensor(i) 86 end 87 end 88 end 89 return uiPos 90end 91 92local function getMissileIcon(missile) 93 if icons[missile.missile_type] then 94 return icons[missile.missile_type] 95 else 96 print("no icon for missile " .. missile.missile_type) 97 return icons.bullseye 98 end 99end 100 101local function fireMissile(index) 102 if not player:GetCombatTarget() then 103 Game.AddCommsLogLine(lc.SELECT_A_TARGET, "", 1) 104 else 105 player:FireMissileAt(index, player:GetCombatTarget()) 106 end 107end 108 109local function displayMissiles(uiPos) 110 player = Game.player 111 local current_view = Game.CurrentView() 112 if current_view == "world" then 113 local missiles = player:GetEquip('missile') 114 local count = {} 115 local types = {} 116 local index = {} 117 for i,missile in ipairs(missiles) do 118 count[missile.missile_type] = (count[missile.missile_type] or 0) + 1 119 types[missile.missile_type] = missile 120 index[missile.missile_type] = i 121 end 122 for t,missile in pairs(types) do 123 local c = count[t] 124 local size,clicked = iconButton(uiPos, getMissileIcon(missile), true, mainWideIconSize, c, c == 0, mainBackgroundColor, mainForegroundColor, mainHoverColor, mainPressedColor, lec[missile.l10n_key]) 125 uiPos.y = uiPos.y + size.y + 10 126 if clicked then 127 print("firing missile " .. t .. ", " .. index[t]) 128 fireMissile(index[t]) 129 end 130 end 131 end 132 return uiPos 133end 134 135local function displayEquipment() 136 if ui.optionsWindow.isOpen then return end 137 local uiPos = Vector2(15, ui.screenHeight / 3 + 10) 138 uiPos = displayMissiles(uiPos) 139 uiPos = displayECM(uiPos + Vector2(0, 10)) 140 uiPos = displayBodyScanner(uiPos + Vector2(0, 10)) 141end 142 143ui.registerModule("game", displayEquipment) 144 145return {} 146