If you want a bubble shield, there are various ways to do that effect visually, but that's outside the scope here.
Hereby released PD.
I would guess that once people see how easy it is, a lot of people would like to make more interesting Unit / Weapon interactions with gamecode, instead of using Spring's hardcoded defaults.
I wrote this really fast, and I haven't tested it, so please let me know if you find any bugs. Feel free to post optimizations if you see any obvious fat.
Code: Select all
function gadget:GetInfo()
	return {
		name = "Basic Shield Gadget",
		desc = "Skeleton for complex shield behaviors.",
		author = "Argh",
		date = "February 17th, 2009",
		license = "Public Domain, or the least-restrictive rights in your country of residence.",
		layer = 1,
		enabled = true,
	}
end
local shieldIgnoreList = {}
local shieldDamage = {}
local shieldDamageLocal = {}
local shieldAmount = 0
if (gadgetHandler:IsSyncedCode()) then
function gadget:Initialize()
	-- Set up weapon classes, for special damage
	for i=1,#WeaponDefs do  --search all WeaponDef entries
		if WeaponDefs[i].customParams.shield_ignore == "yes" then
			table.insert(shieldIgnoreList,i,1)
		end
	end
	-- Set special status for weapons that cause team damage
	for ud,_ in pairs(UnitDefs) do  -- search all UnitDef entries
		if UnitDefs[ud].customParams.has_shield == 'yes' then
			table.insert(shieldDamage,ud,1)
		end
	end
end
function gadget:UnitCreated(unitID,unitDefID,teamID)
	if shieldDamage[unitDefID] then
		table.insert(shieldDamageLocal,unitID,{amount = 100,})
	end
end
function gadget:UnitDestroyed(unitID,unitDefID,teamID)
	if shieldDamage[unitDefID] then
		table.remove(shieldDamageLocal,unitID)
	end
end
function gadget:UnitDamaged(unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam)
	if shieldDamage[unitDefID] then
		if paralyzer then
			SetUnitHealth(unitID,{paralyze = 0}) --no Paralyze for units with Shields on.
		else
			if shieldIgnoreList[weaponID] then
				--normal damage results
			else
				--shield may have nullified results, remove power from shield now
				shieldDamageLocal[unitID].amount = shieldDamageLocal[unitID].amount - damage
				shieldAmount = shieldDamageLocal[unitID].amount -- save a search
				--if shield > 0, then nullify some damage
				if shieldAmount > 0 then
					SetUnitHealth(unitID,{health = Health + shieldAmount})
				end
			end
		end
	end
end
function gadget:GameFrame(f)
	if f % 35 < 0.01 then  -- every 35 frames, operate
		for i=1,#shieldDamageLocal () do    -- iterate through the entire shieldDamageLocal
			if shieldDamageLocal[i].amount <= 100
				shieldDamageLocal[i].amount = shieldDamageLocal[i].amount + 10    -- recharge our shields
			else
				shieldDamageLocal[i].amount = 100
			end
		end
	end
end
-------------------------------------------------------------------------------------END
----------------------------------------------------------------------------------
------------------------------------------------------------------------------
end 




 The only improvment between the Lua you posted and the old Cob way of TA days is that in TA, you could only count how many shots and time between shots, but not the shot power, while with the Lua call-in you know how much health the shot wanted to eat. But both are miles away from the Spring engine shield. And like I said, at least the TA shields usually came with clever visual animation tricks, of which your code is totally devoid of.
 The only improvment between the Lua you posted and the old Cob way of TA days is that in TA, you could only count how many shots and time between shots, but not the shot power, while with the Lua call-in you know how much health the shot wanted to eat. But both are miles away from the Spring engine shield. And like I said, at least the TA shields usually came with clever visual animation tricks, of which your code is totally devoid of.

