#**************************************************************************** #** #** File : /cdimage/lua/modules/cybranunits.lua #** Author(s): #** #** Summary : #** #** Copyright © 2005 Gas Powered Games, Inc. All rights reserved. #**************************************************************************** #-------------------------------------------------------------------------- # CYBRAN DEFAULT UNITS #-------------------------------------------------------------------------- local DefaultUnitsFile = import('defaultunits.lua') local AirFactoryUnit = DefaultUnitsFile.AirFactoryUnit local AirStagingPlatformUnit = DefaultUnitsFile.AirStagingPlatformUnit local AirUnit = DefaultUnitsFile.AirUnit local ConcreteStructureUnit = DefaultUnitsFile.ConcreteStructureUnit local ConstructionUnit = DefaultUnitsFile.ConstructionUnit local EnergyStorageUnit = DefaultUnitsFile.EnergyStorageUnit local LandFactoryUnit = DefaultUnitsFile.LandFactoryUnit local SeaFactoryUnit = DefaultUnitsFile.SeaFactoryUnit local SeaUnit = DefaultUnitsFile.SeaUnit local ShieldLandUnit = DefaultUnitsFile.ShieldLandUnit local ShieldStructureUnit = DefaultUnitsFile.ShieldStructureUnit local StructureUnit = DefaultUnitsFile.StructureUnit local QuantumGateUnit = DefaultUnitsFile.QuantumGateUnit local RadarJammerUnit = DefaultUnitsFile.RadarJammerUnit local Util = import('utilities.lua') local EffectTemplate = import('EffectTemplates.lua') local EffectUtil = import('EffectUtilities.lua') local CreateCybranBuildBeams = EffectUtil.CreateCybranBuildBeams #------------------------------------------------------------- # AIR FACTORY STRUCTURES #------------------------------------------------------------- CAirFactoryUnit = Class(AirFactoryUnit) { BuildEffect = '/effects/emitters/sparks_03_emit.bp', UnitBuildEffect = '/effects/emitters/sparks_05_emit.bp', StartBuildFx = function(self, unitBeingBuilt) # Start build process if not self.BuildAnimManip then self.BuildAnimManip = CreateAnimator(self) self.BuildAnimManip:PlayAnim(self:GetBlueprint().Display.AnimationBuild, true):SetRate(0) self.Trash:Add(self.BuildAnimManip) end self.BuildAnimManip:SetRate(1) #Add sparks to the factory arms for k,v in self.RightBuildEffectsBones do self.BuildEffectsBag:Add( CreateAttachedEmitter(self,v,self:GetArmy(), self.RightBuildEffect)) end for k,v in self.LeftBuildEffectsBones do self.BuildEffectsBag:Add( CreateAttachedEmitter(self,v,self:GetArmy(), self.LeftBuildEffect)) end #Add sparks to the collision box of the unit being built local sx, sy, sz = 0 if not self.UnitEffectsBag then self.UnitEffectsBag = {} end while not unitBeingBuilt:IsDead() and unitBeingBuilt:GetFractionComplete() < 1 do sx, sy, sz = unitBeingBuilt:GetRandomPoint(1) table.insert(self.UnitEffectsBag, CreateEmitterOnEntity(unitBeingBuilt,unitBeingBuilt:GetArmy(),self.UnitBuildEffect):OffsetEmitter(sx,sy,sz)) WaitSeconds(Random()) for k,v in self.UnitEffectsBag do v:Destroy() end self.UnitEffectsBag = {} end end, StopBuildFx = function(self) if self.BuildAnimManip then self.BuildAnimManip:SetRate(0) end if self.UnitEffectsBag then for k,v in self.UnitEffectsBag do v:Destroy() end self.UnitEffectsBag = {} end end, } #------------------------------------------------------------- # AIR STAGING STRUCTURES #------------------------------------------------------------- CAirStagingPlatformUnit = Class(AirStagingPlatformUnit) {} #------------------------------------------------------------- # AIR UNITS #------------------------------------------------------------- CAirUnit = Class(AirUnit) {} #------------------------------------------------------------- # WALL STRUCTURES #------------------------------------------------------------- CConcreteStructureUnit = Class(ConcreteStructureUnit) {} #------------------------------------------------------------- # CONSTRUCTION UNITS #------------------------------------------------------------- CConstructionUnit = Class(ConstructionUnit){ OnStartBuild = function(self,unitBeingBuilt, order) local unitid = self:GetBlueprint().General.UpgradesTo if unitBeingBuilt:GetUnitId() == unitid and order == 'Upgrade' then self.Upgrading = true self.BuildBones.BuildEffectBones = {} end ConstructionUnit.OnStartBuild(self,unitBeingBuilt) end, OnStopBeingBuilt = function(self,builder,layer) ConstructionUnit.OnStopBeingBuilt(self,builder,layer) # If created with F2 on land, then play the transform anim. if(self:GetCurrentLayer() == 'Water') then self.TerrainLayerTransitionThread = self:ForkThread(self.TransformThread, true) end end, OnLayerChange = function(self, new, old) ConstructionUnit.OnLayerChange(self, new, old) if self:GetBlueprint().Display.AnimationWater then if self.TerrainLayerTransitionThread then self.TerrainLayerTransitionThread:Destroy() self.TerrainLayerTransitionThread = nil end if (new == 'Land') and (old != 'None') then self.TerrainLayerTransitionThread = self:ForkThread(self.TransformThread, false) elseif (new == 'Water') then self.TerrainLayerTransitionThread = self:ForkThread(self.TransformThread, true) end end end, TransformThread = function(self, water) if not self.TransformManipulator then self.TransformManipulator = CreateAnimator(self) self.Trash:Add( self.TransformManipulator ) end if water then self.TransformManipulator:PlayAnim(self:GetBlueprint().Display.AnimationWater) self.TransformManipulator:SetRate(1) self.TransformManipulator:SetPrecedence(0) else self.TransformManipulator:SetRate(-1) self.TransformManipulator:SetPrecedence(0) WaitFor(self.TransformManipulator) self.TransformManipulator:Destroy() self.TransformManipulator = nil end end, CreateBuildEffects = function( self, unitBeingBuilt ) EffectUtil.SpawnBuildBots( self, unitBeingBuilt, table.getn(self.BuildBones.BuildEffectBones), self.BuildEffectsBag ) # Create build constant build effect for each build effect bone defined if self.BuildBones.BuildEffectBones then local army = self:GetArmy() for i, BuildBone in self.BuildBones.BuildEffectBones do for k, v in EffectTemplate.CybranBuildUnitBlink01 do self.BuildEffectsBag:Add( CreateAttachedEmitter(self,BuildBone,army,v)) end WaitSeconds( Util.GetRandomFloat( 0.2, 1 )) end end end, } #------------------------------------------------------------- # ENERGY CREATION UNITS #------------------------------------------------------------- CEnergyCreationUnit = Class(DefaultUnitsFile.EnergyCreationUnit) { OnStopBeingBuilt = function(self,builder,layer) DefaultUnitsFile.EnergyCreationUnit.OnStopBeingBuilt(self, builder, layer) if self.AmbientEffects then for k, v in EffectTemplate[self.AmbientEffects] do CreateAttachedEmitter(self, 0, self:GetArmy(), v) end end end, } #------------------------------------------------------------- # ENERGY STORAGE STRUCTURES #------------------------------------------------------------- CEnergyStorageUnit = Class(EnergyStorageUnit) {} #------------------------------------------------------------- # LAND FACTORY STRUCTURES #------------------------------------------------------------- CLandFactoryUnit = Class(LandFactoryUnit) { StartBuildFx = function(self, unitBeingBuilt) # Start build process if not self.BuildAnimManip then self.BuildAnimManip = CreateAnimator(self) self.BuildAnimManip:PlayAnim(self:GetBlueprint().Display.AnimationBuild, true):SetRate(0) self.Trash:Add(self.BuildAnimManip) end self.BuildAnimManip:SetRate(1) # Add sparks to the factory arms local army = self:GetArmy() for kb,vb in self.RightBuildEffectsBones do for ke,ve in self.RightBuildEffect do self.BuildEffectsBag:Add( CreateAttachedEmitter(self,vb,army,ve)) end end for kb,vb in self.LeftBuildEffectsBones do for ke,ve in self.LeftBuildEffect do self.BuildEffectsBag:Add( CreateAttachedEmitter(self,vb,army,ve)) end end # Add sparks to the collision box of the unit being built local sx, sy, sz = 0 for k,v in self.UnitBuildEffect do sx, sy, sz = unitBeingBuilt:GetRandomPoint(1) self.BuildEffectsBag:Add( CreateEmitterOnEntity(unitBeingBuilt,army,v):OffsetEmitter(sx,sy,sz)) end end, StopBuildFx = function(self) if self.BuildAnimManip then self.BuildAnimManip:SetRate(0) end end, } #------------------------------------------------------------- # LAND UNITS #------------------------------------------------------------- CLandUnit = Class(DefaultUnitsFile.LandUnit) {} #------------------------------------------------------------- # MASS COLLECTION UNITS #------------------------------------------------------------- CMassCollectionUnit = Class(DefaultUnitsFile.MassCollectionUnit) {} #------------------------------------------------------------- # MASS FABRICATION UNITS #------------------------------------------------------------- CMassFabricationUnit = Class(DefaultUnitsFile.MassFabricationUnit) {} #------------------------------------------------------------- # MASS STORAGE UNITS #------------------------------------------------------------- CMassStorageUnit = Class(DefaultUnitsFile.MassStorageUnit) {} #------------------------------------------------------------- # RADAR STRUCTURES #------------------------------------------------------------- CRadarUnit = Class(DefaultUnitsFile.RadarUnit) {} #------------------------------------------------------------- # SONAR STRUCTURES #------------------------------------------------------------- CSonarUnit = Class(DefaultUnitsFile.SonarUnit) {} #------------------------------------------------------------- # SEA FACTORY STRUCTURES #------------------------------------------------------------- CSeaFactoryUnit = Class(SeaFactoryUnit) { CreateBuildEffects = function( self, unitBeingBuilt ) self.BuildEffectsBag:Add( self:ForkThread( EffectUtil.CreateCybranBuildBeams, unitBeingBuilt, self.BuildEffectsBones, self.BuildEffectsBag ) ) end, OnPaused = function(self) AirFactoryUnit.OnPaused(self) self:StopArmsMoving() end, OnUnpaused = function(self) AirFactoryUnit.OnUnpaused(self) if self:GetNumBuildOrders(categories.ALLUNITS) > 0 then self:StartArmsMoving() end end, OnStartBuild = function(self, unitBeingBuilt, order ) AirFactoryUnit.OnStartBuild(self, unitBeingBuilt, order ) if order != 'Upgrade' then self:StartArmsMoving() end end, OnStopBuild = function(self, unitBuilding) AirFactoryUnit.OnStopBuild(self, unitBuilding) self:StopArmsMoving() end, OnFailedToBuild = function(self) AirFactoryUnit.OnFailedToBuild(self) self:StopArmsMoving() end, StartArmsMoving = function(self) self.ArmsThread = self:ForkThread(self.MovingArmsThread) end, MovingArmsThread = function(self) end, StopArmsMoving = function(self) if self.ArmsThread then KillThread(self.ArmsThread) self.ArmsThread = nil end end, } #------------------------------------------------------------- # SEA UNITS #------------------------------------------------------------- CSeaUnit = Class(SeaUnit) {} #------------------------------------------------------------- # SHIELD LAND UNITS #------------------------------------------------------------- CShieldLandUnit = Class(ShieldLandUnit) {} #------------------------------------------------------------- # SHIELD STRUCTURES #------------------------------------------------------------- CShieldStructureUnit = Class(ShieldStructureUnit) {} #------------------------------------------------------------- # STRUCTURES #------------------------------------------------------------- CStructureUnit = Class(StructureUnit) {} #------------------------------------------------------------- # SUBMARINE UNITS #------------------------------------------------------------- CSubUnit = Class(DefaultUnitsFile.SubUnit) {} #------------------------------------------------------------- # TRANSPORT BEACON UNITS #------------------------------------------------------------- CTransportBeaconUnit = Class(DefaultUnitsFile.TransportBeaconUnit) {} #------------------------------------------------------------- # WALKING LAND UNITS #------------------------------------------------------------- CWalkingLandUnit = Class(DefaultUnitsFile.WalkingLandUnit) { WalkingAnimRate = 1, IdleAnimRate = 1, DisabledBones = {}, } #------------------------------------------------------------- # WALL STRUCTURES #------------------------------------------------------------- CWallStructureUnit = Class(DefaultUnitsFile.WallStructureUnit) {} #------------------------------------------------------------- # CIVILIAN STRUCTURES #------------------------------------------------------------- CCivilianStructureUnit = Class(CStructureUnit) {} #------------------------------------------------------------- # QUANTUM GATE UNITS #------------------------------------------------------------- CQuantumGateUnit = Class(QuantumGateUnit) {} #------------------------------------------------------------- # RADAR JAMMER UNITS #------------------------------------------------------------- CRadarJammerUnit = Class(RadarJammerUnit) {}