*D@`ȈMU+0None PrismTowerCoreSystemEngine TowerFire UnrealSharePrismTower_TargetingPrismTower_Team DrawScale DeathWordsPrismTower_GunExplode FireAssist IsVehicle NeedHelpCanFirePostBeginPlay MultiSkinsSpecial CheckTarget PrismGunTriggerTimerTowerFireStartTeamUpCheckReferenceClientMessageEventReduceDamageSimulatorbCollideActorsArmorAbsorbDamageSimulatorPrismTower_Damage TakeDamageAll explodedAnimate SpawnEffect GreenTexMesh ZapSound BigBeamPSmokeyPGoldTex RoastBeamPbShootVehiclesbShootMonstersBlueTexBegin bDestroyableRisingVelocity BasePuffSizeTotalNumPuffsRedTex DestroyedTouch ZapRangeZapDamageVehiclesBotLargeExplosionPCollisionHeightCollisionRadius ZapDamagebStaticbHidden DrawTypebShootPlayers ReduceDamagebBlockPlayers bBlockActorsbCollideWorlddrowned CheatFlyingSimpleGiantExplosionP LifeSpanSkinPhysics ShakeViewPrioritizeArmor FireDelay bHiddenEdbCollideWhenPlacing bEnabled Explosion MegaRingPTeamHealth Location HurtRadiusDamage MomentumP HitLocation HitNormalEventInstigatorOther bNoDeleteEffects InstigatorTargetOwner TimeSecondsNetModeGame DamageTypeSpecialDamageString instigatedByProtectionType1ProtectionType2ArmorAbsorption NextArmor TouchingFire FirstArmorReducedAmount ArmorDamage EffectSound1ReducedDamageType bTeamGameASMD PreviousBSA ScriptedPawnSmokeGeneratorYXBird1 NaliRabbitVbIsWussi ExploSoundSRRingExplosionRingExplosion2RingExplosion3SpriteBallExplosionRingExplosion4 ReturnValueNDamage TazerFireSmokeLocationDVectorSmokeRotation NumPointsrcSmoke Effect55 fireeffect55 MoveAmount NumPuffs TempTarget StartHealthXFX ErikEnergy darkshieldZ ScriptText LevelInfo GameInfo Inventory DecorationPlayerReplicationInfoLevelActorPawn PlayerPawnCount WetTexture FireTextureSoundTexture RemoteRoleClassPackage TextBufferObject FunctionStateRotatorVectorStruct StrPropertyStructPropertyClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertyBase LastFireTimeDidScan NearbyTowersVehicleZapDamagebSeeStealthedbEvil OtherOtherBSAlso FinalTargetCurrentDamageBoostbFirey TempBuddy CheckThisNewTempTarget ExcludeMe PassedCharge CurrentPower StarshipC_bs3Guncountuptop RealLocationC_bs4C_bs2C_bs1Ls!Mׁ\zx2/////06zx2zx2ׁ\zx2zx2zx20ׁ\06ׁ\ׁ\zx2ׁ\ׁ\ׁ\ׁ\06ׁ\0ׁ\ׁ\SS0WxWx06zx206ׁ\ׁ\ׁ\ׁ\ׁ\zx2ׁ\zx2zx2ׁ\ׁ\0zx20zx2zx2zx2zx2ffzx206W}  ] enlightened fried toasted  overcooked zapped(@PMR@`#mAb* C9G3$@4"2$C6@ NOn[)c &E CB;%^V)*ܒ$SSSS0J$? $?\F/2+4X*`t,9*ܒ$SSSK'T>:TiLI 8? KIP]DU aQ!W _(ec%(a * ($(&(  RYfO jaT\lUtE $ AEk.@YQ Jc;eg"O $@ZdIgk̕ $AHlbH[,N_!-Z % k8w*b?_O, r*6?,a *&  ro$dD-,(6?,BD6?,@#D6#Ba=6?,?6?,?6?#a e a $@@ DAC!#D#, Ya>@a g  @*a \  P#?a $pA @E/a6 :;E:M?zDHB10zDC!#@F w*a*a$w*aa 0' ,PG7%3&$GG vCuN---,-w5*k-5&Prism Tower(s) activated!'5(Prism Tower(s) deactivated!' x1z.E+!01+1+%Z+!G2<21,d2< V- ec%-a 9 -$-&-  {h%Hr&-T!a 9 >?@!a * >?! h?H!H $K a+"O$6$?,c$a  $a* aEE.bQU-C-W-L-R-P-a-D-Y-I-f- s:%&i:&&l:,&[:,&j-,- ySL(VS},|,Vehicles)}, |, SR_Vehicles*}, |, CardboardBox' ~0i,0r0*0& /%%/ 0N/F8w * % F8  h }= *+$7aN]= 'nw7 6N67 ("=w.'*~'%~,tw*=-: : t 'n'' #?' uwdr*a -M-M'/a6 w7-: : 6?6&6,10%Y,OO a?( p/ "&%&%B&%;P?,pA.?%%D;&rBw.*r.*am$ A ?,w.* a P#?a P#?a P#?)a ?,Pw)*)a) @rpp was D?,=` by a Prism Tower.#!*?<!w.*w.*Yw..*.L.. #?a.  '.-.*a.=( z^t %8 ,.r ^  %l ,br * ? |d6 d % ,w * rJ*wJ  :  : w.*)  K'r.*)  K' ( w W) '=r. *. &(w. *. CA!. *!  . A.  WXg "a34X '_r.*( 'w.*3434' GJBD@KjP˼˼ C C˼˼zx2˼ ˼˼ C˼˼˼˼˼˼˼˼˼˼˼06˼˼ׁ\ׁ\ C Cׁ\ׁ\zx2ׁ\ ׁ\ׁ\ Cׁ\ׁ\ׁ\ׁ\ׁ\ׁ\ׁ\ׁ\ׁ\ׁ\ׁ\06ׁ\ׁ\5/&+O$@@>"d9"B.-1V" 8$DUR?SQLA'K $@=$ C<$CFEDq/ r*(Fr--(j6 6(-D'r.*.&- -L(1w.*;.-r.*r.* -P(w.*9.-w.*w.* -I(w.*a/!: -C(Ew.*- : ,w.*&:.: (w.*6.!".a!H(' 5B p Pq!$!  Vd// Generated by MeshMaker (c) 2001 by Mychaeel //========================================================================================================================== // PrismTower: This odd-looking pillar is more dangerous than it looks. It will zap anyone who gets too close with a // powered-up ASMD beam. Nearby PrismTowers will help out by beaming extra power into it, // allowing it to fry you even faster. Watch your step around these... // // By Missilemaster // // Note: ASMDTower.u is also needed for this to work; this file contains the invisible "gun" that shoots people // and several visual effects classes. // // Variables: // bEnabled--When false, the tower won't shoot. This can be toggled by triggering the PrismTower. // bDestroyable, Health--Pretty obvious; if you set bDestroyable to true, it will explode when its health reaches 0. // bShootMonsters--It will helpfully dispose of those pesky Skaarj (and other beasts) for you. // bShootPlayers--Will shoot bots, other players...and you. Look out! // bEvil--With this on, it will blast Nali, Cows and pretty much everything harmless that moves. Hence the name. // FireDelay--How long it must wait between shots. // Team--The PrismTower won't attack players on this team, and will only link up with towers on this team. // ZapDamage--How much damage per shot, and how much to increase another tower's damage when this one charges it. // ZapRange--How close a target has to be to get zapped. Note that this is a HORIZONTAL range. ( It can't aim up except // to transfer power to another tower. ) // // These last two really only apply to Unreal and Unreal Gold (not UT): // bSeeStealthed--If this is false, you can sneak past towers using an Invisibility powerup. // bShootVehicles--If true, it will attack vehicles (from .:..:'s mod) and CardboardBoxes (from my obscure mod). // ZapDamageVehicles--Adjusted zap damage for vehicles to compensate for their insane health. //=========================================================================================================================== class PrismTower extends Decoration; #exec obj load file=..\Textures\XFX.utx package=XFX #exec obj load file=..\Textures\Starship.utx package=Starship #exec mesh import mesh=PrismTower anivfile=Models\PrismTower_a.3d datafile=Models\PrismTower_d.3d x=0 y=0 z=0 mlod=0 #exec mesh origin mesh=PrismTower x=0 y=0 z=0 #exec mesh sequence mesh=PrismTower seq=All startframe=0 numframes=1 #exec meshmap new meshmap=PrismTower mesh=PrismTower #exec meshmap scale meshmap=PrismTower x=0.62500 y=0.62500 z=1.25000 var PrismGun Gun; var actor A; var PlayerPawn P; var SmokeyP S; var vector V; var int countup, top; var(PrismTower_Team) Texture RedTex, BlueTex, GreenTex, GoldTex; var(PrismTower_Gun) float FireDelay; var(PrismTower_Gun) int ZapDamage; var(PrismTower_Gun) int ZapDamageVehicles; var(PrismTower_Targeting) bool bShootPlayers; var(PrismTower_Targeting) bool bSeeStealthed; var(PrismTower_Targeting) bool bShootMonsters; var(PrismTower_Targeting) bool bShootVehicles; var(PrismTower_Targeting) bool bEvil; var(PrismTower_Damage) bool bDestroyable; var int StartHealth; var(PrismTower_Damage) int Health; var(PrismTower_Gun) float ZapRange; var(PrismTower_Team) byte Team; var(PrismTower_Gun) bool bEnabled; var vector RealLocation; function PostBeginPlay() { local vector V; Super.PostBeginPlay(); SetRotation(rot(0,0,0)); StartHealth = Health; V = Location; V.Z += 190; RealLocation = V; Gun = Spawn( class'PrismGun', self,, V ); Gun.SetBase(Self); Gun.SetCollisionSize( ZapRange, ZapRange ); Gun.FireDelay = FireDelay; Gun.ZapDamage = ZapDamage; Gun.VehicleZapDamage = ZapDamageVehicles; Gun.bShootPlayers = bShootPlayers; Gun.bSeeStealthed = bSeeStealthed; Gun.bShootMonsters = bShootMonsters; Gun.bShootVehicles = bShootVehicles; Gun.bEvil = bEvil; // team and team colors for tower if ( Level.Game.bTeamGame ) { Gun.Team = Team; if ( Team == 0 ) MultiSkins[1] = RedTex; else if ( Team == 1 ) MultiSkins[1] = BlueTex; else if ( Team == 2 ) MultiSkins[1] = GreenTex; else if ( Team == 3 ) MultiSkins[1] = GoldTex; } Gun.bEnabled = bEnabled; } function Trigger( Actor Other, Pawn EventInstigator ) { bEnabled = !bEnabled; Gun.bEnabled = bEnabled; if ( EventInstigator != None ) { if ( bEnabled ) EventInstigator.ClientMessage("Prism Tower(s) activated", 'Event', True); else EventInstigator.ClientMessage("Prism Tower(s) deactivated", 'Event', True); } } Auto State Animate { function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { if ( !bDestroyable || Health < 0 ) return; Instigator = InstigatedBy; if ( Instigator != None ) MakeNoise(1.0); Health -= NDamage; if ( Health < (StartHealth / 3) && S == None ) { V = Location; V.Z += 250; S = Spawn( class'SmokeyP',,, V ); S.Trigger( Self, None ); } if ( Health < 1 ) Explode(); } Explode: Gun.bEnabled = False; V = Location; V.Z -= 128; top = Int(V.Z + 256) - 64; for( countup = Int(V.Z); countup < top; countup += 32 ) { sleep(0.1); V = Location; V.X += (128-FRand()*256); V.Y += (128-FRand()*256); V.Z = countup; spawn( class'LargeExplosionP',,, V ); PlaySound(class'SpriteBallExplosion'.default.EffectSound1, SLOT_None,3.0,,2000); HurtRadius( 30, 128, 'Exploded', 2000, V ); } sleep(0.3); A = Spawn( class'SimpleGiantExplosionP',,, Gun.Location ); A.Trigger( Self, None ); Spawn( class'MegaRingP',,, Gun.Location, Rotator(Vect(0,0,1)) ); PlaySound(class'SpriteBallExplosion'.default.EffectSound1, SLOT_None,15.0,,5000); foreach RadiusActors( class'PlayerPawn', P, 3000 ) P.ShakeView( 0.5, 1000, 50 ); HurtRadius( 1000, 256, 'Exploded', 10000, V ); if ( Gun != None ) { Gun.SetOwner(None); Gun.Destroy(); } if ( S != None ) S.Destroy(); Destroy(); Begin: } function Explode() { GoToState('Animate', 'Explode'); } function Destroyed() { if ( Gun != None ) { Gun.SetOwner(None); Gun.Destroy(); } if ( S != None ) S.Destroy(); Super.Destroyed(); } D F6C$w*a*a;w*a BBCq$)CF+ 3f*0@@ fP7@ @ WO>G@  0 _    G=?w?  3@= p?   h @ *K8NNO *;44 *b44I44# V44&);44)$b44'(I44%&KA%K!$%K!#$KA !K K?AKA(VrcAKA K KI IKI XXVhh VfThh X^T"vbT hh h#XXV h h h&"Vb^&'V^T(' XR\ h  h h !%@!BB@@%@"AL+ #(,/47<?BGJMPT W`fioqv|BBCq$)CfOh 56 57 %)  %/1%)1)+/0/1'*0#+0+"&*'(*#'&"$&"(!!,-.!$23456746 34#  23$, ( 27 ,--..BBCq$)C+ ? ?????v*FW//=================================================================================== // The hidden device in the Prism Tower decoration that acts as the gun. //=================================================================================== class PrismGun expands Actor; var float LastFireTime; var actor TempTarget; var bool DidScan; var PrismGun NearbyTowers[5]; var() string DeathWords[5]; // stuff declared by the decoration var float FireDelay; var int ZapDamage; var int VehicleZapDamage; var bool bShootPlayers; var bool bSeeStealthed; var bool bShootMonsters; var bool bShootVehicles; var bool bEvil; var byte Team; var() sound ZapSound; var bool bEnabled; event PostBeginPlay() { Super.PostBeginPlay(); SetTimer(0.5, False); } function Touch( actor Other ) { if ( CheckTarget( Other ) && CanFire() ) TowerFireStart( Other ); } function bool CheckTarget( actor Other ) { local actor OtherOther; local vector BS, BSAlso; // if we have an ULTIMATE darh... if ( Other == None ) return false; // obviously don't want to shoot the level or an unchangeable object, so... if ( Other == Level || Other.bNoDelete || Other.bStatic ) return false; // can't shoot targets in the air if ( Other.Location.Z > Location.Z ) return false; // shoot vehicles ( from Vehicles.u / SR_Vehicles.u by .:..: ) if ( IsVehicle(Other) && bShootVehicles ) return true; // don't shoot it if it's not a pawn or vehicle ( assisting towers don't call this function ), or if it's a dead // pawn or one with an Invisibility powerup ( if bSeeStealthed is false ) if ( ( Pawn(Other) == None || Pawn(Other).Health < 1 ) || ( Other.bHidden && !bSeeStealthed ) ) return false; // don't shoot monsters if bShootMonsters is false if ( ScriptedPawn(Other) != None && (!ScriptedPawn(Other).bIsWuss || NaliRabbit(Other) == None || Bird1(Other) == None) && !bShootMonsters ) return false; // be nice to the nali...if bEvil is false! muhahahaha....? if ( ScriptedPawn(Other) != None && (ScriptedPawn(Other).bIsWuss || NaliRabbit(Other) != None || Bird1(Other) != None) && !bEvil ) return false; // don't shoot players or bots if bShootPlayers is false if ( ( PlayerPawn(Other) != None || Other.IsA('Bot') ) && !bShootPlayers ) return false; // don't shoot team members if this is a team game if ( Pawn(Other) != None && Level.Game.bTeamGame && Team != 255 && Pawn(Other).PlayerReplicationInfo != None && Pawn(Other).PlayerReplicationInfo.Team == Team ) return false; // don't shoot players with god on if ( PlayerPawn(Other) != None && (PlayerPawn(Other).ReducedDamageType == 'All' || PlayerPawn(Other).IsInState('CheatFlying')) ) return false; // if it passed all those checks, open fire! return true; } function bool CanFire() { return ( bEnabled && (Level.TimeSeconds - LastFireTime) >= FireDelay ); } // check if we can hit the pawn, and ask for help from nearby towers...this function is called ONLY // by the tower that "spotted" the pawn first and initiated the chain ( if there is one ) function bool TowerFireStart( actor Target ) { local vector HitLocation, HitNormal; local actor Other; LastFireTime = Level.TimeSeconds; Other = Trace( HitLocation, HitNormal, Target.Location, Location, True ); if ( Pawn(Other) == None && !IsVehicle(Other) ) return false; if ( NeedHelp( Other, ZapDamage) && TeamUp( Other ) ) return true; else { if ( Pawn(Other) != None ) TowerFire( Other, Other, ZapDamage, HitLocation, HitNormal ); else TowerFire( Other, Other, VehicleZapDamage, HitLocation, HitNormal ); return true; } } // effects + damage function TowerFire( actor Other, actor FinalTarget, int CurrentDamage, vector HitLocation, vector HitNormal ) { local vector SmokeLocation, DVector; local rotator SmokeRotation; local float NumPoints; local int i, Boost; local class rc; local RingExplosion r; // check if we can link up with another chain of towers; if so, "pass" the current charge down to the end of the chain // ( increasing it along the way ) and start again from there if ( NeedHelp( FinalTarget, CurrentDamage ) && TeamUp( TempTarget, TempTarget, CurrentDamage ) ) return; LastFireTime = Level.TimeSeconds; SmokeLocation = Location; DVector = HitLocation - SmokeLocation; NumPoints = VSize(DVector)/70.0; SmokeLocation += DVector/NumPoints; SmokeRotation = rotator(HitLocation - Location); if (NumPoints>15) NumPoints=15; if ( NumPoints>1.0 ) SpawnEffect( DVector, NumPoints, SmokeRotation, SmokeLocation, (Other == FinalTarget && ((CurrentDamage > ZapDamage && Pawn(Other) != None) || (CurrentDamage > VehicleZapDamage && Pawn(Other) == None)) ) ); PlaySound(ZapSound, SLOT_None, 10.0,, CollisionRadius*2); // spawn a dumb circle of rings if we're charging another tower if ( prismgun(Other) != None ) { rc = class'RingExplosion2'; Spawn(rc,,, HitLocation,rotator(vect(0,0,1))); Spawn(rc,,, HitLocation,rotator(vect(0,1,0))); Spawn(rc,,, HitLocation,rotator(vect(1,0,0))); } else { r = Spawn(rc,,, HitLocation+HitNormal*8,rotator(HitNormal)); if ( r != None ) r.PlaySound(r.ExploSound,,6); } // do the damage ( finally ) if we've reached the end of the chain, or pass the charge on if we haven't if ( Other == FinalTarget ) { Level.Game.SpecialDamageString = " was "$DeathWords[Int((FRand()*5)-0.1)]$" by a Prism Tower."; Other.TakeDamage( CurrentDamage, None, HitLocation, -50000*HitNormal, 'Special' ); Level.Game.SpecialDamageString = ""; } else if ( PrismGun(TempTarget) != None && PrismGun(TempTarget).TempTarget != None ) { if ( PrismGun(PrismGun(TempTarget).TempTarget) != None ) PrismGun(TempTarget).TowerFire( PrismGun(TempTarget).TempTarget, FinalTarget, CurrentDamage, PrismGun(TempTarget).TempTarget.Location, vect(0,0,1) ); else { Other = Trace( HitLocation, HitNormal, PrismGun(TempTarget).TempTarget.Location, TempTarget.Location, True ); PrismGun(TempTarget).TowerFire( PrismGun(TempTarget).TempTarget, FinalTarget, CurrentDamage, HitLocation, HitNormal ); } } TempTarget = None; SetTimer( FireDelay + 0.1, False ); } function SpawnEffect( Vector DVector, int NumPoints, rotator SmokeRotation, vector SmokeLocation, optional bool bFirey ) { local RingExplosion4 Smoke; if ( bFirey ) Smoke = Spawn(class'RoastBeamP',,,SmokeLocation,SmokeRotation); else Smoke = Spawn(class'BigBeamP',,,SmokeLocation,SmokeRotation); Smoke.MoveAmount = DVector/NumPoints; Smoke.NumPuffs = NumPoints; } function Timer() { local int i, count; local PrismGun TempBuddy; if ( Owner == None ) { Destroy(); return; } if ( !DidScan ) { DidScan = True; foreach RadiusActors( class'PrismGun', TempBuddy, CollisionRadius ) { if ( TempBuddy != Self && ( !Level.Game.bTeamGame || TempBuddy.Team == Team ) && CheckReference( TempBuddy ) != -1 ) { NearbyTowers[Count] = TempBuddy; if ( Level.TimeSeconds > 1.0 ) { i = TempBuddy.CheckReference( Self ); if ( i != -1 ) TempBuddy.NearbyTowers[i] = Self; } Count += 1; } if ( Count >= 5 ) Break; } } for( i = 0; i < 4; i++ ) { if ( CheckTarget( Touching[i] ) ) { if ( TowerFireStart( Touching[i] ) ) return; } } SetTimer(1.0, False); } // checks if other tower is in my list already; if not, returns an empty slot in the array, if there is one // (allows towers spawned ingame to work properly) // returns -1: tower already in list, or no slots open in list // returns anything else: tower not in list, returned # is an open slot function int CheckReference( PrismGun CheckThis ) { local int i; for ( i = 0; i < 5; i++ ) { if ( NearbyTowers[i] == CheckThis ) return -1; } for ( i = 0; i < 5; i++ ) { if ( NearbyTowers[i] == None ) return i; } return -1; } // find nearby towers able to give me a power boost function bool TeamUp( actor NewTempTarget, optional actor ExcludeMe, optional int PassedCharge ) { local int i; TempTarget = NewTempTarget; for( i = 0; i < 5; i++ ) { if ( NearbyTowers[i] != None && ( ExcludeMe == None || ExcludeMe != NearbyTowers[i] ) && NearbyTowers[i].CanFire() && NearbyTowers[i].Team == Team ) { if ( Pawn(TempTarget) != None && NearbyTowers[i].FireAssist( Self, TempTarget, (ZapDamage+PassedCharge), Self ) ) return true; else if ( Pawn(TempTarget) == None && NearbyTowers[i].FireAssist( Self, TempTarget, (VehicleZapDamage+PassedCharge), Self ) ) return true; } } return false; } // chained function to link up a bunch of towers; adds up the total damage, then transfers it along the chain to the pawn // when the linked fire sequence begins. function bool FireAssist( PrismGun Previous, actor FinalTarget, int CurrentDamage, optional actor ExcludeMe ) { local actor Other; local int i; local vector HitLocation, HitNormal; // check if we can actually shoot a beam over there ( something might be in the way, or the top might not be visible ) Other = Trace( HitLocation, HitNormal, Previous.Location, Location, True ); if ( Owner.Class != Other.Class || HitLocation.Z < Other.Location.Z ) return false; LastFireTime = Level.TimeSeconds; TempTarget = Previous; if ( Pawn(FinalTarget) != None ) CurrentDamage += ZapDamage; else CurrentDamage += VehicleZapDamage; if ( NeedHelp( FinalTarget, CurrentDamage ) ) { for( i = 0; i < 5; i++ ) { if ( NearbyTowers[i] != None && NearbyTowers[i].CanFire() && ( !Level.Game.bTeamGame || NearbyTowers[i].Team == Team ) ) { if ( NearbyTowers[i].FireAssist( Self, FinalTarget, CurrentDamage, ExcludeMe ) ) return true; } } } TowerFire( TempTarget, FinalTarget, CurrentDamage, TempTarget.Location, vect(0,0,1) ); return true; } // wacky way to check if A is a vehicle from Vehicles.u or SR_Vehicles.u (which are really the same) without loading either one! function bool IsVehicle( actor A ) { local string S; S = String(A.Class); if ( (Len(S) > 8 && Left(S, 8) ~= "Vehicles") || (Len(S) > 11 && Left(S, 11) ~= "SR_Vehicles") || (Len(S) > 12 && Left(S, 12) ~= "CardboardBox") ) return true; } // Check if we need to look for other towers to help out. function bool NeedHelp( actor A, int CurrentPower ) { // to prevent needing to load Vehicles.u (or whatever it's called), always assume we need help to kill vehicles // ( which is usually accurate; many have 2000+ health! ) if ( IsVehicle(A) ) return true; if ( Pawn(A) == None || Pawn(A).Health < 1 ) return false; if ( Pawn(A).Inventory != None ) return ( ReduceDamageSimulator( Pawn(A), Level.Game.ReduceDamage(CurrentPower, 'Special', Pawn(A), None), 'Special', A.Location ) < Pawn(A).Health ); else return ( CurrentPower < Pawn(A).Health ); } // These functions simulate the effect of the target's armor absorbing damage, so the necessary damage can be found // without damaging the pawn's armor. function int ReduceDamageSimulator( pawn P, int Damage, name DamageType, vector HitLocation ) // HitLocation doesn't do anything? { local Inventory FirstArmor; local int ReducedAmount, ArmorDamage; if ( P == None || P.Health < 1 || Damage < 0 ) return 0; ReducedAmount = Damage; FirstArmor = P.Inventory.PrioritizeArmor(Damage, DamageType, HitLocation); while( (FirstArmor != None) && (ReducedAmount > 0) ) { ReducedAmount = ArmorAbsorbDamageSimulator( FirstArmor, ReducedAmount, DamageType, HitLocation ); FirstArmor = FirstArmor.nextArmor; } return ReducedAmount; } function int ArmorAbsorbDamageSimulator( inventory I, int Damage, name DamageType, vector HitLocation ) { local int ArmorDamage; if( (DamageType!='None') && ((I.ProtectionType1 == DamageType) || (I.ProtectionType2 == DamageType)) ) return 0; if ( DamageType == 'Drowned' ) return Damage; ArmorDamage = (Damage * I.ArmorAbsorption) / 100; return (Damage - ArmorDamage); } 7M"a?( SUVAZ]- *-,".  3]<Wgclass BigBeamP expands RingExplosion4; simulated function PostBeginPlay() { if ( Level.NetMode != NM_DedicatedServer ) { PlayAnim ( 'Explosion', 0.1 ); SetTimer(0.01, false); } } simulated function Timer() { local RingExplosion4 r; if (NumPuffs>0) { r = Spawn(class'BigBeamP',,,Location+MoveAmount); r.RemoteRole = ROLE_None; r.NumPuffs = NumPuffs -1; r.MoveAmount = MoveAmount; } } U/-::$a!S=a #<( Td//============================================================================= // RoastBeamP. //============================================================================= class RoastBeamP expands BigBeamP; simulated function Timer() { local RingExplosion4 r; if (NumPuffs>0) { r = Spawn(class'RoastBeamP',,,Location+MoveAmount); r.RemoteRole = ROLE_None; r.NumPuffs = NumPuffs -1; r.MoveAmount = MoveAmount; } } ]//============================================================================= // MegaRingP. //============================================================================= class MegaRingP expands RingExplosion3; Y//============================================================================= // SmokeyP. //============================================================================= class SmokeyP expands SmokeGenerator; n//============================================================================= // LargeExplosionP. //============================================================================= class LargeExplosionP expands SpriteBallExplosion; z//============================================================================= // SimpleGiantExplosionP. //============================================================================= class SimpleGiantExplosionP expands SpriteBallExplosion; ppofporogo|wvoKoo`osyWo~oyoa|eooob}^oJohoqo{|gXyWpTpA}eVo}ocoGs~vom|o{zo|bodo|}=sXoIo@ox|d|b|o@no@mUxi~B|dp[owu|toas6|nsm{l{k@U{u~`~?ss7s!oH|D@fs~@}}}~pwlNpUpkVsotozolm\o'm[mZpj\pk]$M k5YxB_FCVTCDbCA pC_ }C{\ JD}C WDUcD|C qD~z}D*$iKEzC tFwE @GE LGyC YG{K fGzN rG{_ G{R LH> YHyK eH{J rHU Hxr LI{SYIR gI{] tIV AJE NJxq [JuT hJB uJW AKvA NK{P [K{O hKyJ uKVF BL{F OL)$I\Lsh eNR rNtF ~NO KOxY WOx[ dOsC qOsY ~O\ JP] WPr^ dPzi qPy_ }Px\JQ*,$xXQ[ PS{Q ]Sss jSyx vSuOCTuQ QTz ^T~S kTX xTB EU- RU8 _Uxh kUq_ wUuR DVG PV}Q\V}R jVF wVC DWy\PWZ ^W. jW> wWF DXwzQXuM _X9 kX*YxXB QZc^Z- lZ1 yZ&F[T$_T[y] s\|O@]oM N]  []. g]O t]Y A^}PN^;$^\^G z_I$_G`uPfa5ta+BbojPb/^b(lbyQzbp!WHc$M_e75llSamstoV9Xgq%arU`t]uyRR| hd~OLd [lXk_CXb$p zejoh Or_ [oZh|L v "B_4addo\E}L S6K_t'j4c^{L AyL M{C Y'fwL ML YHf~L ty@I N6[xL QL ]L ixs us\AsL O)4r[*BM,4oOT4h~*4df;4yJI4EC