<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hard-light.org/index.php?action=history&amp;feed=atom&amp;title=Script_-_Shield_Management</id>
	<title>Script - Shield Management - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hard-light.org/index.php?action=history&amp;feed=atom&amp;title=Script_-_Shield_Management"/>
	<link rel="alternate" type="text/html" href="https://wiki.hard-light.org/index.php?title=Script_-_Shield_Management&amp;action=history"/>
	<updated>2026-11-15T10:25:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.hard-light.org/index.php?title=Script_-_Shield_Management&amp;diff=33401&amp;oldid=prev</id>
		<title>The E: Adding the Shield Management script</title>
		<link rel="alternate" type="text/html" href="https://wiki.hard-light.org/index.php?title=Script_-_Shield_Management&amp;diff=33401&amp;oldid=prev"/>
		<updated>2011-02-04T14:30:27Z</updated>

		<summary type="html">&lt;p&gt;Adding the Shield Management script&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This script is designed to automate the shield management that is part of FS2&amp;#039;s gameplay. It wil display a little element on your HUD underneath the reticle which will show you the current management status. This additional HUD gauge will look like four slices arranged in a circle. Each of these represents one of the four shield quadrants, with its colour changing depending on the script&amp;#039;s status. White means the script is inactive, Blue means that a given quadrant is managed by the script, and red that the script is active, but not currently managing that quadrant.&lt;br /&gt;
