local Util = require 'core/appkit/lua/util'
local SimpleProject= require 'core/appkit/lua/simple_project'
Project.PlayerHud = Project.PlayerHud or {}
local PlayerHud = Project.PlayerHud
local Vector3 = stingray.Vector3
local Vector3Box = stingray.Vector3Box
local Keyboard = stingray.Keyboard
local hud_level = nil
--Array that holds the key IDs and the corresponding HUD data for Scaleform
local input_array = {
{id = "w", hud_id = "up"},
{id = "s", hud_id = "down"},
{id = "a", hud_id = "left"},
{id = "d", hud_id = "right"}
}
-- Scaleform is an engine plugin and is required for this file.
if scaleform == nil then
PlayerHud = { init_hud = function() end,
update = function() end,
shutdown = function() end,
exit_level = function() end,
get_motion_input = function() assert(false) end,
check_toggle_camera = function() return false end,
check_sprint = function() return false end,
check_jump = function() return false end,
check_fire = function() return false end,
check_aim = function() return false end,
check_crouch = function() return false end,
set_crosshair_visibility = function() end
}
return PlayerHud
end
function PlayerHud:on_custom_event(evt)
-- Ignore data that is not relevant
if type(evt.data) ~= "table" then return end
local action = self.actions[evt.data.action]
if action then action(evt) end
end
function PlayerHud:init_hud()
--Used for mobile hud controls but it simplifies the logic in player if they're always available.
self.input = {
pan = Vector3Box(Vector3(0, 0, 0)),
move = Vector3Box(Vector3(0, 0, 0)),
jump = false,
toggle_camera = false,
sprint = false,
exit_level = false,
fire = false,
aim = false,
crouch = false
}
self.actions = {
jump = function()
self.input.jump = true
end,
walk = function(evt)
local move = Vector3(evt.data.x, -evt.data.y, 0)
self.input.move:store(Vector3.normalize(move))
end,
look = function(evt)
local pan = Vector3(evt.data.x, evt.data.y, 0)
self.input.pan:store(4 * Vector3.normalize(pan))
end,
start_sprint = function()
self.input.sprint = true
local move = Vector3(0, 1, 0)
self.input.move:store(Vector3.normalize(move))
end,
stop_sprint = function()
local move = Vector3(0, 0, 0)
self.input.move:store(Vector3.normalize(move))
self.input.sprint = false
end,
toggle_camera = function()
self.input.toggle_camera = not self.input.toggle_camera
end,
exit_level = function()
self.input.exit_level = true
end,
fire = function()
self.input.fire = true
end,
aim = function()
self.input.aim = not self.input.aim
end,
toggle_crouch = function()
self.input.crouch = not self.input.crouch
end
}
--On PC show only the dpad hud.
if Util.is_pc() then
local current_level = SimpleProject.level
scaleform.Stingray.load_project_and_scene("content/ui/template_hud.s2d/template_hud");
hud_level = current_level
end
--On Touch devices display touch specific hud
if Util.use_touch() then
local current_level = SimpleProject.level
scaleform.Stingray.load_project_and_scene("content/ui/character_mobile_hud.s2d/character_mobile_hud");
hud_level = current_level
--Register a custom listener to check for different controls
local custom_listener = PlayerHud.custom_listener
custom_listener = scaleform.EventListener.create(custom_listener, function (e) PlayerHud.on_custom_event(PlayerHud,e) end)
PlayerHud.custom_listener = custom_listener
scaleform.EventListener.connect(custom_listener, scaleform.EventTypes.Custom)
end
-- On consoles we just show the cross hair
if Util.is_console() then
local current_level = SimpleProject.level
scaleform.Stingray.load_project_and_scene("content/ui/console_hud.s2d/console_hud");
hud_level = current_level
end
end
function PlayerHud:shutdown(level)
if scaleform then
scaleform.Stingray.unload_project();
if Util.use_touch() then
PlayerHud.custom_listener = nil
end
hud_level = nil
end
end
local function handle_key(id, hud_id)
local event = {
eventId = scaleform.EventTypes.Custom,
name = nil,
data = nil
}
if Keyboard.pressed(Keyboard.button_id(id)) then
event.name = "keypressed"
event.data = hud_id
elseif Keyboard.released(Keyboard.button_id(id)) then
event.name = "keyreleased"
event.data = hud_id
end
if event.name and event.data then
scaleform.Stage.dispatch_event(event)
end
end
local function update_pc_hud()
--Iterate through the array of keys
local array_index = 1
while input_array[array_index] do
local input = input_array[array_index]
handle_key(input.id, input.hud_id)
array_index = array_index + 1
end
end
function PlayerHud:update(dt)
if Util.is_pc() then
update_pc_hud()
end
end
--Implement handlers for touch controls to override appkit input_mapper and project specific controls.
function PlayerHud:get_motion_input()
local input = self.input
return {move = input.move:unbox(), pan = input.pan:unbox()}
end
function PlayerHud:check_toggle_camera()
local ret = self.input.toggle_camera
self.input.toggle_camera = false
return ret
end
function PlayerHud:check_sprint()
return self.input.sprint
end
function PlayerHud:check_jump()
local ret = self.input.jump
self.input.jump = false
return ret
end
function PlayerHud:exit_level()
local ret = self.input.exit_level
self.input.exit_level = false
return ret
end
function PlayerHud:check_fire()
local ret = self.input.fire
self.input.fire = false
return ret
end
function PlayerHud:check_aim()
return self.input.aim
end
function PlayerHud:check_crouch()
return self.input.crouch
end
--Function for setting crosshair visibility
function PlayerHud:set_crosshair_visibility(is_visible)
local event = {
eventId = scaleform.EventTypes.Custom,
name = "crosshair_handle",
data = is_visible
}
if event.name then
scaleform.Stage.dispatch_event(event)
end
end
return PlayerHud