[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/scripts/armcom.lua [Back]  [Original]

include "constants.lua"

--------------------------------------------------------------------------------
-- pieces
--------------------------------------------------------------------------------
local torso = piece 'torso'
local ruparm = piece 'ruparm'
local luparm = piece 'luparm'
local rbigflash = piece 'rbigflash'
local nanospray = piece 'nanospray'
local pelvis = piece 'pelvis'
local lfirept = piece 'lfirept'
local head = piece 'head'
local lthigh = piece 'lthigh'
local rthigh = piece 'rthigh'
local nanolath = piece 'nanolath'
local biggun = piece 'biggun'
local rleg = piece 'rleg'
local lleg = piece 'lleg'
local ground = piece 'ground'

local smokePiece = {torso}
local nanoPieces = {nanospray}

--------------------------------------------------------------------------------
-- constants
--------------------------------------------------------------------------------
-- Signal definitions
local SIG_WALK = 1
local SIG_RESTORE = 8
local SIG_LASER = 2
local SIG_DGUN = 4

-- what are these for?
--local ACT_DGUN = 4
--local ACT_LASER = 2

local TORSO_SPEED_YAW = math.rad(300)
local ARM_SPEED_PITCH = math.rad(180)

local PACE = 2
local BASE_VELOCITY = UnitDefNames.armcom1.speed or 1.375*30
local VELOCITY = UnitDefs[unitDefID].speed or BASE_VELOCITY
PACE = PACE * VELOCITY/BASE_VELOCITY

--[[
local baseHeight = UnitDefNames.armcom1.modelHeight
local height = UnitDefs[unitDefID].modelHeight
if height and baseHeight then
	PACE = PACE * baseHeight/height
	Spring.Echo("Stride length compensation")
end
]]--

local THIGH_FRONT_ANGLE = math.rad(-50)
local THIGH_FRONT_SPEED = math.rad(60) * PACE
local THIGH_BACK_ANGLE = math.rad(30)
local THIGH_BACK_SPEED = math.rad(60) * PACE
local SHIN_FRONT_ANGLE = math.rad(45)
local SHIN_FRONT_SPEED = math.rad(90) * PACE
local SHIN_BACK_ANGLE = math.rad(10)
local SHIN_BACK_SPEED = math.rad(90) * PACE

local ARM_FRONT_ANGLE = math.rad(-20)
local ARM_FRONT_SPEED = math.rad(22.5) * PACE
local ARM_BACK_ANGLE = math.rad(10)
local ARM_BACK_SPEED = math.rad(22.5) * PACE
local ARM_PERPENDICULAR = math.rad(90)
--[[
local FOREARM_FRONT_ANGLE = math.rad(-15)
local FOREARM_FRONT_SPEED = math.rad(40) * PACE
local FOREARM_BACK_ANGLE = math.rad(-10)
local FOREARM_BACK_SPEED = math.rad(40) * PACE
]]--

local TORSO_ANGLE_MOTION = math.rad(10)
local TORSO_SPEED_MOTION = math.rad(15)*PACE


local RESTORE_DELAY_LASER = 4000
local RESTORE_DELAY_DGUN = 2500

--------------------------------------------------------------------------------
-- vars
--------------------------------------------------------------------------------
local isLasering, isDgunning, shieldOn = false, false, true
local restoreHeading, restorePitch = 0, 0

local starBLaunchers = {}
local wepTable = UnitDefs[unitDefID].weapons
wepTable.n = nil
for index, weapon in pairs(wepTable) do
	local weaponDef = WeaponDefs[weapon.weaponDef]
	if weaponDef.type == "StarburstLauncher" then
		starBLaunchers[index] = true
	end
end

--------------------------------------------------------------------------------
-- funcs
--------------------------------------------------------------------------------
local function Walk()
	Signal(SIG_WALK)
	SetSignalMask(SIG_WALK)
	
	Turn(nanolath, x_axis, math.rad(-40), ARM_SPEED_PITCH)
	Turn(biggun, x_axis, math.rad(-62.5), ARM_SPEED_PITCH)
	
	Turn(ground, x_axis, math.rad(10), math.rad(30))
	while true do
		--left leg up, right leg back
		Turn(lthigh, x_axis, THIGH_FRONT_ANGLE, THIGH_FRONT_SPEED)
		Turn(lleg, x_axis, SHIN_FRONT_ANGLE, SHIN_FRONT_SPEED)
		Turn(rthigh, x_axis, THIGH_BACK_ANGLE, THIGH_BACK_SPEED)
		Turn(rleg, x_axis, SHIN_BACK_ANGLE, SHIN_BACK_SPEED)
		if not(isLasering or isDgunning) then
			--left arm back, right arm front
			Turn(torso, y_axis, TORSO_ANGLE_MOTION, TORSO_SPEED_MOTION)
			Turn(luparm, x_axis, ARM_BACK_ANGLE, ARM_BACK_SPEED)
			Turn(ruparm, x_axis, ARM_FRONT_ANGLE, ARM_FRONT_SPEED)
		end
		WaitForTurn(lthigh, x_axis)
		Sleep(0)
		
		--right leg up, left leg back
		Turn(lthigh, x_axis, THIGH_BACK_ANGLE, THIGH_BACK_SPEED)
		Turn(lleg, x_axis, SHIN_BACK_ANGLE, SHIN_BACK_SPEED)
		Turn(rthigh, x_axis, THIGH_FRONT_ANGLE, THIGH_FRONT_SPEED)
		Turn(rleg, x_axis, SHIN_FRONT_ANGLE, SHIN_FRONT_SPEED)
		if not(isLasering or isDgunning) then
			--left arm front, right arm back
			Turn(torso, y_axis, -TORSO_ANGLE_MOTION, TORSO_SPEED_MOTION)
			Turn(luparm, x_axis, ARM_FRONT_ANGLE, ARM_FRONT_SPEED)
			Turn(ruparm, x_axis, ARM_BACK_ANGLE, ARM_BACK_SPEED)
		end
		WaitForTurn(rthigh, x_axis)
		Sleep(0)
	end
end

local function RestorePose()
	Signal(SIG_WALK)
	SetSignalMask(SIG_WALK)
	Turn(ground, x_axis, 0, math.rad(60))
	Move(pelvis, y_axis, 0, 1)
	Turn(rthigh, x_axis, 0, math.rad(200))
	Turn(rleg, x_axis, 0, math.rad(200))
	Turn(lthigh, x_axis, 0, math.rad(200))
	Turn(lleg, x_axis, 0, math.rad(200))
	Turn(luparm, x_axis, 0, math.rad(120))
	Turn(ruparm, x_axis, 0, math.rad(120))
end

function script.Create()
	Hide(ground)
	Hide(rbigflash)
	Hide(lfirept)
	Hide(nanospray)
	Turn(lfirept, x_axis, math.rad(145))
	Turn(rbigflash, x_axis, math.rad(145))
	
	StartThread(GG.Script.SmokeUnit, unitID, smokePiece)
	Spring.SetUnitNanoPieces(unitID, nanoPieces)
end

function script.StartMoving()
	StartThread(Walk)
end

function script.StopMoving()
	StartThread(RestorePose)
end

function script.AimFromWeapon(num)
	return torso
end

function script.QueryWeapon(num)
	if num == 3 then
		return rbigflash
	elseif num == 2 or num == 4 then
		return torso
	end
	return lfirept
end

local function RestoreLaser()
	Signal(SIG_RESTORE)
	SetSignalMask(SIG_RESTORE)
	Sleep(RESTORE_DELAY_LASER)
	isLasering = false
	isDgunning = false
	Turn(luparm, x_axis, restorePitch, ARM_SPEED_PITCH)
	if (not isDgunning) then Turn(torso, y_axis, restoreHeading, TORSO_SPEED_YAW) end
end

local function RestoreDgun()
	Signal(SIG_RESTORE)
	SetSignalMask(SIG_RESTORE)
	Sleep(RESTORE_DELAY_DGUN)
	isLasering = false
	isDgunning = false
	Turn(ruparm, x_axis, 0, ARM_SPEED_PITCH)
	if (not isLasering) then Turn(torso, y_axis, restoreHeading, TORSO_SPEED_YAW) end
end

function script.AimWeapon(num, heading, pitch)
	if num >= 5 then
		Signal(SIG_LASER)
		SetSignalMask(SIG_LASER)
		isLasering = true
		if not isDgunning then
			Turn(torso, y_axis, heading, TORSO_SPEED_YAW)
		end
		Turn(nanolath, x_axis, math.rad(-40), ARM_SPEED_PITCH)
		Turn(luparm, x_axis, math.rad(-50) - pitch, ARM_SPEED_PITCH)
		WaitForTurn(torso, y_axis)
		WaitForTurn(luparm, x_axis)
		StartThread(RestoreLaser)
		return true
	elseif num == 3 then
		if starBLaunchers[num] then
			pitch = ARM_PERPENDICULAR
		end
		Signal(SIG_DGUN)
		SetSignalMask(SIG_DGUN)
		isDgunning = true
		Turn(biggun, x_axis, math.rad(-62.5), ARM_SPEED_PITCH)
		Turn(torso, y_axis, heading, TORSO_SPEED_YAW)
		Turn(ruparm, x_axis, math.rad(-30) - pitch, ARM_SPEED_PITCH)
		WaitForTurn(torso, y_axis)
		WaitForTurn(ruparm, x_axis)
		StartThread(RestoreDgun)
		return true
	elseif num == 2 or num == 4 then
		Sleep(100)
		return (shieldOn)
	end
	return false
end

function script.FireWeapon(num)
	if num == 5 then
		EmitSfx(lfirept, 1024)
	elseif num == 3 then
		EmitSfx(rbigflash, 1026)
	end
end

function script.Shot(num)
	if num == 5 then
		EmitSfx(lfirept, 1025)
	elseif num == 3 then
		EmitSfx(rbigflash, 1027)
	end
end

function script.StopBuilding()
	SetUnitValue(COB.INBUILDSTANCE, 0)
	restoreHeading, restorePitch = 0, 0
	StartThread(RestoreLaser)
end

function script.StartBuilding(heading, pitch)
	if not isLasering then
		Turn(luparm, x_axis, math.rad(-60) - pitch, ARM_SPEED_PITCH)
		if not (isDgunning) then Turn(torso, y_axis, heading, TORSO_SPEED_YAW) end
	end
	restoreHeading, restorePitch = heading, pitch
	SetUnitValue(COB.INBUILDSTANCE, 1)
end

function script.Killed(recentDamage, maxHealth)
	local severity = recentDamage/maxHealth
	if severity < 0.5 then
		Explode(torso, SFX.NONE)
		Explode(luparm, SFX.NONE)
		Explode(ruparm, SFX.NONE)
		Explode(pelvis, SFX.NONE)
		Explode(lthigh, SFX.NONE)
		Explode(rthigh, SFX.NONE)
		Explode(nanolath, SFX.NONE)
		Explode(biggun, SFX.NONE)
		Explode(rleg, SFX.NONE)
		Explode(lleg, SFX.NONE)
		return 1
	else
		Explode(torso, SFX.SHATTER)
		Explode(luparm, SFX.SMOKE + SFX.FIRE + SFX.EXPLODE)
		Explode(ruparm, SFX.SMOKE + SFX.FIRE + SFX.EXPLODE)
		Explode(pelvis, SFX.SHATTER)
		Explode(lthigh, SFX.SHATTER)
		Explode(rthigh, SFX.SHATTER)
		Explode(nanolath, SFX.SMOKE + SFX.FIRE + SFX.EXPLODE)
		Explode(biggun, SFX.SMOKE + SFX.FIRE + SFX.EXPLODE)
		Explode(rleg, SFX.SHATTER)
		Explode(lleg, SFX.SHATTER)
		return 2
	end
end

Web Proxy Viewer  |  New URL  |  Original Page