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