All pastes #366678 Raw Edit

Rick

public text v1 · immutable
#366678 ·published 2007-02-21 20:50 UTC
rendered paste body
#****************************************************************************
#**
#**  File     :  /projectiles/CIFEMPFluxWarhead02/CIFEMPFluxWarhead02_script.lua
#**  Author(s):  Gordon Duclos
#**
#**  Summary  :  EMP Flux Warhead Impact effects projectile
#**
#**  Copyright © 2005,2006 Gas Powered Games, Inc.  All rights reserved.
#****************************************************************************

local NullShell = import('/lua/modules/defaultprojectiles.lua').NullShell
local RandomFloat = import('/lua/modules/utilities.lua').GetRandomFloat
local EffectTemplate = import('/lua/modules/EffectTemplates.lua')

AIFQuantumWarhead02 = Class(NullShell) {
    NukeOuterRingDamage = 0,
    NukeOuterRingRadius = 0,
    NukeOuterRingTicks = 0,
    NukeOuterRingTotalTime = 0,

    NukeInnerRingDamage = 0,
    NukeInnerRingRadius = 0,
    NukeInnerRingTicks = 0,
    NukeInnerRingTotalTime = 0,

    NukeMeshScale = 8.5725,
    PlumeVelocityScale = 0.1,

    NormalEffects = {'/effects/emitters/quantum_warhead_01_emit.bp',},
    CloudFlareEffects = EffectTemplate.CloudFlareEffects01,

    # NOTE: This script has been modified to REQUIRE that data is passed in!  The nuke won't explode until this happens!
    #OnCreate = function(self)

    PassData = function(self, Data)
        if Data.NukeOuterRingDamage then self.NukeOuterRingDamage = Data.NukeOuterRingDamage end
        if Data.NukeOuterRingRadius then self.NukeOuterRingRadius = Data.NukeOuterRingRadius end
        if Data.NukeOuterRingTicks then self.NukeOuterRingTicks = Data.NukeOuterRingTicks end
        if Data.NukeOuterRingTotalTime then self.NukeOuterRingTotalTime = Data.NukeOuterRingTotalTime end
        if Data.NukeInnerRingDamage then self.NukeInnerRingDamage = Data.NukeInnerRingDamage end
        if Data.NukeInnerRingRadius then self.NukeInnerRingRadius = Data.NukeInnerRingRadius end
        if Data.NukeInnerRingTicks then self.NukeInnerRingTicks = Data.NukeInnerRingTicks end
        if Data.NukeInnerRingTotalTime then self.NukeInnerRingTotalTime = Data.NukeInnerRingTotalTime end

        self:CreateNuclearExplosion()
    end,

    CreateNuclearExplosion = function(self)
        local army = self:GetArmy()
        CreateLightParticle(self, -1, army, 200, 200, 'beam_white_01', 'ramp_quantum_warhead_flash_01')

        self:ForkThread(self.ShakeAndBurnMe, army)
        self:ForkThread(self.InnerCloudFlares, army)
        self:ForkThread(self.DistortionField)

        for k, v in self.NormalEffects do
            CreateEmitterAtEntity( self, army, v )
        end

        self:ForkThread(self.InnerRingDamage)
        self:ForkThread(self.OuterRingDamage)
        self:ForkThread(self.ForceThread)
    end,
    
    OuterRingDamage = function(self)
        #WaitSeconds(3.0)
        local myPos = self:GetPosition()
        local ringWidth = ( self.NukeOuterRingRadius / self.NukeOuterRingTicks )
        local tickLength = ( self.NukeOuterRingTotalTime / self.NukeOuterRingTicks )
        # Since we're not allowed to have an inner radius of 0 in the DamageRing function,
        # I'm manually executing the first tick of damage with a DamageArea function.
        DamageArea(self:GetLauncher(), myPos, ringWidth, self.NukeOuterRingDamage, 'Nuke', true)
        WaitSeconds(tickLength)
        for i = 2, self.NukeOuterRingTicks do
            #print('Damage Ring: MaxRadius:' .. 2*i)
            DamageRing(self:GetLauncher(), myPos, ringWidth * (i - 1), ringWidth * i, self.NukeOuterRingDamage, 'Nuke', true)
            WaitSeconds(tickLength)
        end
    end,

    InnerRingDamage = function(self)
        #WaitSeconds(3.0)
        local myPos = self:GetPosition()
        local ringWidth = ( self.NukeInnerRingRadius / self.NukeInnerRingTicks )
        local tickLength = ( self.NukeInnerRingTotalTime / self.NukeInnerRingTicks )
        # Since we're not allowed to have an inner radius of 0 in the DamageRing function,
        # I'm manually executing the first tick of damage with a DamageArea function.
        DamageArea(self:GetLauncher(), myPos, ringWidth, self.NukeInnerRingDamage, 'Nuke', true)
        WaitSeconds(tickLength)
        for i = 2, self.NukeInnerRingTicks do
            #print('Damage Ring: MaxRadius:' .. ringWidth * i)
            DamageRing(self:GetLauncher(), myPos, ringWidth * (i - 1), ringWidth * i, self.NukeInnerRingDamage, 'Nuke', true)
            WaitSeconds(tickLength)
        end
    end,    

    #Knocks down trees
    ForceThread = function(self)
        local pos = self:GetPosition()
        pos[2] = GetSurfaceHeight(pos[1], pos[3]) + 1
        DamageArea(self, pos, 5, 1, 'Force', true)
        WaitSeconds(0.5)
        DamageRing(self, pos, 4, 15, 1, 'Force', true)
        WaitSeconds(0.5)
        DamageArea(self, pos, 15, 1, 'Force', true)
    end,

    ShakeAndBurnMe = function(self, army)
        self:ShakeCamera( 75, 3, 0, 10 )
        WaitSeconds( 0.5 )
        #CreateDecal(position, heading, textureName, type, sizeX, sizeZ, lodParam, duration, army)");
        local orientation = RandomFloat(0,2*math.pi)
        CreateDecal(self:GetPosition(), orientation, 'Crater01_albedo', '', 'Albedo', 50, 50, 1200, 0, army)
        CreateDecal(self:GetPosition(), orientation, 'Crater01_normals', '', 'Normals', 50, 50, 1200, 0, army)
        self:ShakeCamera( 105, 10, 0, 2 )
        WaitSeconds( 2 )
        self:ShakeCamera( 75, 1, 0, 15 )
    end,


    InnerCloudFlares = function(self, army)
        local numFlares = 50
        local angle = (2*math.pi) / numFlares
        local angleInitial = 0.0 #RandomFloat( 0, angle )
        local angleVariation = (2*math.pi) #0.0 #angle * 0.5

        local emit, x, y, z = nil
        local DirectionMul = 0.02
        local OffsetMul = 4

        for i = 0, (numFlares - 1) do
            x = math.sin(angleInitial + (i*angle) + RandomFloat(-angleVariation, angleVariation))
            y = 0.5 #RandomFloat(0.5, 1.5)
            z = math.cos(angleInitial + (i*angle) + RandomFloat(-angleVariation, angleVariation)) 

            for k, v in self.CloudFlareEffects do
                emit = CreateEmitterAtEntity( self, army, v )
                emit:OffsetEmitter( x * OffsetMul, y * OffsetMul, z * OffsetMul )
                emit:SetEmitterCurveParam('XDIR_CURVE', x * DirectionMul, 0.01)
                emit:SetEmitterCurveParam('YDIR_CURVE', y * DirectionMul, 0.01)
                emit:SetEmitterCurveParam('ZDIR_CURVE', z * DirectionMul, 0.01)
            end
            
            if math.mod(i,11) == 0 then
                CreateLightParticle(self, -1, army, 13, 3, 'beam_white_01', 'ramp_quantum_warhead_flash_01')
            end
            
            WaitSeconds(RandomFloat( 0.05, 0.15 ))
        end
        
        CreateLightParticle(self, -1, army, 13, 3, 'beam_white_01', 'ramp_quantum_warhead_flash_01')
        CreateEmitterAtEntity( self, army, '/effects/emitters/quantum_warhead_ring_01_emit.bp' )
    end,

    DistortionField = function( self )
        local proj = self:CreateProjectile('/effects/QuantumWarhead/QuantumWarheadEffect01_proj.bp')
        local scale = proj:GetBlueprint().Display.UniformScale

        proj:SetScaleVelocity(0.123 * scale,0.123 * scale,0.123 * scale)
        WaitSeconds(17.0)
        proj:SetScaleVelocity(0.01 * scale,0.01 * scale,0.01 * scale)
    end,
}

TypeClass = AIFQuantumWarhead02