&lt;br /&gt;
In order to configure this script on-the-fly, the following keyboard controls are used:&lt;br /&gt;
*q: unfocuses all quadrants (meaning the script is active, but not currently managing any shield areas&lt;br /&gt;
*0: Used to turn the script on and off&lt;br /&gt;
*arrow keys: Used to turn a prticular quadrant on and off.&lt;br /&gt;
&lt;br /&gt;
==shieldman-sct.tbm==&lt;br /&gt;
&amp;lt;pre&amp;gt;#Conditional Hooks&lt;br /&gt;
&lt;br /&gt;
$Application: FS2_Open&lt;br /&gt;
&lt;br /&gt;
$On Game Init: [[shields_onInit.LUA]]&lt;br /&gt;
&lt;br /&gt;
$State: GS_STATE_GAME_PLAY&lt;br /&gt;
$On State Start: [[shields_onStart.LUA]]&lt;br /&gt;
$On Key Pressed: [[shields_KeyPressed.lua]]&lt;br /&gt;
$On Key Released: [[shields_KeyReleased.lua]]&lt;br /&gt;
$On Frame:[[shields_onFrame.lua]]&lt;br /&gt;
$On HUD Draw:[[shields_onHud.lua]]&lt;br /&gt;
$On Warp Out:[if hv.Self == hv.Player then IsWarpingOut = True end]&lt;br /&gt;
&lt;br /&gt;
#End&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Files to be placed in data/scripts==&lt;br /&gt;
The following code snippets need to be copied into empty text files. These will need to be saved in data/scripts, with the names as indicated.&lt;br /&gt;
&lt;br /&gt;
===shields_KeyPressed.lua===&lt;br /&gt;
&amp;lt;pre&amp;gt;local key = hv.Key&lt;br /&gt;
local func = ui_keyToggleFunctions[key]&lt;br /&gt;
if func then&lt;br /&gt;
	func(true)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===shields_KeyReleased.lua===&lt;br /&gt;
&amp;lt;pre&amp;gt;local key = hv.Key&lt;br /&gt;
local func = ui_keyToggleFunctions[key]&lt;br /&gt;
if func then&lt;br /&gt;
	func(false)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===shields_OnFrame.lua===&lt;br /&gt;
&amp;lt;pre&amp;gt;if not ShieldmanOverride then&lt;br /&gt;
	if MissionTime == nil then&lt;br /&gt;
	   MissionTime = mn.getMissionTime()&lt;br /&gt;
	   OldMissionTime = MissionTime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	MissionTime = mn.getMissionTime()&lt;br /&gt;
&lt;br /&gt;
	if OldMissionTime ~= MissionTime then&lt;br /&gt;
		--Keyboard responses&lt;br /&gt;
		if InputStates.zero then&lt;br /&gt;
			InputStates.zero = false&lt;br /&gt;
			if ShieldsEnabled then&lt;br /&gt;
				ShieldsEnabled = false&lt;br /&gt;
			else&lt;br /&gt;
				ShieldsEnabled = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if InputStates.qKey then&lt;br /&gt;
			InputStates.qKey = false&lt;br /&gt;
			FocusedShields[1] = false&lt;br /&gt;
			FocusedShields[2] = false&lt;br /&gt;
			FocusedShields[3] = false&lt;br /&gt;
			FocusedShields[4] = false&lt;br /&gt;
			NumberFocused = 0&lt;br /&gt;
		end&lt;br /&gt;
		if InputStates.right then&lt;br /&gt;
			InputStates.right = false&lt;br /&gt;
			if FocusedShields[1] then&lt;br /&gt;
				FocusedShields[1] = false&lt;br /&gt;
				NumberFocused = NumberFocused - 1&lt;br /&gt;
			else&lt;br /&gt;
				FocusedShields[1] = true&lt;br /&gt;
				NumberFocused = NumberFocused + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if InputStates.up then&lt;br /&gt;
			InputStates.up = false&lt;br /&gt;
			if FocusedShields[2] then&lt;br /&gt;
				FocusedShields[2] = false&lt;br /&gt;
				NumberFocused = NumberFocused - 1&lt;br /&gt;
			else&lt;br /&gt;
				FocusedShields[2] = true&lt;br /&gt;
				NumberFocused = NumberFocused + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if InputStates.down then&lt;br /&gt;
			InputStates.down = false&lt;br /&gt;
			if FocusedShields[3] then&lt;br /&gt;
				FocusedShields[3] = false&lt;br /&gt;
				NumberFocused = NumberFocused - 1&lt;br /&gt;
			else&lt;br /&gt;
				FocusedShields[3] = true&lt;br /&gt;
				NumberFocused = NumberFocused + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if InputStates.left then&lt;br /&gt;
			InputStates.left = false&lt;br /&gt;
			if FocusedShields[4] then&lt;br /&gt;
				FocusedShields[4] = false&lt;br /&gt;
				NumberFocused = NumberFocused - 1&lt;br /&gt;
			else&lt;br /&gt;
				FocusedShields[4] = true&lt;br /&gt;
				NumberFocused = NumberFocused + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		gr.setColor(191,191,255,255)&lt;br /&gt;
		--Use all this only if it&amp;#039;s turned on&lt;br /&gt;
		if ShieldsEnabled then&lt;br /&gt;
&lt;br /&gt;
			plr = hv.Player&lt;br /&gt;
			if plr:isValid() then&lt;br /&gt;
				--If shields aren&amp;#039;t full, then distribute the power&lt;br /&gt;
				if plr.Shields.CombinedMax &amp;gt; plr.Shields.CombinedLeft then&lt;br /&gt;
					qMax = ( plr.Shields.CombinedMax / 4 ) --Full energy for a quadrant&lt;br /&gt;
					Remainder = plr.Shields.CombinedLeft --Leftover shield energy&lt;br /&gt;
					--[1 to 3 Quads]&lt;br /&gt;
					if NumberFocused &amp;gt; 0 and NumberFocused &amp;lt; 4 then&lt;br /&gt;
						--check if there&amp;#039;s insufficient energy to max out the focused quadrants&lt;br /&gt;
						if ( Remainder / NumberFocused ) &amp;lt; ( qMax ) then&lt;br /&gt;
							qMax = ( Remainder / NumberFocused )&lt;br /&gt;
							count = NumberFocused - 1&lt;br /&gt;
							Remainder = Remainder - ( count * qMax )&lt;br /&gt;
							for i = 1,4 do&lt;br /&gt;
								if FocusedShields[i] then&lt;br /&gt;
									if count &amp;gt; 1 then&lt;br /&gt;
										plr.Shields[i] = qMax&lt;br /&gt;
									else&lt;br /&gt;
										plr.Shields[i] = Remainder&lt;br /&gt;
									end&lt;br /&gt;
									count = count - 1&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							for i = 1,4 do&lt;br /&gt;
								if FocusedShields[i] == false then&lt;br /&gt;
									plr.Shields[i] = 0&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						else&lt;br /&gt;
							for i = 1,4 do&lt;br /&gt;
								if FocusedShields[i] then&lt;br /&gt;
									plr.Shields[i] = qMax&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							Remainder = Remainder - ( qMax * NumberFocused )&lt;br /&gt;
							count = 4 - NumberFocused&lt;br /&gt;
							qDivided = ( Remainder / count )&lt;br /&gt;
							Remainder = Remainder - ( ( count - 1 ) * qDivided )&lt;br /&gt;
							for i = 1,4 do&lt;br /&gt;
								if FocusedShields[i] == false then&lt;br /&gt;
									if count &amp;gt; 1 then&lt;br /&gt;
										plr.Shields[i] = qDivided&lt;br /&gt;
									else&lt;br /&gt;
										plr.Shields[i] = Remainder&lt;br /&gt;
									end&lt;br /&gt;
									count = count - 1&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
					--[!1 to 3 quads]&lt;br /&gt;
						qDivided = ( Remainder / 4 )&lt;br /&gt;
						Remainder = Remainder - ( qDivided * 3 )&lt;br /&gt;
						for i = 1,3 do&lt;br /&gt;
							plr.Shields[i] = qDivided&lt;br /&gt;
						end&lt;br /&gt;
						plr.Shields[4] = Remainder&lt;br /&gt;
					end&lt;br /&gt;
					--[/1 to 3 quads]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		OldMissionTime = MissionTime&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===shields_onHud.lua===&lt;br /&gt;
&amp;lt;pre&amp;gt;if not ShieldmanOverride then&lt;br /&gt;
	if hu.HUDDrawn == true and IsWarpingOut == false then&lt;br /&gt;
		drawShieldquadrants(FocusedShields, ShieldsEnabled)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===shields_onInit.lua===&lt;br /&gt;
&amp;lt;pre&amp;gt;--Global vars&lt;br /&gt;
ShieldsEnabled = true&lt;br /&gt;
&lt;br /&gt;
FocusedShields = { false, true, true, false }&lt;br /&gt;
&lt;br /&gt;
NumberFocused = 2&lt;br /&gt;
&lt;br /&gt;
ui_keyToggleFunctions = {}&lt;br /&gt;
&lt;br /&gt;
quadrantenabledgfx = {}&lt;br /&gt;
quadrantenabledgfx[1] = gr.loadTexture(&amp;quot;qrenabled&amp;quot;)&lt;br /&gt;
quadrantenabledgfx[2] = gr.loadTexture(&amp;quot;qfenabled&amp;quot;)&lt;br /&gt;
quadrantenabledgfx[3] = gr.loadTexture(&amp;quot;qaenabled&amp;quot;)&lt;br /&gt;
quadrantenabledgfx[4] = gr.loadTexture(&amp;quot;qlenabled&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
quadrantdisabledgfx = {}&lt;br /&gt;
quadrantdisabledgfx[1] = gr.loadTexture(&amp;quot;qrdisabled&amp;quot;)&lt;br /&gt;
quadrantdisabledgfx[2] = gr.loadTexture(&amp;quot;qfdisabled&amp;quot;)&lt;br /&gt;
quadrantdisabledgfx[3] = gr.loadTexture(&amp;quot;qadisabled&amp;quot;)&lt;br /&gt;
quadrantdisabledgfx[4] = gr.loadTexture(&amp;quot;qldisabled&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
hudshieldbase = gr.loadTexture(&amp;quot;shieldbase&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
IsWarpingOut = false&lt;br /&gt;
&lt;br /&gt;
shields = {}&lt;br /&gt;
shields.x = (gr.getScreenWidth() / 2) - (hudshieldbase:getWidth() / 2)&lt;br /&gt;
shields.y = (gr.getScreenHeight() / 3 * 2) - (hudshieldbase:getHeight() / 2)&lt;br /&gt;
&lt;br /&gt;
drawShieldquadrants = function(quadrants, enabled)&lt;br /&gt;
    gr.drawImage(hudshieldbase, shields.x, shields.y)&lt;br /&gt;
	if enabled then&lt;br /&gt;
	    for i=1, 4 do&lt;br /&gt;
		   if quadrants[i] then gr.drawImage(quadrantenabledgfx[i], shields.x, shields.y)&lt;br /&gt;
		   else gr.drawImage(quadrantdisabledgfx[i], shields.x, shields.y)&lt;br /&gt;
		   end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===shields_OnStart.lua===&lt;br /&gt;
&amp;lt;pre&amp;gt;InputStates = {}&lt;br /&gt;
ui_keyToggleFunctions = {}&lt;br /&gt;
ui_keyToggleFunctions[&amp;quot;Q&amp;quot;] = function(val) InputStates.qKey = val end&lt;br /&gt;
ui_keyToggleFunctions[&amp;quot;0&amp;quot;] = function(val) InputStates.zero = val end&lt;br /&gt;
ui_keyToggleFunctions[&amp;quot;Up Arrow&amp;quot;] = function(val) InputStates.up = val end&lt;br /&gt;
ui_keyToggleFunctions[&amp;quot;Down Arrow&amp;quot;] = function(val) InputStates.down = val end&lt;br /&gt;
ui_keyToggleFunctions[&amp;quot;Left Arrow&amp;quot;] = function(val) InputStates.left = val end&lt;br /&gt;
ui_keyToggleFunctions[&amp;quot;Right Arrow&amp;quot;] = function(val) InputStates.right = val end&lt;br /&gt;
IsWarpingOut = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interface graphics==&lt;br /&gt;
Download [[http://blueplanet.fsmods.net/E/shields.7z this package]], and unpack it into data/interface.&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
*Script programming by ChronoReverse&lt;br /&gt;
*Interface graphics by The E&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting Examples|Shields]]&lt;/div&gt;</summary>
		<author><name>The E</name></author>
	</entry>
</feed>