*E+@>v`V9mO+NoneSiege2xEngineCoreSystemBotpack MultiSkinsTimeraddRUPostBeginPlay GiveWeaponFireTickweapons RemoteRole OptionNamesbUnlitAltFire BeginStateStyleRotatorMFXrotXDSofMFXBeginColor DrawTypeFindInventoryType NumOfMFX TakeDamage AmbientGlow destruct sgBuilding MaxEnergyModel EndState DrawScaleAnimEnd BuildTimes BuildCosts BuildTypeExplodeCollisionRadiusCollisionHeightMesh PlayerPawn LifeSpanSetHand DownWeapon PlayRecoil MoveRocketfindP ScaleGlowVectorClientAltFire BuildTimesgConstructor ClientFireIdle ItemNameTournamentPlayerTextureReceiveLocalizedMessagePickupMessage FireSound ReduceDamageMuzzleFlashVariationsShootFinish SetTwoHandsPlayRepeatFiringPhysics PlayIdleAnimSpriteProjForwardGiveToDrawTwoColorID FindEnemy GiveAmmo sgEnforcer PickupSound AmmoNameFlying GetBigFontsgNukeLauncherspeed WarnCannons FinishingsgINukeBuildMsg GetSmallFont ClientActive PostRendersgHUDPawnshot2sgNukeBuildMsg sgSProtector Repeater Destroyed sgSpecial sgProtector ZoneChange sgWarShellDamageBringUpUseAmmo GetFreeMoveSetDisplayProperties SoundRadius DeathMessagePickupAmmoCount ShakeView GetColor MiscSound ImpactSound PlayFiringMomentumTransferInventoryGroup ProcessTouchbBeepT2 TraceFireClientReceive PlaySelect GetString ChangeMode FireEffectSwitchToBestWeapon SoundVolumercRenderOverlays hitdamageSetSwitchPriority ServerMoveSwayWeaponDescriptionbAlwaysRelevantInstFog ScoreKill LogPickupPutDown WeaponSetClientUpdatePositionSetDefaultDisplayPropertiesBuild SightRadiusTraceIdentify InstFlash SetIDColorGetMediumFontDrawNameAndPingbCollideWorld TrackWarhead RateSelfsgCoreWarnMsg LightEffect AmmoAmountMaxAmmo teamcolorsClientAdjustGlowGuiding DropFromoc SetUpSlaveProjectileTypebMeshEnviroMapLightBrightnessbFixedRotationDir SelectSound AlwaysKeep shakemagSkin shakevert GetWeaponplaceItPickupViewMesh sgNukeRingAutoSwitchPriorityPlayerViewMeshIcon RefireRateTwiddlePlayerViewOffsetAltRefireRate NameColorThirdPersonMesh StatusIcon exploded interact AIRatingMover sgResourcesHitWallClientAdjustPositionHealth FiringSpeed MyDamageType AltFiring FireOffset bNoSmooth LightRadius sgSupplierX NormalFire getIActor AltFireSound sgSupplierActiveMass StopFiring ShowScores BeginPlayLightSaturation LightTypeBotDesireabilityAdjustDesireFor TweenDown AmbientSound SetRespawnUserLODBiasshot bProjTargetbBlockPlayersClientSetRotation GameName SpectatorProcessTraceHit ViewportMessageNoAmmoPlayAltFiringbNetTemporarySwitchPriorityLogin BobDampingCheckReplacementEndGamebCollideWhenPlacing shaketime RespawnTimeAddDefaultInventoryFeigningDeathMaxDesireability SoundPitch BecomeItemSuggestAttackStyle FlashLength bBlockActors bCanThrow NetPrioritySetWeaponStayHandlePickupQueryPickupFunction LightPeriod MuzzleScaleProjectileFireClientInstantFlashbHiddenCarcassIdle2bAltInstantHitds GreyColorsgAmmo sgWarheadsgPRI sgNukeFlash sgProtProj sgMeshFX sgIWarheadsgEClipsgDoubleEnforcersgGuidedWarshell sgContainerX sgContainersgArmorSiegeGI sgBaseCore TimeLimit sgNukeFlamebSpawnInTeamAreaTourneyMessage ReadyMessageDoubleSwitchPriorityFlashO SendFireFlashCUpdateRealWeapon FlagBase SendAltFireFlashY DrawTeam Misc3SoundbDrawMuzzleFlashRedeemerDeath ClientDown CockingSoundClientAltFiring TeamCannon TeamGamePlusStationaryPawnsgTrail bOwnerNoSeebAltWarnTarget sgSProtProj sgSetBases sgScoreBoard sgInnerWave ReloadCount sgProjImpsgFlashDrawIdentifyInfo sgParticle SortScores DrawHeaderMuzzleFlashMeshdoubleenforcerMuzzleFlashScaleAbsorptionPrioritybMuzzleFlashParticles bIsAnArmor DoubleNameArmorAbsorption StartMessageExplosionDecalHUDTypeChargeGameEndedMessageStartUpMessage Misc2SoundDrawGameSynopsis ClientFiringPriorityObjective Misc1Soundcol bSpecialIconProjectileClass Rotation bWarnTarget sgHealthPod bInstantHit DrawTrailerEjectScoreBoardType SCUBAGearT1 LightHueFlashS MapListType MapPrefix ChangeSoundbSplashDamageAltProjectileClassBotMuzzleFlashTexturesgSWave enforcerMuzzleFlashStyle gamegoal MFTextureValuebSuperRelevant BaseMutator NextMutatorPortal LocalLogXPosNewRot WorldLogYL bEnviroMap Handedness bLighting NewTextureXLinjured bDropDetail NewStyleOwner RelatedPRI_1 aClassName EndTraceYPosRegion Instigator bIsSpectator FlashCountOldFlashCountClipY PlayerNameodistClear TeamName PawnList AlreadyHasdesire bUseAltMode PawnOwner PlayerOwner DefaultFOV PRIArrayNetMode Acceleration Velocity AmmoTypeVictims instigatedByCurrentNetSpeed ERenderStyle bWeaponUpbChangeWeaponOptionalObject bWeaponStay TimeSeconds bHideWeapon bHeldItem bTossedOut PointRegion DesiredFOVProjectileSpeed Location ViewRotation FreeMoves HitNormal bNetInitial nextPawnbHighDetailMode WhiteColorPlayerReplicationInfoClass HitLocationSoundDampeningBaseEyeHeightZone Momentum actualDamageTargetGame projStartPRI AccuracyHitNormbWaitingPlayer Buoyancy RotationRateTeam AnimSequencebFeigningDeathWallbFire bAltFireScore NextMoveClipXCurY DieCount KillCount bWaterZone DrawColorbLowResTestEffectsEnemyCopy ShockRifle ut_biorifle DamageType PulseGun SniperRifleripper minigun2UT_FlakCannon UT_EightballScroll OldClipYIcons OldClipXFPT TeamColor AltTeamColorTeamstemp bTeamGametrailAItembUpdatePositionMDStartLocationPendingWeapon SmallFontEZSetPosBubble1 TeamInfo bPointingCocking bCanFire FireSpottargPickups WeaponPickup NewLocationNumOther ClientLoc DeltaTimeCalcDrawOffset DelayTimeNewLocXWeaponPriority StartTrace DrawIconbOwnsCrosshairCarriedbSetUpXStart Crosshair6IdentifyFadeTimeIdentifyTargetSkinsYflak AltAccuracy AnimFrameRandRotplasmaM SmokeRate InitialDirhitDirWNewZone CurrentMoveDir realbRun DeltaPitchYawDiff PitchDiffPitch WeaponClassRollDeathMatchPlusi ScriptTextS bIsPlayer LocalMessageB realbDuckYawR bRealJumpbIsPawnLastUpdateTime ReturnValueTournamentWeaponDynamicLoadObjectScaleMutator ChallengeHUDWeapon NewWeaponRollMagChallengeTeamHUD bMuzzleFlash LevelInfo GameInfo damageScaleUT_SpriteSmokePuff PathNode Projectile ZoneInfoKiller SpawnClassHUD SavedMovePlayerReplicationInfoStatLoghandP RelatedPRI_2bTempTeamScoreBoardOctGemDiamondCubeGemCrystalGameReplicationInfoTournamentAmmo BigSprocketTournamentPickup bNetOwnerAmmo WeaponScale HUDScalePlayersNotShownmissile ViewTargetAmountPlayOwnedSound CountDownYStartLightSmokeTrail UTSmokeTrail Inventory UT_WallHitTournamentGameReplicationInfo WarHeadAmmoUT_LightWallHitEffectUT_SpriteBallExplosion ShockWaveShockrifleWaveRedeemertrail NuclearMarkTournamentScoreBoard FontInfoLocalMessagePlusCriticalEventPlusPickupMessagePlusAutoMag FireAdjust CTFMapList UT_ShellCasebNovicebRequireReadyOrdered ScoreStartMyFonts CanvasFont OwnerInfo OwnerGame LongLists BottomSlot LadrStatic Static_A00bHideAllWeaponsXScale TitleString ValueStringX1 AffectorbCanClientFire UseAutoMMuz1Muz2Muz3Muz4Muz5MagPick AutoHandAutoMLAutoMRE_ShotmuzzEF3Muzzy2SlaveEnforcer bIsSlave bFirstFire bBringingUp bBringUp RealOffset realhandWarHeadWHPickWHHandReadoutGuidedX Redeemer WarheadShotWarheadPickupUseWarH GuidedShell GuidingPawn bGuiding bShowStaticStartRotation numReadoutsArmorUTWarFly CannonTimerGuider ClientBuffer ServerUpdate bDestroyed RealLocation RealVelocityCurrentVelocityGuideRotationOldRoll SmoothRoll OldVelocity ShockSize ShockWavemMoScale UTsRingex bCompressedsgMedia sgProtPhitFGFXX WaterRingSFX sgProtShot sgProtPhitWsgChngsgNoRUs sgCnstrct sgRepair sgUpgrade sgStockUp sgPickRUs sgProjFront sgProjSide TimeStamp sgEnvSkinT0sgProtSpriteT0 sgEnvSkinT1sgProtSpriteT1sgWarSpriteT0sgContSpriteT0sgContSpriteT1sgWarSpriteT1sgSupSpriteT1sgCoreSpriteT1sgSupSpriteT0sgCoreSpriteT0DeltasgNUKE sgInnerExp SavedMoves sgWarning sgWarAppear sgGetNukesgNuke2PickupCanvasFriendlyFireScaleCurrentTimeStamp clientErrFontNewMoveLocDiffLevelGoalTeamScoreGRIXOffsetActorNewVelXLodMeshNewVelYPlayerNewVelZNewLocZOptions TempScore PlayerCountSound PlayerCountsErrorYOffsetLoopCountTeamRoleNewLocYStaticClass TinyRedFontNDamagerealLocPackageSwitch TextBufferObjectEnum buildcostenergyscountgrademyFXvelo Function texturedonedoneYetpwnStateplayedsDirStruct UnrealShare ChunkHitUnrealI StrPropertyStructPropertyIActorsOptionClassProperty delatime NamePropertytmpObjectPropertyRUFloatPropertymaxRUsGuidedRotation BoolPropertyITarget IntPropertyOldGuiderRotation DeltaYawdone1done2 BytePropertyv U ::$ 6)6%]f?b)t{#U{#U}"#t{#U{#Ut{#UtI^C7^C7GɰGɰGɰGɰGɄt{#U{#U6$A $B@"F+#$=H$Acj)$A*$AUStS\SY dFzY oF= ::$I璆{#U / / {Y tx xMR- ::$2}v&̻vvvvѸBttt> Y> Y> Y> Y> Y> Yvvvv> YvѸBtttѸBtѸBtvѸBttvvѸBttvvvԝX> Y> YR@GtxxtxxxxѸBttXu6> Y> YttѸBttԝXL]vv> YГГvtvtvГГ& & ГԝX}MԝXԝXԝXԝXttvvvѸBvѸBvvѸBvѸBvѸBvѸBttX'vvvԝXѸBt> YvA"~]Double EnforcerAAAAAX"E]Classification: Light PistolQ$LG:4CaCBO@l"QAA$?D:4 BZh$HCj$@{$>r$L?u$R^??Jefk]*)%k riddled %o full of holes with the %w.v*b{$?_$=Y$ ף<[$)\=s$ ף]! You picked up another Enforcer!:] Enforcert:433S@@pmwx|bxz$ ף=_Nq~+ES)$A*$@AM$pA ] S 8nrE?% #??&g?,  #>44?,g?, ?&e%0e&&6v@6v@6v@R?La ^ 9vRL L ReiB?%p6rY*e%#ewYa Y P#YNYu6Y D?6G6Y D?6G6Y D?6GeWa mL?@L???&4 { oQ ::$68 /}"#tttX'X'X'X'X'X'X'tX'> YX'tX'ttX'ѸBtI璄t{#UtI璄tt{#Ut{#Ut{#UtI璄t{#UtI璄t=$:etԝX'xI3e 'xI{#U3e ЃԝXԝXԝXԝX> YUS"dE]Siege2x - Redone by TinyTim.V]Waiting for more recruits.W]You are READY for Battle!@]The Battle has begun!D]has won the Battle!c])(units of crystal damage wins the match.T_BGYZ]CTF^] Siege2x Gameg ba:.H,&[[,%v%%&==,4?,g?, a=' _  e y n  ::$;G;;;;;;;;;;;;B$C-$AN: +#$Ct?k   j |7- ::$2e4&̻tѸBtI璄tttѸBtI璄tI璃ԝXtԝXtt)6%])6%]ԝXttI璄t{#UԝXtt{#Ut{#UtttI璄ttI)6%])6%])6%]tI)6%]tI璄t{#UԝXtttI璄tI璄tI璄tI璄tI璄t{#UtI璄tt)6%])6%]tI)6%]tI)6%])6%]t{#UԝXt)6%]{#Ut{#UtI)6%])6%]ԝXttѸBtI璃ԝXt> YԝXt] Protector  SuperProt  Supplier  SupplierX  HealthPod  ContainerCubeX Warhead  IWarhead Upgrade Repair Remove[%"%%-%<%-%%%x%&$B&C&C&HD&zC&B&aD&D&D'Y'A's'J'R'l'o'p'ZOJuS?JFab] has no RUs.k]%o was killed %k's Orb.s >]'&You are equipped with the Constructor:] Constructor^YR- ::$2Vjj&̻ѸBttt> Y> YԝX> Y> YK?sK?sוѸBXu6tԝXѸBttt{#Ut{#Uxxt> YtK?s׏> YK?s׌ttt{#Ut{#UxxttѸBL]L]ttL]{#Ut{#Utt}"#tttL]tԝXѸBf;)kxxxxxԝX> YK?s׉xxxxxxxxxE]&%Classification: Thermonuclear DeviceQ$̾G:4mD"DCOql"Ol\LA$?D:4A MM]Kh$Ck$L>j$@{$?r$>u$>?fk]%o was vaporized by %k's %w!!v*o s >]You got the NukeLauncher.:] NukeLauncherl$pBt:4ff??pg$y?mwxNq+ESj@~p)$4B*$AUu\@t_ ew l R 6+'xI)6%]t{#U{#U}"#{#U}"#}"#}"#}"#t{#U{#Ut{#UtI璌ttt{#U{#Uxxt}"#I璆{#UI璆{#U}"# $@F$ @!":UL G h|`/{@ju!oKMX]i_ Qf-FK |k Mr k MO::$::$--::$ -::$#WK?sMٌ> YR~R~xxxtxxxxxxtt> Ytt> Y> YR~R~R~R~R~R~R~R~> Yt> YtX'tjj> YtX'tjjtjjttt> YR@GR~R~R~R~R~R~R~R~R~R~> YR~R~R~R~tjjjj1IS$Dj}v$@@gygn^E z {DDPVNiRxub!n8d  Ix P2h6*Xu6>]! You are equipped with an Armor.:]ArmorC""U}{"o$@Ngid  hca ma a w W sm@DG-$><#$0@3$@@yR bsDd VjQQcbo 7xZl}~FJy AESKj enw['e Z| u^C7GF-$?<3$`hTiHX ,4!dprsK C|( LB^n~ rz7y-G-$L><#$L?e ,}Rf'iQ ^ 6A )6%]tt{#U{#Ut)6%]ttԝXԝXԝXt)6%]ԝXԝXԝXԝX_ԝX{#U?bA $@E$@@!": N N NO$;ENSAz!fB ,r*L.g&q!H-'-'8B~w*.0@-. 0wL> R^F Td : ::$#M٢_ԝX11!t"!t"ڌttttttt- 1I@$AS$;De$zDr"BcpoAdSV+Nj~)$pA*$A[[CePlHsa \::$ V@HMk:k:V.n?V:k:n?n?&?, kn?.kn?,?VZ?% vG\! -'-'h>6r*L.%xw*.0@@-.0?5Gq!C ZnHZ b 6Yw)6%]tt{#U{#Ut)6%]ttԝXԝXԝXt)6%]ԝXԝXԝXԝX_ԝX{#U?bk $D$?!": N N NO$;ERY&\Xcq@ jf;)kGɄtkF <#$?@H$BjZJ`ixK GɌttt> YttԝXԝXԝXԝXԝXԝXԝXԝXFF-$33?+ecrkvuZfyI^t~@@|{WTbW`8nwg*ga !dn D2JQ?L#!Z"["dI@MU~ 7eW_OqSx. d\r`abPXdj^\#a/!, ^ g&NwN*Na/!;8:N:.gSiege2x.sgnukebuildmsg .N =g&NNJ.m-'. 0q5.K|-5a.55.5q!^ z[G@j p q!{ i h 'w q!N  7{q E 6p])6%]ttt{#U{#UtX'ѸBX'ѸBtt> Yttt{#U{#Uxxt{#U6$B$?!": NO7soNdG3G2 KE D DQOw..*D.. hM{q @7}^DEbkMMRv G 6Jz)6%]ttX'ѸBX'X'ѸBX'X'ѸBX'ѸBX'ѸBX'ѸBtГГГГttttt{#U{#U{#U     6$pB $`F$@!":  HLVwIpzv]o }2S/Xu6tI>]You picked up some Resources.:]RUsN<3$@Tw ]M BYZt_VwVb`^m XochH@MA H" kJ%_11ٳcٳcٳcٳct{#UYwŃԝXԝXS$@De$pAr"Lpoi+#$>3$@)$@*$@^ Z O 6#lR3j)6%]t{#U{#U}"#t{#U{#Ut{#UtI璌 /{#U /{#U /{#U /{#Ut{#U{#U)6%])6%])6%]{#U $D$ @!": )$B*$Bn;HB?,2j%j,,xt6x?6x?6x?a [ 9x?,j%B?,d/a8 ;?,; ru?,r?,;a/![;a/!|;a/!d;dDu?,; ի?;;#!y10 \ /ec::$B?,dC?, g } N 6#ol._)6%]t{#U{#U}"#t{#U{#Ut{#UtI璌 /{#U /{#U /{#U /{#Ut{#U{#U)6%])6%])6%]{#U $`F$ @!": )$B*$BpqWK K 6s^)6%]ttX'ѸBX'X'ѸBX'X'ѸBX'ѸBX'ѸBX'ѸBtГГГГttttt{#U{#U{#U         6$4B $D$@!":k@t@s W]yBu@ay K2@\2/L#!Z"["dmV m" A 4 _11ٳcٳcٳcٳct{#UA ԝXԝXS$@De$Ar"Lpoi+#$?3$@)$@*$@cSCiP o p EÏ%ixK ԝXԝXԝXԝXԝXԝXԝX-$@3$@@H$ARY dW$QF^ m >m9,::$mm?,2 e ~Z6XGj`WxxxxxxxxxxflUx> Y;(tt{#UxflUxxxxxxxxxxxxxxtI璄txxxt4t4xt4xt4t4t4t4tt{#UxflUxt{#Utxt{#UxflUxt{#U)6%])6%]xxflUx)6%]xԝXttԝXt{#UX\*SS\ddC*mJ @n::$JwJ*Ja/!, J ? .J.m?PCIJ  AJJ"ta=a@aa@?w*b Aa=' H LIU ^zel f P 6RqG)6%]ttГГГГtttttttt{#U{#U{#U6$4B $;E$?!":BQ FPf S \jGrg*ga jiGj?Tj?6-::$ai( --a a iCi>Ga G$ai( Txr IYɰG)6%]FY$?ceb J 6Z{")6%]ttt{#U{#UtX'ѸBX'ѸBtt> Yttt{#U{#Uxxt{#U6$pC $PCG$?!": Ngt T[:oG-$L?<#$HBMNiP o2K_6Bst> Yxx> Y'n 6> Y'n 6{#U{#U{#UxflUxxxxxxxx{#U{#U{#Uxxxxxx{#U{#U{#U{#U{#U{#U{#U{#U{#U{#U{#U{#U{#UxflUxxxxxxxxxx;(xxx;(xflUxxxxflUxxxm_G`Em@D#$AH$CZIf0 w*Df-D' kcH(a!Vff?L=-u' 6cAwl33>Nw*-A@@A@?@@a/!^.-AAff>Al fl5-/::$ r*%Vw*|$@.'( oPql PwP*Pa/!;8:P:.^Siege2x.sgnukebuildmsg .P =^&PPa! >$@. E>//============================================================================= // sgScoreBoard. //============================================================================= class sgScoreBoard expands TeamScoreBoard; function ShowScores( canvas Canvas ) { local PlayerReplicationInfo PRI; local int PlayerCount, i; local float LoopCountTeam[4]; local float XL, YL, XOffset, YOffset, XStart; local int PlayerCounts[4]; local int LongLists[4]; local int BottomSlot[4]; local font CanvasFont; local bool bCompressed; local float r; OwnerInfo = Pawn(Owner).PlayerReplicationInfo; OwnerGame = TournamentGameReplicationInfo(PlayerPawn(Owner).GameReplicationInfo); Canvas.Style = ERenderStyle.STY_Normal; CanvasFont = Canvas.Font; // Header DrawHeader(Canvas); for ( i=0; i<32; i++ ) Ordered[i] = None; for ( i=0; i<32; i++ ) { if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) { PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; if ( !PRI.bIsSpectator || PRI.bWaitingPlayer ) { Ordered[PlayerCount] = PRI; PlayerCount++; PlayerCounts[PRI.Team]++; } } } SortScores(PlayerCount); Canvas.Font = MyFonts.GetMediumFont( Canvas.ClipX ); Canvas.StrLen("TEXT", XL, YL); ScoreStart = Canvas.CurY + YL*2; if ( ScoreStart + PlayerCount * YL + 2 > Canvas.ClipY ) { bCompressed = true; CanvasFont = Canvas.Font; Canvas.Font = font'SmallFont'; r = YL; Canvas.StrLen("TEXT", XL, YL); r = YL/r; Canvas.Font = CanvasFont; } for ( I=0; I 1 ) && ( PlayerCounts[Ordered[I].Team-2] > 0 )) { BottomSlot[Ordered[I].Team] = 1; YOffset = ScoreStart + YL*11 + LoopCountTeam[Ordered[I].Team]*YL; } // Draw Name and Ping if ( (Ordered[I].Team < 2) && (BottomSlot[Ordered[I].Team] == 0) && (PlayerCounts[Ordered[I].Team+2] == 0)) { LongLists[Ordered[I].Team] = 1; DrawNameAndPing( Canvas, Ordered[I], XOffset, YOffset, bCompressed); } else if (LoopCountTeam[Ordered[I].Team] < 8) DrawNameAndPing( Canvas, Ordered[I], XOffset, YOffset, bCompressed); if ( bCompressed ) LoopCountTeam[Ordered[I].Team] += 1; else LoopCountTeam[Ordered[I].Team] += 2; } } for ( i=0; i<4; i++ ) { Canvas.Font = MyFonts.GetMediumFont( Canvas.ClipX ); if ( PlayerCounts[i] > 0 ) { if ( i % 2 == 0 ) XOffset = (Canvas.ClipX / 4) - (Canvas.ClipX / 8); else XOffset = ((Canvas.ClipX / 4) * 3) - (Canvas.ClipX / 8); YOffset = ScoreStart - YL + 2; if ( i > 1 ) if (PlayerCounts[i-2] > 0) YOffset = ScoreStart + YL*10; Canvas.DrawColor = TeamColor[i]; Canvas.SetPos(XOffset, YOffset); Canvas.StrLen(TeamName[i], XL, YL); Canvas.DrawText(TeamName[i], false); Canvas.StrLen(int(OwnerGame.Teams[i].Score), XL, YL); Canvas.SetPos(XOffset + (Canvas.ClipX/4) - XL, YOffset); Canvas.DrawText(int(OwnerGame.Teams[i].Score), false); if ( PlayerCounts[i] > 4 ) { if ( i < 2 ) YOffset = ScoreStart + YL*8; else YOffset = ScoreStart + YL*19; Canvas.Font = MyFonts.GetSmallFont( Canvas.ClipX ); Canvas.SetPos(XOffset, YOffset); if (LongLists[i] == 0) Canvas.DrawText(PlayerCounts[i] - 4 @ PlayersNotShown, false); } } } // Trailer if ( !Level.bLowRes ) { Canvas.Font = MyFonts.GetSmallFont( Canvas.ClipX ); DrawTrailer(Canvas); } Canvas.Font = CanvasFont; Canvas.DrawColor = WhiteColor; } h\.{ m\?,-' "-(666666?,d JqApP$@.a!B?R> ף< rfOS smrdn  qG n p ix=$:eԝXԝX'xI3e 'xI{#U3e ЃԝX=$:ee //============================================================================= // sgSetBases. //============================================================================= class sgSetBases expands Mutator; function bool AlwaysKeep(Actor Other) { local bool bTemp; if ( Other.IsA('StationaryPawn') ) return true; if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local sgbasecore b; if ( Other.IsA('FlagBase') ) { b=spawn(class'Siege2x.sgBaseCore',,,other.location); b.team=flagbase(other).team; b.playerreplicationinfo.team=flagbase(other).team; log("I set a "@other@" with "@b); return false; } bSuperRelevant = 0; return true; } QWJA.MrA*%rA*Q%MA6w6*6- w6A w6MR-3:A:6)M 6 ?Ia/!h(:. IA, b$6 M M A ?@?66|33> Jx H% 5wL -( dENw*|sw.*.}L#CaCB.m$@.a!\333?>L= VAL"Ha-q!/-'-'/-::$ w*a/!;w.*".a/!a:.%.Z/:.%.^//-.\C 8 w saBaseCore4.?4a=' gJ^'$a?-E' {Js!0$- @?q!/,-'' $,=r-D(p-pw* a!Xba! a!aq!pqa RG:Wr Cu? !sa!s?>Ua!DL>> uY--Q-SEr*a f  r% -Qa-Q-S $0 Ca/!,.* 5 YdDXDn??D D8??d?,n??X?,n-$$ neX,,U%Ue??oU,ovoo% ?U% ||l" -( @""-D( C <S -E Bw5*5!(5 #?-'q!U fBb  b ViU60 DK|o%-Q'-E(za/!,y.j. .]L#HC V7HN#v.X  ~r7X r7*X?&.X HKKw7*7:7:X7?&.7 HBK7?&.7 HXH7X h//============================================================================= // sgProtector. //============================================================================= class sgProtector expands sgBuilding; var() sound FireSound; var() class ProjectileType; var rotator sDir; var actor targ; function postbeginplay() { super.postbeginplay(); playerreplicationinfo.playername="Protector "; } function Shoot() { local Vector FireSpot, ProjStart; local Projectile p; if(vsize(targ.location-location)1 || sgbuilding(targ).energy>0)) sdir = rotator(targ.Location - Location); else return; PlaySound(FireSound, SLOT_None,0.75); if(grade>2) { FireSpot = targ.Location + FMin(1, 1.1 + 0.6 * FRand()) * (targ.Velocity * VSize(targ.Location - location)/ProjectileType.Default.Speed); if ( !FastTrace(FireSpot, ProjStart) ) FireSpot = 0.5 * (FireSpot + targ.Location); sDir = Rotator(FireSpot - location); } p = Spawn (ProjectileType,self,,location,sDir); } function FindEnemy() { local Pawn P; sightradius=1000+1750*grade; foreach radiusactors(class'pawn',p,sightradius) { if(fasttrace(p.location) && p.playerreplicationinfo.team!=playerreplicationinfo.team && (p.health>1 || sgbuilding(p).energy>0) && p.bprojtarget) { if(targ==none) targ=p; if(vsize(p.location-location) < vsize(targ.location-location)) targ=p; } } } function timer() { super.timer(); if(frand()<0.05+grade/20 && scount<=0) { findenemy(); shoot(); } } MT.s"T?,-'T _w*DT?%T.T-(TT?&   F"dQ-Q(Owy*y]L>#Hy ]jy* _"./#!w*q! zWU4a>-S(a?q!9 $NDSq r* Gw.*.?,.@ dr .?o. wxaF-'KL.$=-xfDq!@ Q v SY//============================================================================= // sgSupplierX. //============================================================================= class sgSupplierX expands sgBuilding; var() class weapons[5]; var pawn p; function postbeginplay() { super.postbeginplay(); playerreplicationinfo.playername="SupplierX"; } function findP() { local pawn pwn; foreach radiusactors(class'pawn', pwn, 60) { if(pwn.bisplayer && pwn.health>0 && pwn.playerreplicationinfo.team==playerreplicationinfo.team) { p=pwn; return; } else p=none; } } function timer() { local int num, i; local inventory w; super.timer(); if(scount>0) return; num=3; if(grade>=2) num=3; if(grade>=4) num=4; if(grade==5) num=5; if(p==none || vsize(location - p.location)>60) findp(); if(p!=none) { for(i=0; i>bծL>L>iծ>?[?,&rE- w*a  |}P}#a  |}P}wE wE wE*eL>b?,E+~.|;EbE-Ea/!a  |}?, Ea  @ B n -S' L[9n -(Hw*%.}m:.% :.%v!$ V //============================================================================= // sgSWave. //============================================================================= class sgSWave expands Effects; var float ShockSize; var rotator hitnorm; simulated function Tick( float DeltaTime ) { if ( Level.NetMode != NM_DedicatedServer ) { ShockSize = 100-(100*lifespan/default.lifespan); ScaleGlow = Lifespan/default.lifespan; AmbientGlow = ScaleGlow * 128; DrawScale = ShockSize; } } simulated function Timer() { local actor Victims; local float damageScale, dist, MoScale; local vector dir; local rotator randrot; local int i; ShockSize = 50-(50*lifespan/default.lifespan); for(i=0; i<4+rand(3); i++) { randrot=hitnorm; RandRot.Pitch += Rand(32750)-16375; RandRot.Roll += Rand(32750)-16375; RandRot.Yaw += Rand(32750)-16375; Spawn(Class'Siege2x.sgnukeflame',,,Location+vector(randrot)*(shocksize*29)); } ShockSize = 100-(100*lifespan/default.lifespan); foreach VisibleCollidingActors( class 'Actor', Victims, ShockSize*29, Location ) { dir = Location - victims.Location; dist = VSize(dir); dir = normal(dir); //MoScale = 100*(ShockSize*29-(dist/(ShockSize*29))); MoScale = ((ShockSize*29)-dist)/(shocksize*29); if(victims.isa('pawn') || victims.isa('mover') || victims.isa('sgWarshell')) Victims.TakeDamage ( MoScale*150, Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, vect(0,0,0), 'exploded' ); } } simulated function PostBeginPlay() { local Pawn P; if ( Role == ROLE_Authority ) //mind me!!!!!!!!!!!!!!!!!!!!!!!!!! { for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.IsA('PlayerPawn') && (VSize(P.Location - Location) < 3000) ) PlayerPawn(P).ShakeView(0.5, 800000.0/VSize(P.Location - Location), 10); hitnorm=rotation; rotationrate=rotrand()-rotrand()*1.5; if ( Instigator != None ) MakeNoise(10.0); } SetTimer(0.1, True); } ">* \r//============================================================================= // sgResources. //============================================================================= class sgResources expands TournamentPickup; function PickupFunction(Pawn Other) { sgpri(pawn(owner).playerreplicationinfo).addru(15); super.pickupfunction(other); destroy(); } wP/%R %.(w*aL>(&a?( abY  ? c~E~:. % c VtkQ% hf I//============================================================================= // sgSProtector. //============================================================================= class sgSProtector expands sgBuilding; var() sound FireSound; var() class ProjectileType; var rotator sDir; var actor targ; function postbeginplay() { super.postbeginplay(); playerreplicationinfo.playername="SuperProtector "; } function Shoot() { local Vector FireSpot, ProjStart; local Projectile p; if(vsize(targ.location-location)1 || sgbuilding(targ).energy>0)) sdir = rotator(targ.Location - Location); else return; PlaySound(FireSound, SLOT_None,0.75); if(grade>2) { FireSpot = targ.Location + FMin(1, 1.1 + 0.6 * FRand()) * (targ.Velocity * VSize(targ.Location - location)/ProjectileType.Default.Speed); if ( !FastTrace(FireSpot, ProjStart) ) FireSpot = 0.5 * (FireSpot + targ.Location); sDir = Rotator(FireSpot - location); } p = Spawn (ProjectileType,self,,location,sDir); } function FindEnemy() { local Pawn P; sightradius=1000+1750*grade; foreach radiusactors(class'pawn',p,sightradius) { if(fasttrace(p.location) && p.playerreplicationinfo.team!=playerreplicationinfo.team && (p.health>1 || sgbuilding(p).energy>0) && p.bprojtarget) { if(targ==none) targ=p; if(vsize(p.location-location) < vsize(targ.location-location)) targ=p; } } } function timer() { super.timer(); if(frand()<0.05+grade/10 && scount<=0) { findenemy(); shoot(); } } a Dx$!DCSBc !O#//============================================================================= // sgSProtProj. //============================================================================= class sgSProtProj expands Projectile; var bool bLighting; var float DelayTime; ///////////////////////////////////////////////////// auto state Flying { simulated function ProcessTouch( Actor Other, Vector HitLocation ) { local int hitdamage; local vector hitDir; if (Other != instigator && pawn(other).playerreplicationinfo.team!=sgSProtector(owner).team) { if ( Role == ROLE_Authority ) { hitDir = Normal(Velocity); if ( FRand() < 0.2 ) hitDir *= 5; Other.TakeDamage(damage, instigator,HitLocation, (MomentumTransfer * hitDir), 'sgSpecial'); other.PlaySound(MiscSound, SLOT_Misc, 0.7,,, 0.75+FRand()*0.5); spawn(class'Siege2x.sgprojimp'); } Destroy(); } } simulated function HitWall( vector HitNormal, actor Wall ) { Super.HitWall(HitNormal, Wall); if (FRand()<0.3) PlaySound(ImpactSound, SLOT_Misc, 0.5,,, 0.75+FRand()*0.5); MakeNoise(0.3); spawn(class'Siege2x.sgprojimp'); destroy(); } simulated function Timer() { local bubble1 b; if (Level.NetMode!=NM_DedicatedServer) { b=spawn(class'Bubble1'); b.DrawScale= 0.1 + FRand()*0.2; b.SetLocation(Location+FRand()*vect(2,0,0)+FRand()*Vect(0,2,0)+FRand()*Vect(0,0,2)); b.buoyancy = b.mass+(FRand()*0.4+0.1); } DelayTime+=FRand()*0.1+0.1; SetTimer(DelayTime,False); } simulated function ZoneChange( Zoneinfo NewZone ) { if (NewZone.bWaterZone) { Velocity=0.7*Velocity; DelayTime=0.03; SetTimer(DelayTime,False); } } function BeginState() { local rotator RandRot; Velocity = Vector(Rotation) * speed; RandRot.Pitch = FRand() * 200 - 100; RandRot.Yaw = FRand() * 200 - 100; RandRot.Roll = FRand() * 200 - 100; Velocity = Velocity >> RandRot; if( Region.zone.bWaterZone ) Velocity=0.7*Velocity; } } /////////////////////////////////////////////////////// simulated function Explode(vector HitLocation, vector HitNormal) { } simulated function AnimEnd() { Destroy(); } v"?w*q! dl 79:. % ~ p,1&w* 5 a?( }>+-D()w*q!X ]XnX%]_  \5'-85\( N $R?- rNzV8N%An Invincible Nuke is about to be created!!NUCLEAR LAUNCH DETECTED!  znd?%}f1k }utk CqX?|@wkx']kcPzyDc%ka  @[ka  @ !rS |rT,.r w,*n---w,*?, R-r,*1,, r,*>|,%>|,?>?,?,rr*r>@|| QMu =5-_-_'-w*M-_( B@J; q!/' $i;G ~A9;-(=w*%.}a!DL>=t:.%8 :.%8 r q&!w*   Iv LzJ,L%A Nuke is about to be created!!NUCLEAR LAUNCH DETECTED!  y0P8%%C&%C/a0 05w.0*@a ' 0 @:.0@.04w.0*0a/!}0a/!U0a44w.0* L>a S 0 10 { L#//============================================================================= // sgProtProj. //============================================================================= class sgProtProj expands Projectile; var bool bLighting; var float DelayTime; ///////////////////////////////////////////////////// auto state Flying { simulated function ProcessTouch( Actor Other, Vector HitLocation ) { local int hitdamage; local vector hitDir; if (Other != instigator && pawn(other).playerreplicationinfo.team!=sgProtector(owner).team) { if ( Role == ROLE_Authority ) { hitDir = Normal(Velocity); if ( FRand() < 0.2 ) hitDir *= 5; Other.TakeDamage(damage, instigator,HitLocation, (MomentumTransfer * hitDir), 'sgSpecial'); other.PlaySound(MiscSound, SLOT_Misc, 0.7,,, 0.75+FRand()*0.5); spawn(class'Siege2x.sgprojimp'); } Destroy(); } } simulated function HitWall( vector HitNormal, actor Wall ) { Super.HitWall(HitNormal, Wall); if (FRand()<0.3) PlaySound(ImpactSound, SLOT_Misc, 0.5,,, 0.75+FRand()*0.5); MakeNoise(0.3); spawn(class'Siege2x.sgprojimp'); destroy(); } simulated function Timer() { local bubble1 b; if (Level.NetMode!=NM_DedicatedServer) { b=spawn(class'Bubble1'); b.DrawScale= 0.1 + FRand()*0.2; b.SetLocation(Location+FRand()*vect(2,0,0)+FRand()*Vect(0,2,0)+FRand()*Vect(0,0,2)); b.buoyancy = b.mass+(FRand()*0.4+0.1); } DelayTime+=FRand()*0.1+0.1; SetTimer(DelayTime,False); } simulated function ZoneChange( Zoneinfo NewZone ) { if (NewZone.bWaterZone) { Velocity=0.7*Velocity; DelayTime=0.03; SetTimer(DelayTime,False); } } function BeginState() { local rotator RandRot; Velocity = Vector(Rotation) * speed; RandRot.Pitch = FRand() * 200 - 100; RandRot.Yaw = FRand() * 200 - 100; RandRot.Roll = FRand() * 200 - 100; Velocity = Velocity >> RandRot; if( Region.zone.bWaterZone ) Velocity=0.7*Velocity; } } /////////////////////////////////////////////////////// simulated function Explode(vector HitLocation, vector HitNormal) { } simulated function AnimEnd() { Destroy(); } G ^L H'Lw*aL>(a1-q!97C <f}%#!w*q!/ L _iik iK-_-_'Cw*i_`-a-b-_(_`-a-b ma@p42:%-,I&.w&*p&& eD&::$ e,-' -r &?- w*&r&*&?%g!\ @33?!\> @h-w*- r&*$aew*Q-D-D(y @asaw&*&?e  T"@0 E:F0!w*  K m9. a/!_- %  Botpack.Impacthammer Botpack.PulseGun Botpack.ShockRifle Botpack.UT_FlakCannon Botpack.UT_BioRifle Botpack.Minigun2 Botpack.SniperRifle Botpack.Ripper Botpack.UT_Eightball Siege2x.sgconstructor Siege2x.sgconstructorx Siege2x.sgNukeLauncher Siege2x.sgEnforcer V//============================================================================= // sgSupplier. //============================================================================= class sgSupplier expands sgBuilding; var() class weapons[9]; var pawn p; function postbeginplay() { super.postbeginplay(); playerreplicationinfo.playername="Supplier"; } function findP() { local pawn pwn; foreach radiusactors(class'pawn', pwn, 60) { if(pwn.bisplayer && pwn.health>0 && pwn.playerreplicationinfo.team==playerreplicationinfo.team) { p=pwn; return; } else p=none; } } function timer() { local int num, i; local inventory w; super.timer(); if(scount>0) return; num=3; if(grade>=2) num=6; if(grade>=4) num=8; if(grade==5) num=9; if(p==none || vsize(location - p.location)>60) findp(); if(p!=none) { for(i=0; idefault.lifespan/2) drawscale=default.drawscale*(((default.lifespan- lifespan)*2)/default.lifespan); else drawscale=lifespan*default.drawscale*2/default.lifespan; Scaleglow=2-(2*(lifespan/default.lifespan)); Ambientglow=127*scaleglow; } cYeK- 4a/!,WCw*%wr.}w*?M< ]|b//============================================================================= // WarHeadLauncher //============================================================================= class sgNukeLauncher extends TournamentWeapon; var sgGuidedWarShell GuidedShell; var int Scroll; var PlayerPawn GuidingPawn; var bool bGuiding, bCanFire, bShowStatic; var rotator StartRotation; var() sgtrail trail; replication { // Things the server should send to the client. reliable if( bNetOwner && (Role==ROLE_Authority) ) bGuiding, bShowStatic; } function SetWeaponStay() { bWeaponStay = false; // redeemer never stays } simulated function PostRender( canvas Canvas ) { local int i, numReadouts, OldClipX, OldClipY; local float XScale; bOwnsCrossHair = ( bGuiding || bShowStatic ); if(trail==none) trail=spawn(class'Siege2x.sgtrail',owner,,owner.location); if(ammotype.ammoamount<=0 && !bGuiding) trail.destroy(); if ( !bGuiding ) { if ( !bShowStatic ) return; Canvas.SetPos( 0, 0); Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawIcon(Texture'botpack.Static_a00', FMax(Canvas.ClipX, Canvas.ClipY)/256.0); if ( Owner.IsA('PlayerPawn') ) PlayerPawn(Owner).ViewTarget = None; return; } GuidedShell.PostRender(Canvas); OldClipX = Canvas.ClipX; OldClipY = Canvas.ClipY; XScale = FMax(0.5, int(Canvas.ClipX/640.0)); Canvas.SetPos( 0.5 * OldClipX - 128 * XScale, 0.5 * OldClipY - 128 * XScale ); if ( Level.bHighDetailMode ) Canvas.Style = ERenderStyle.STY_Translucent; else Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawIcon(Texture'GuidedX', XScale); numReadouts = OldClipY/128 + 2; for ( i = 0; i < numReadouts; i++ ) { Canvas.SetPos(1,Scroll + i * 128); Scroll--; if ( Scroll < -128 ) Scroll = 0; Canvas.DrawIcon(Texture'Readout', 1.0); } } function float RateSelf( out int bUseAltMode ) { local Pawn P, E; local Bot O; O = Bot(Owner); if ( (O == None) || (AmmoType.AmmoAmount <=0) || (O.Enemy == None) ) return -2; bUseAltMode = 0; E = O.Enemy; for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.bIsPlayer && (P != O) && (P != E) && (!Level.Game.bTeamGame || (O.PlayerReplicationInfo.Team != P.PlayerReplicationInfo.Team)) && (VSize(E.Location - P.Location) < 650) && (!Level.Game.IsA('TeamGamePlus') || TeamGamePlus(Level.Game).PriorityObjective(O) < 2) && FastTrace(P.Location, E.Location) ) { if ( VSize(E.Location - O.Location) > 500 ) return 2.0; else return 1.0; } return 0.35; } // return delta to combat style function float SuggestAttackStyle() { return -1.0; } simulated function PlayFiring() { local pawn p; local class m; for ( P = Level.PawnList; P!=None; P=P.nextPawn ) { if ( P.IsA('TournamentPlayer' ) && p.playerreplicationinfo.team!=pawn(owner).playerreplicationinfo.team) { m=class (DynamicLoadObject("Siege2x.sgnukebuildmsg",class'Class')); TournamentPlayer(P).ReceiveLocalizedMessage(m,1); } } PlayAnim( 'Fire', 0.3 ); PlayOwnedSound(FireSound, SLOT_None,4.0*Pawn(Owner).SoundDampening); } function setHand(float Hand) { if ( Hand == 2 ) { bHideWeapon = true; return; } else bHideWeapon = false; PlayerViewOffset.Y = Default.PlayerViewOffset.Y; PlayerViewOffset.X = Default.PlayerViewOffset.X; PlayerViewOffset.Z = Default.PlayerViewOffset.Z; PlayerViewOffset *= 100; //scale since network passes vector components as ints } function AltFire( float Value ) { local pawn p; local class m; if ( !Owner.IsA('PlayerPawn') ) { Fire(Value); return; } if (AmmoType.UseAmmo(1)) { for ( P = Level.PawnList; P!=None; P=P.nextPawn ) { if ( P.IsA('TournamentPlayer' ) && p.playerreplicationinfo.team!=pawn(owner).playerreplicationinfo.team) { m=class (DynamicLoadObject("Siege2x.sgnukebuildmsg",class'Class')); TournamentPlayer(P).ReceiveLocalizedMessage(m,1); } } PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); bPointing=True; Pawn(Owner).PlayRecoil(FiringSpeed); PlayFiring(); GuidedShell = sgGuidedWarShell(ProjectileFire(AltProjectileClass, ProjectileSpeed, bWarnTarget)); GuidedShell.SetOwner(Owner); PlayerPawn(Owner).ViewTarget = GuidedShell; GuidedShell.Guider = PlayerPawn(Owner); ClientAltFire(0); GotoState('Guiding'); } } simulated function bool ClientAltFire( float Value ) { if ( bCanClientFire && ((Role == ROLE_Authority) || (AmmoType == None) || (AmmoType.AmmoAmount > 0)) ) { if ( Affector != None ) Affector.FireEffect(); PlayOwnedSound(FireSound, SLOT_None,4.0*Pawn(Owner).SoundDampening); return true; } return false; } State Guiding { function Fire ( float Value ) { if ( !bCanFire ) return; if ( GuidedShell != None ) GuidedShell.Explode(GuidedShell.Location,Vect(0,0,1)); bCanClientFire = true; GotoState('Finishing'); } function AltFire ( float Value ) { Fire(Value); } function BeginState() { Scroll = 0; bGuiding = true; bCanFire = false; if ( Owner.IsA('PlayerPawn') ) { GuidingPawn = PlayerPawn(Owner); StartRotation = PlayerPawn(Owner).ViewRotation; PlayerPawn(Owner).ClientAdjustGlow(-0.2,vect(200,0,0)); } } function EndState() { bGuiding = false; if ( GuidingPawn != None ) { GuidingPawn.ClientAdjustGlow(0.2,vect(-200,0,0)); GuidingPawn.ClientSetRotation(StartRotation); GuidingPawn = None; } } Begin: Sleep(1.0); bCanFire = true; } State Finishing { ignores Fire, AltFire; function BeginState() { bShowStatic = true; } Begin: Sleep(0.3); bShowStatic = false; Sleep(1.0); GotoState('Idle'); } state Idle { function EndState() { Super.EndState(); ambientsound=none; } Begin: ambientsound=sound'sgmedia.sggetnuke'; bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo if ( Pawn(Owner).bFire!=0 ) Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) AltFire(0.0); Disable('AnimEnd'); super.PlayIdleAnim(); } Z//============================================================================= // sgNukeFlash. //============================================================================= class sgNukeFlash expands sgFlash; WG1 n Hj 7w1 H* !aHw!*!! I1!-'! L1! B1! K1!$1a/!,!..1!q!91q!/1*1!r.!*!% ] elB5jhw.l*lr%hr,^r.l!yMr r" fvK*-(v p$JLD::$-D w-D(yJ g//============================================================================= // sgNukeFlame. //============================================================================= class sgNukeFlame expands Effects; simulated function tick (float deltatime) { drawscale=20+(default.drawscale-default.drawscale*(lifespan/default.lifespan)); scaleglow=2*(lifespan/default.lifespan); ambientglow=128*scaleglow; } aZJX 60 +f Pc 6cHc9 @F\aihHc'w.\*\-w.\*.\+.\@@  r+*-(' J] A& \ SCD0w*aL>(ag&_w*.0@@-.0?whEah?,h?-:.%% !_q -q!/qq:.%%kr.*.=A !_a!vfff?L=aC _G//============================================================================= // sgProjImp. //============================================================================= class sgProjImp expands Effects; simulated function tick (float deltatime) { drawscale=0.2+(default.drawscale-default.drawscale*(lifespan/default.lifespan)); scaleglow=2*(lifespan/default.lifespan); } a@@}@@ZdXud@& Z!ar.d*d&@%@ ~`w*a z//============================================================================= // sgTrail. //============================================================================= class sgTrail expands Effects; simulated function tick(float deltatime) { if(pawn(owner).health<=0 || owner==none) destroy(); } j#t%P#(+a/!{+#Q#J#+S+D#?{+#Q#J#+SD.+.+4?,dD#?#Q#J#LevelSD.+D#?,' l//============================================================================= // sgNukeBuildMsg. //============================================================================= class sgNukeBuildMsg expands CriticalEventPlus; var() color oc, rc; static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { if (Switch==0) return Default.oc; else return Default.rc; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if(switch==0) return "A Nuke is about to be created!"; return "!NUCLEAR LAUNCH DETECTED!"; } static simulated function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if(switch==0) P.PlaySound(sound'sgmedia.sgwarning',,2.0); else P.PlaySound(sound'sgmedia.sgwarning',,4.0); } r GCn.`wn*k%`k,` knk+r*-  Q  a-pD? ?,`(pD ?,T-O M?,  ?O ?,M?,O ?,M?, O ]O OM $ *aѨRU: SD.(w.* 9?p ?,M?,M =a..@( ?pOM.,  aѨSD..$~S..$O( sK ]v\ypl> Y> Y`*U*MuSVVxXrV r*S.PaSPqK.PD>ar.i--DS= %**VaV[w*IV.w*IV.VW'V Q//============================================================================= // sgMeshFX. //============================================================================= class sgMeshFX expands Effects; function postbeginplay() { if(sgbuilding(owner).team==0) { texture=texture'sgmedia.sgenvskint0'; } else { texture=texture'sgmedia.sgenvskint1'; } } simulated function tick(float deltatime) { if(owner==none) destroy(); } OX_//============================================================================= // sgWarhead. //============================================================================= class sgWarhead expands sgBuilding; var bool played; function postbeginplay() { local pawn p; local class m; super.postbeginplay(); for ( P = Level.PawnList; P!=None; P=P.nextPawn ) { if ( P.IsA('TournamentPlayer' ) && p.playerreplicationinfo.team!=playerreplicationinfo.team) { m=class (DynamicLoadObject("Siege2x.sgnukebuildmsg",class'Class')); TournamentPlayer(P).ReceiveLocalizedMessage(m,0); } } playerreplicationinfo.playername="Warhead"; } function timer() { local pawn pwn; local inventory w; super.timer(); if(scount>0) return; if(!played) { Playsound(sound'sgmedia.sgwarappear',SLOT_None, 5); played=true; } foreach radiusactors(class'pawn', pwn, 6) { if(pwn.bisplayer && pwn.health>0 && pwn.playerreplicationinfo.team==playerreplicationinfo.team) { w=pwn.findinventorytype(class'Siege2x.sgnukelauncher'); if(w!=none && weapon(w).ammotype.ammoamount<3) { weapon(w).ammotype.ammoamount+=1; pwn.Playsound(sound'sgmedia.sggetnuke',SLOT_None, pwn.SoundDampening*3); if(playerpawn(pwn)!=none) playerpawn(pwn).getweapon(class'Siege2x.sgnukelauncher'); } destroy(); } } } }U @ yg u"Jo@"$"ap@: t|^t"at|y"?,^t?,"y?~R"%y^"a@"y?~R"&"a""W" n//============================================================================= // sgIWarhead. //============================================================================= class sgIWarhead expands sgBuilding; var bool played; function postbeginplay() { local pawn p; local class m; super.postbeginplay(); for ( P = Level.PawnList; P!=None; P=P.nextPawn ) { if ( P.IsA('TournamentPlayer' ) && p.playerreplicationinfo.team!=playerreplicationinfo.team) { m=class (DynamicLoadObject("Siege2x.sgINukeBuildMsg",class'Class')); TournamentPlayer(P).ReceiveLocalizedMessage(m,0); } } playerreplicationinfo.playername="Invincible Warhead"; } function timer() { local pawn pwn; local inventory w; super.timer(); if(scount>0) return; if(!played) { Playsound(sound'sgmedia.sgwarappear',SLOT_None, 5); played=true; } foreach radiusactors(class'pawn', pwn, 32) { if(pwn.bisplayer && pwn.health>0 && pwn.playerreplicationinfo.team==playerreplicationinfo.team) { w=pwn.findinventorytype(class'Siege2x.sgnukelauncher'); if(w!=none && weapon(w).ammotype.ammoamount<3) { weapon(w).ammotype.ammoamount+=1; pwn.Playsound(sound'sgmedia.sggetnuke',SLOT_None, pwn.SoundDampening*3); if(playerpawn(pwn)!=none) playerpawn(pwn).getweapon(class'Siege2x.sgnukelauncher'); } destroy(); } } } C }_a } a |A QOw..*D.. |B 9vH-(6:.%.N 8J qlk`..~$a$. @ qao  #A9. ?,-. wq*qg?OqzD~$a$. @..~.~?,d$a$. @ l1//============================================================================= // WarShell. //============================================================================= class sgWarShell extends Projectile; var float CannonTimer, SmokeRate; var redeemertrail trail; var() float health; replication { // Things the server should send to the client. reliable if ( Role == ROLE_Authority ) health; } simulated function Timer() { local ut_SpriteSmokePuff b; if ( Trail == None ) Trail = Spawn(class'RedeemerTrail',self); CannonTimer += SmokeRate; if ( CannonTimer > 0.6 ) { WarnCannons(); CannonTimer -= 0.6; } if ( Region.Zone.bWaterZone || (Level.NetMode == NM_DedicatedServer) ) { SetTimer(SmokeRate, false); Return; } if ( Level.bHighDetailMode ) { if ( Level.bDropDetail ) Spawn(class'LightSmokeTrail'); else Spawn(class'UTSmokeTrail'); SmokeRate = 152/Speed; } else { SmokeRate = 0.15; b = Spawn(class'ut_SpriteSmokePuff'); b.RemoteRole = ROLE_None; } SetTimer(SmokeRate, false); } simulated function Destroyed() { if ( Trail != None ) Trail.Destroy(); Super.Destroyed(); } simulated function PostBeginPlay() { SmokeRate = 0.3; SetTimer(0.3,false); } function WarnCannons() { local Pawn P; for ( P=Level.Pawnlist; P!=None; P=P.NextPawn ) if ( P.IsA('TeamCannon') && !P.IsInState('TrackWarhead') && P.LineOfSightTo(self) ) { P.target = self; P.GotoState('TrackWarhead'); } } singular function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, vector momentum, name damageType ) { health-=NDamage; if ( health <= 0 ) { explode(location, vector(rotation)); RemoteRole = ROLE_SimulatedProxy; Destroy(); } } auto state Flying { simulated function ZoneChange( Zoneinfo NewZone ) { local waterring w; if ( NewZone.bWaterZone != Region.Zone.bWaterZone ) { w = Spawn(class'WaterRing',,,,rot(16384,0,0)); w.DrawScale = 0.2; w.RemoteRole = ROLE_None; } } function ProcessTouch (Actor Other, Vector HitLocation) { if ( Other != instigator ) Explode(HitLocation,Normal(HitLocation-Other.Location)); } function Explode(vector HitLocation, vector HitNormal) { if ( Role < ROLE_Authority ) return; PlaySound(impactsound, SLOT_None, 20,,10000,1+(FRand()*0.3-0.15)); PlaySound(sound'sgmedia.sgnukering', SLOT_None, 20,,7500); PlaySound(miscsound, SLOT_None, 30,,5000,1+(FRand()*0.3-0.15)); spawn(class'siege2x.sgnukering',,,HitLocation+HitNormal*16,rotator(hitnormal)); spawn(class'siege2x.sgnukeflash',,,HitLocation+ HitNormal*16, rotator(hitnormal)); spawn(class'siege2x.sgswave',,,HitLocation+ HitNormal*16, rotator(hitnormal)); spawn(class'siege2x.sginnerwave',,,HitLocation+ HitNormal*16, rotator(hitnormal)); RemoteRole = ROLE_SimulatedProxy; Destroy(); } function BeginState() { local vector InitialDir; initialDir = vector(Rotation); if ( Role == ROLE_Authority ) Velocity = speed*initialDir; Acceleration = initialDir*50; } } Uwhwa/!]\a ' w \:.w\.w稨I set a Vw with V\(V$' z//============================================================================= // sgINukeBuildMsg. //============================================================================= class sgINukeBuildMsg expands CriticalEventPlus; var() color oc, rc; static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { if (Switch==0) return Default.oc; else return Default.rc; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if(switch==0) return "An Invincible Nuke is about to be created!"; return "!NUCLEAR LAUNCH DETECTED!"; } static simulated function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if(switch==0) P.PlaySound(sound'sgmedia.sgwarning',,2.0); else P.PlaySound(sound'sgmedia.sgwarning',,4.0); } H }VI &pl> Y> Y`*U*MuSd $z^8iw *8: :.$,  a/!$C?  B.. @ D$..L$. ?%$. 4. pB.. @. $..L$.$?,d$?%$a$. @ i, l a/!_. . .HB....0. _.. _?,d a $  @ . ?%$@. ?..?,2. ?,2..0?&?,2. ?,2$. $.$$?%$a$. @ iir.' *w. *=:. :...?. z,.  $a$. @ ,M "IL \ D F ?i>a>( N >TG7>w>*}>a/!g>a!V>b>>q!V>> T//============================================================================= // sgInnerWave. //============================================================================= class sgInnerWave expands sgSWave; simulated function Tick( float DeltaTime ) { if ( Level.NetMode != NM_DedicatedServer ) { if(lifespan/default.lifespan>0.5) ShockSize=20-(20*(lifespan/default.lifespan-0.5)*2); else if(lifespan/default.lifespan<0.5) ShockSize=20*lifespan/default.lifespan*2; ScaleGlow = Lifespan/default.lifespan*3; AmbientGlow = Lifespan/default.lifespan * 255; DrawScale = ShockSize; } } simulated function Timer() { local actor Victims; local float damageScale, dist, MoScale; local vector dir; lightbrightness=255*(lifespan/default.lifespan); if(lifespan/default.lifespan>0.5) ShockSize=20-(20*(lifespan/default.lifespan-0.5)*2); else if(lifespan/default.lifespan<0.5) ShockSize=20*lifespan/default.lifespan*2; lightradius=shocksize*12.5; foreach radiusActors( class 'Actor', Victims, ShockSize*29, Location ) { dir = Location - victims.Location; dist = VSize(dir); dir = normal(dir); MoScale = ((ShockSize*29)-dist)/(shocksize*29); if(victims.isa('pawn') || victims.isa('mover')) { Victims.TakeDamage ( MoScale*70, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius)*dir, vect(0,0,0), 'exploded' ); } } } simulated function PostBeginPlay() { local Pawn P; if ( Role == ROLE_Authority ) //mind me!!!!!!!!!!!!!!!!!!!!!!!!!! { rotationrate=(rotrand()-rotrand()*2)/2; if ( Instigator != None ) MakeNoise(10.0); } SetTimer(0.1, True); } O UR7I?U5I?%(9$a "p$ -r.*q!J%a!vfff?L=q!l- -q!-u:.%E-u(:.%88a!vfff?L=q! T U V f`nf  gccmkg-6-oa  "@oL>o$ X qtmz31wq(vvq  _ Z ?yQOw..*D.. [ s(s ::$ a$A @F?>>a $A `Ea$A @E?>>a  sC?,PCa ` sC?,PCa i sC?,PCa E sC?,PC$a mb ] ;N W ezx"THE BASECORE IS UNDER ATTACK!  n` ;E gg L NLeD, 8l!8I8za?C 4a?//============================================================================= // sgHUD. //============================================================================= class sgHUD expands ChallengeTeamHUD; var pawn ITarget; var() color teamcolors[2], GreyColor; simulated function bool TraceIdentify(canvas Canvas) { local actor Other; local vector HitLocation, HitNormal, StartTrace, EndTrace; StartTrace = Owner.Location; StartTrace.Z += PawnOwner.BaseEyeHeight; EndTrace = StartTrace + vector(PawnOwner.ViewRotation) * 10000.0; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if ( Pawn(Other) != None ) { if ( !Other.bHidden && pawn(other)!=none) { identifytarget=pawn(other).playerreplicationinfo; ITarget = Pawn(Other); IdentifyFadeTime = 3.0; } } if ( (IdentifyFadeTime == 0.0) || (ITarget == None) || IdentifyTarget.bFeigningDeath ) return false; return true; } simulated function bool DrawIdentifyInfo(canvas Canvas) { if ( !TraceIdentify(Canvas)) return false; if(!itarget.isa('sgbuilding')) { if( ITarget.playerreplicationinfo.PlayerName != "" ) { Canvas.Font = MyFonts.GetBigFont(Canvas.ClipX); DrawTwoColorID(Canvas,ITarget.playerreplicationinfo.PlayerName, string(itarget.health), Canvas.ClipY - 256 * Scale); } } else { if( ITarget.playerreplicationinfo.PlayerName != "" ) { Canvas.Font = MyFonts.GetBigFont(Canvas.ClipX); DrawTwoColorID(Canvas,ITarget.playerreplicationinfo.PlayerName, string(int(sgbuilding(itarget).energy/sgbuilding(itarget).maxenergy*100)), Canvas.ClipY - 256 * Scale); Canvas.Font = MyFonts.GetBigFont(Canvas.ClipX); DrawTwoColorID(Canvas,"Level", string(int(sgbuilding(itarget).grade)), Canvas.ClipY - 216 * Scale); } } return true; } simulated function DrawGameSynopsis(Canvas Canvas) { local float XL, YL, XOffset, YOffset; local TournamentGameReplicationInfo GRI; local int i, X; GRI = TournamentGameReplicationInfo(PlayerOwner.GameReplicationInfo); if ( GRI != None ) for ( i=0 ;i<4; i++ ) DrawTeam(Canvas, GRI.Teams[i]); if ( (PawnOwner.PlayerReplicationInfo == None) || PawnOwner.PlayerReplicationInfo.bIsSpectator ) return; Canvas.Font = MyFonts.GetBigFont( Canvas.ClipX ); Canvas.DrawColor = GreyColor; if ( bHideAllWeapons ) X = 0.5 * Canvas.ClipX + 96 * Scale; else X = Canvas.ClipX - 176 * Scale; if ( bHideAllWeapons ) YOffset = Canvas.ClipY - YL*2; else if ( HudScale * WeaponScale * Canvas.ClipX <= Canvas.ClipX - 256 * Scale ) YOffset = Canvas.ClipY - 128*Scale - YL*2; else YOffset = Canvas.ClipY - 160*Scale - YL*2; Canvas.SetPos(0, YOffset); Canvas.SetPos(XL, YOffset); Canvas.SetPos(0, YOffset + YL); Canvas.Style = ERenderStyle.STY_Masked; Canvas.DrawText("RU: "@int(sgpri(pawnowner.playerreplicationinfo).ru), False); if(sgconstructor(pawnowner.weapon)!=none) { Canvas.SetPos(X, (Canvas.ClipY - 176*Scale - YL*2) + YL); Canvas.DrawText(sgconstructor(pawnowner.weapon).optionnames[sgconstructor(pawnowner.weapon).soption], False); Canvas.SetPos(X, YOffset + YL); if(sgconstructor(pawnowner.weapon).soption<9) { Canvas.DrawText(int(sgconstructor(pawnowner.weapon).buildcosts[sgconstructor(pawnowner.weapon).soption])@""@sgconstructor(pawnowner.weapon).buildtimes[sgconstructor(pawnowner.weapon).soption], False); } } } simulated function DrawTwoColorID( canvas Canvas, string TitleString, string ValueString, int YStart ) { local float XL, YL, XOffset, X1; Canvas.Style = ERenderStyle.STY_Masked; Canvas.StrLen(TitleString$": ", XL, YL); X1 = XL; Canvas.StrLen(ValueString, XL, YL); XOffset = Canvas.ClipX/2 - (X1+XL)/2; Canvas.SetPos(XOffset, YStart); SetIDColor(Canvas,0); XOffset += X1; Canvas.DrawText(TitleString); Canvas.SetPos(XOffset, YStart); SetIDColor(Canvas,1); Canvas.DrawText(ValueString); Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetSmallFont( Canvas.ClipX ); } @nlI/ *o 6o.so9. ?,Klarsso'wl*la/![ .l m{|q$.? ?L>>Z, %a>C lJ//============================================================================= // sgHealthPod. //============================================================================= class sgHealthPod expands sgBuilding; var pawn p; function postbeginplay() { super.postbeginplay(); playerreplicationinfo.playername="Health Pod"; } function findP() { local pawn pwn; foreach radiusactors(class'pawn', pwn, 60) { if(pwn.bisplayer && pwn.health>0 && pwn.playerreplicationinfo.team==playerreplicationinfo.team) { p=pwn; return; } else p=none; } } function timer() { local int num, i; local inventory w; super.timer(); if(scount>0) return; num=3; if(grade>=2) num=6; if(grade>=4) num=8; if(grade==5) num=9; if(p==none || vsize(location - p.location)>60) findp(); if(p!=none) { w=p.findinventorytype(class'Siege2x.sgarmor'); if(w==none) { w=spawn(class'Siege2x.sgarmor',p); w.giveto(p); } if(w!=none && frand()<0.1+(grade/15) && w.charge<25+grade*25) w.charge=fmin(w.charge+1, 25+grade*25); if(frand()<0.1+(grade/40) && p.health<60+(grade*15)) p.health = p.health+1; if(frand()<0.2) p.Playsound(sound'sgmedia.sgstockup',SLOT_Misc, Pawn(Owner).SoundDampening*2.5); } } W//============================================================================= // sgAmmo. //============================================================================= class sgAmmo expands TournamentAmmo; ty 7.. pAta Wy#>G::$d?,(#? arg*ga jfj?Tj?6-::$af(  --f)\=f ף<f>ya y$af(  t 9` ?% 6-pa $@-p'/a6 9@]\9-9%*:9:i9  Ywi*!.i,.i&9a $9?,Yw.9*.9 k a10 J//============================================================================= // GuidedWarShell. //============================================================================= class sgGuidedWarShell extends sgWarShell; var Pawn Guider; var rotator OldGuiderRotation, GuidedRotation; var float CurrentTimeStamp, LastUpdateTime,ClientBuffer,ServerUpdate; var bool bUpdatePosition; var bool bDestroyed; var SavedMove SavedMoves; var SavedMove FreeMoves; var vector RealLocation, RealVelocity; replication { // Things the server should send to the client. unreliable if( Role==ROLE_Authority ) ClientAdjustPosition, bDestroyed; unreliable if ( Role==ROLE_Authority && bNetOwner && bNetInitial ) GuidedRotation, OldGuiderRotation; unreliable if( Role==ROLE_Authority && !bNetOwner ) RealLocation, RealVelocity; unreliable if( Role==ROLE_AutonomousProxy ) ServerMove; } simulated function Timer() { local ut_SpriteSmokePuff b; local float SmokeRate; if ( (Role == ROLE_Authority) && (Level.TimeSeconds - ServerUpdate > 4) ) { Explode(Location,Vect(0,0,1)); return; } if ( Trail == None ) Trail = Spawn(class'RedeemerTrail',self); CannonTimer += SmokeRate; if ( CannonTimer > 0.6 ) { WarnCannons(); CannonTimer -= 0.6; } if ( Region.Zone.bWaterZone || (Level.NetMode == NM_DedicatedServer) ) { SetTimer(SmokeRate, false); Return; } if ( Level.bHighDetailMode ) { if ( Level.bDropDetail ) SmokeRate = 0.07; else SmokeRate = 0.02; } else { SmokeRate = 0.15; } b = Spawn(class'ut_SpriteSmokePuff'); b.RemoteRole = ROLE_None; SetTimer(SmokeRate, false); } simulated function Destroyed() { local sgNukeLauncher W; bDestroyed = true; if ( (PlayerPawn(Guider) != None) ) PlayerPawn(Guider).ViewTarget = None; While ( FreeMoves != None ) { FreeMoves.Destroy(); FreeMoves = FreeMoves.NextMove; } While ( SavedMoves != None ) { SavedMoves.Destroy(); SavedMoves = SavedMoves.NextMove; } if ( (Guider != None) && (Level.NetMode != NM_Client) ) { W = sgNukeLauncher(Guider.FindInventoryType(class'sgNukeLauncher')); if ( W != None ) { W.GuidedShell = None; W.GotoState('Finishing'); } } Super.Destroyed(); } simulated function Tick(float DeltaTime) { local int DeltaYaw, DeltaPitch; local int YawDiff, PitchDiff; local SavedMove NewMove; if ( Level.NetMode == NM_Client ) { if ( (PlayerPawn(Instigator) != None) && (ViewPort(PlayerPawn(Instigator).Player) != None) ) { Guider = Instigator; if ( bDestroyed || (Instigator.health < 0) ) { PlayerPawn(Instigator).ViewTarget = None; Destroy(); if ( Instigator.Weapon.IsA('sgNukeLauncher') ) sgNukeLauncher(Instigator.Weapon).bGuiding = false; return; } PlayerPawn(Instigator).ViewTarget = self; if ( Instigator.Weapon.IsA('sgNukeLauncher') ) { sgNukeLauncher(Instigator.Weapon).GuidedShell = self; sgNukeLauncher(Instigator.Weapon).bGuiding = true; } } else { if ( RealLocation != vect(0,0,0) ) { SetLocation(RealLocation); RealLocation = vect(0,0,0); } if ( RealVelocity != vect(0,0,0) ) { Velocity = RealVelocity; SetRotation(rotator(Velocity)); RealVelocity = vect(0,0,0); } return; } } else if ( (Level.NetMode != NM_Standalone) && (RemoteRole == ROLE_AutonomousProxy) ) return; // if server updated client position, client needs to replay moves after the update if ( bUpdatePosition ) ClientUpdatePosition(); DeltaYaw = (Guider.ViewRotation.Yaw & 65535) - (OldGuiderRotation.Yaw & 65535); DeltaPitch = (Guider.ViewRotation.Pitch & 65535) - (OldGuiderRotation.Pitch & 65535); if ( DeltaPitch < -32768 ) DeltaPitch += 65536; else if ( DeltaPitch > 32768 ) DeltaPitch -= 65536; if ( DeltaYaw < -32768 ) DeltaYaw += 65536; else if ( DeltaYaw > 32768 ) DeltaYaw -= 65536; YawDiff = (Rotation.Yaw & 65535) - (GuidedRotation.Yaw & 65535) - DeltaYaw; if ( DeltaYaw < 0 ) { if ( ((YawDiff > 0) && (YawDiff < 16384)) || (YawDiff < -49152) ) GuidedRotation.Yaw += DeltaYaw; } else if ( ((YawDiff < 0) && (YawDiff > -16384)) || (YawDiff > 49152) ) GuidedRotation.Yaw += DeltaYaw; GuidedRotation.Pitch += DeltaPitch; OldGuiderRotation = Guider.ViewRotation; if ( Role == ROLE_AutonomousProxy ) { // Send the move to the server // skip move if too soon if ( ClientBuffer < 0 ) { ClientBuffer += DeltaTime; MoveRocket(DeltaTime, Velocity, GuidedRotation); return; } else ClientBuffer = ClientBuffer + DeltaTime - 80.0/PlayerPawn(Instigator).Player.CurrentNetSpeed; // I'm a client, so I'll save my moves in case I need to replay them // Get a SavedMove actor to store the movement in. if ( SavedMoves == None ) { SavedMoves = GetFreeMove(); NewMove = SavedMoves; } else { NewMove = SavedMoves; while ( NewMove.NextMove != None ) NewMove = NewMove.NextMove; NewMove.NextMove = GetFreeMove(); NewMove = NewMove.NextMove; } NewMove.TimeStamp = Level.TimeSeconds; NewMove.Delta = DeltaTime; NewMove.Velocity = Velocity; NewMove.SetRotation(GuidedRotation); MoveRocket(DeltaTime, Velocity, GuidedRotation); ServerMove(Level.TimeSeconds, Location, NewMove.Rotation.Pitch, NewMove.Rotation.Yaw); return; } MoveRocket(DeltaTime, Velocity, GuidedRotation); } // Server sends ClientAdjustPosition to the client to adjust the warhead position on the client side when the error // is excessive simulated function ClientAdjustPosition ( float TimeStamp, float NewLocX, float NewLocY, float NewLocZ, float NewVelX, float NewVelY, float NewVelZ ) { local vector NewLocation; if ( CurrentTimeStamp > TimeStamp ) return; CurrentTimeStamp = TimeStamp; NewLocation.X = NewLocX; NewLocation.Y = NewLocY; NewLocation.Z = NewLocZ; Velocity.X = NewVelX; Velocity.Y = NewVelY; Velocity.Z = NewVelZ; SetLocation(NewLocation); bUpdatePosition = true; } // Client calls this to replay moves after getting its position updated by the server simulated function ClientUpdatePosition() { local SavedMove CurrentMove; local int realbRun, realbDuck; local bool bRealJump; bUpdatePosition = false; CurrentMove = SavedMoves; while ( CurrentMove != None ) { if ( CurrentMove.TimeStamp <= CurrentTimeStamp ) { SavedMoves = CurrentMove.NextMove; CurrentMove.NextMove = FreeMoves; FreeMoves = CurrentMove; FreeMoves.Clear(); CurrentMove = SavedMoves; } else { MoveRocket(CurrentMove.Delta, CurrentMove.Velocity, CurrentMove.Rotation); CurrentMove = CurrentMove.NextMove; } } } // server moves the rocket based on clients input, and compares the resultant location to the client's view of the location function ServerMove(float TimeStamp, vector ClientLoc, int Pitch, int Yaw) { local float ClientErr, DeltaTime; local vector LocDiff; if ( CurrentTimeStamp >= TimeStamp ) return; if ( CurrentTimeStamp > 0 ) DeltaTime = TimeStamp - CurrentTimeStamp; CurrentTimeStamp = TimeStamp; GuidedRotation.Pitch = Pitch; GuidedRotation.Yaw = Yaw; if ( DeltaTime > 0 ) MoveRocket(DeltaTime, Velocity, GuidedRotation); if ( Level.TimeSeconds - LastUpdateTime > 0.3 ) { ClientErr = 10000; } else if ( Level.TimeSeconds - LastUpdateTime > 0.07 ) { LocDiff = Location - ClientLoc; ClientErr = LocDiff Dot LocDiff; } // If client has accumulated a noticeable positional error, correct him. if ( ClientErr > 3 ) { LastUpdateTime = Level.TimeSeconds; ClientAdjustPosition(TimeStamp, Location.X, Location.Y, Location.Z, Velocity.X, Velocity.Y, Velocity.Z); } } simulated function MoveRocket(float DeltaTime, vector CurrentVelocity, rotator GuideRotation ) { local int OldRoll, RollMag; local rotator NewRot; local float SmoothRoll; local vector OldVelocity, X,Y,Z; if ( (Role == ROLE_Authority) && ( (Guider == None) || (Guider.Health <= 0) || (Guider.IsA('PlayerPawn') && (PlayerPawn(Guider).ViewTarget != self)) || Guider.IsInState('FeigningDeath')) ) { Explode(Location,Vect(0,0,1)); return; } ServerUpdate = Level.TimeSeconds; OldRoll = Rotation.Roll & 65535; OldVelocity = CurrentVelocity; Velocity = CurrentVelocity + Vector(GuideRotation) * 1500 * DeltaTime; Velocity = Normal(Velocity) * 550; NewRot = Rotator(Velocity); // Roll Warhead based on acceleration GetAxes(NewRot, X,Y,Z); RollMag = int(10 * (Y Dot (Velocity - OldVelocity))/DeltaTime); if ( RollMag > 0 ) NewRot.Roll = Min(12000, RollMag); else NewRot.Roll = Max(53535, 65536 + RollMag); //smoothly change rotation if (NewRot.Roll > 32768) { if (OldRoll < 32768) OldRoll += 65536; } else if (OldRoll > 32768) OldRoll -= 65536; SmoothRoll = FMin(1.0, 5.0 * deltaTime); NewRot.Roll = NewRot.Roll * SmoothRoll + OldRoll * (1 - SmoothRoll); SetRotation(NewRot); if ( (Level.NetMode != NM_Standalone) && ((Level.NetMode != NM_ListenServer) || (Instigator == None) || (Instigator.IsA('PlayerPawn') && (PlayerPawn(Instigator).Player != None) && (ViewPort(PlayerPawn(Instigator).Player) == None))) ) AutonomousPhysics(DeltaTime); if ( Role == ROLE_Authority ) { RealLocation = Location; RealVelocity = Velocity; } } simulated function PostRender( canvas Canvas ) { local float Dist; local Pawn P; local int XPos, YPos; local Vector X,Y,Z, Dir; GetAxes(Rotation, X,Y,Z); Canvas.Font = Font'TinyRedFont'; if ( Level.bHighDetailMode ) Canvas.Style = ERenderStyle.STY_Translucent; else Canvas.Style = ERenderStyle.STY_Normal; foreach visiblecollidingactors(class'Pawn', P, 2000,, true) { Dir = P.Location - Location; Dist = VSize(Dir); Dir = Dir/Dist; if ( (Dir Dot X) > 0.7 ) { XPos = 0.5 * Canvas.ClipX * (1 + 1.4 * (Dir Dot Y)); YPos = 0.5 * Canvas.ClipY * (1 - 1.4 * (Dir Dot Z)); Canvas.SetPos(XPos - 8, YPos - 8); Canvas.DrawIcon(texture'CrossHair6', 1.0); Canvas.SetPos(Xpos - 12, YPos + 8); Canvas.DrawText(Dist, true); } } } simulated function SavedMove GetFreeMove() { local SavedMove s; if ( FreeMoves == None ) return Spawn(class'SavedMove'); else { s = FreeMoves; FreeMoves = FreeMoves.NextMove; s.NextMove = None; return s; } } auto state Flying { function BeginState() { ServerUpdate = Level.TimeSeconds; GuidedRotation = Rotation; OldGuiderRotation = Rotation; Velocity = speed*vector(Rotation); Acceleration = vect(0,0,0); if ( (Level.NetMode != NM_Standalone) && (Role == ROLE_Authority) ) { if ( (PlayerPawn(Instigator) != None) && (ViewPort(PlayerPawn(Instigator).Player) != None) ) RemoteRole = ROLE_SimulatedProxy; else RemoteRole = ROLE_AutonomousProxy; } } } Fp m`N-X'-w.*.*[w/*/a//-w.*.a..[w*::$m.  wm*m5*mq!UF  pU @ UwU*Ua/!;*:U:DSiege2x.sgnukebuildmsg .U =D%UUWarhead s a p ]::$9w.*w..*-X%.*aa/!R.-Q( .6a/!R.5.-Q'k{#a {{#e#ea+Pe# ::$ ::$ -cL86 6u]6 6uj]]]]8888R66(8;8%8R% R@ R@6(8yyR% R R6(86(]u F::$j?%ja1a( jjaB?.;r.*.h..qw*Fha a+(1a(C6 6  1a(  } B# ?% B,1?,B,F?,B,[?,B,r3*3 ?,<2w3*}%}B3}yJw*6..,..,w**?.?.D?.?.&D?,}3  hGr*a h3 I3w*=?,!??,?,D?&A?,L>3$a $. @ @//============================================================================= // sgFlash. //============================================================================= class sgFlash expands Effects; simulated function tick (float deltatime) { drawscale=default.drawscale*(lifespan/default.lifespan); } O//============================================================================= // Enforcer //============================================================================= class sgEnforcer extends TournamentWeapon; var() int hitdamage; var float AltAccuracy; var sgEnforcer SlaveEnforcer; // The left (second) Enforcer is a slave to the right. var bool bIsSlave; var bool bSetup; // used for setting display properties var bool bFirstFire, bBringingUp; var() localized string DoubleName; var() texture MuzzleFlashVariations[5]; var int DoubleSwitchPriority; replication { reliable if ( bNetOwner && (Role == ROLE_Authority) ) SlaveEnforcer, bIsSlave, bBringingUp; } function Destroyed() { Super.Destroyed(); if ( SlaveEnforcer != None ) SlaveEnforcer.Destroy(); } simulated function AnimEnd() { if ( (Level.NetMode == NM_Client) && bBringingUp && (Mesh != PickupViewMesh) ) { bBringingUp = false; PlaySelect(); } else Super.AnimEnd(); } function bool WeaponSet(Pawn Other) { if ( bIsSlave ) return false; else Super.WeaponSet(Other); } function SetSwitchPriority(pawn Other) { local int i; local name temp, carried; if ( PlayerPawn(Other) != None ) { Super.SetSwitchPriority(Other); // also set double switch priority for ( i=0; i<20; i++) if ( PlayerPawn(Other).WeaponPriority[i] == 'doubleenforcer' ) { DoubleSwitchPriority = i; return; } } } // Return the switch priority of the weapon (normally AutoSwitchPriority, but may be // modified by environment (or by other factors for bots) function float SwitchPriority() { local float temp; local int bTemp; if ( bIsSlave ) return -10; if ( !Owner.IsA('PlayerPawn') ) return RateSelf(bTemp); else if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) { if ( Pawn(Owner).Weapon == self ) return -0.5; else return -1; } else if ( SlaveEnforcer != None ) return DoubleSwitchPriority; else return AutoSwitchPriority; } function DropFrom(vector StartLocation) { if ( !SetLocation(StartLocation) ) return; if ( SlaveEnforcer != None ) SlaveEnforcer.Destroy(); AIRating = Default.AIRating; SlaveEnforcer = None; Super.DropFrom(StartLocation); } function SetDisplayProperties(ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap ) { if ( !bSetup ) { bSetup = true; if ( SlaveEnforcer != None ) SlaveEnforcer.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); bSetup = false; } Super.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); } function SetDefaultDisplayProperties() { if ( !bSetup ) { bSetup = true; if ( SlaveEnforcer != None ) SlaveEnforcer.SetDefaultDisplayProperties(); bSetup = false; } Super.SetDefaultDisplayProperties(); } event float BotDesireability(Pawn Bot) { local sgEnforcer AlreadyHas; local float desire; desire = MaxDesireability + Bot.AdjustDesireFor(self); AlreadyHas = sgEnforcer(Bot.FindInventoryType(class)); if ( AlreadyHas != None ) { if ( (!bHeldItem || bTossedOut) && bWeaponStay ) return 0; if ( AlreadyHas.SlaveEnforcer != None ) { if ( (RespawnTime < 10) && ( bHidden || (AlreadyHas.AmmoType == None) || (AlreadyHas.AmmoType.AmmoAmount < AlreadyHas.AmmoType.MaxAmmo)) ) return 0; if ( AlreadyHas.AmmoType == None ) return 0.25 * desire; if ( AlreadyHas.AmmoType.AmmoAmount > 0 ) return FMax( 0.25 * desire, AlreadyHas.AmmoType.MaxDesireability * FMin(1, 0.15 * AlreadyHas.AmmoType.MaxAmmo/AlreadyHas.AmmoType.AmmoAmount) ); } } if ( (Bot.Weapon == None) || (Bot.Weapon.AIRating <= 0.4) ) return 2*desire; return desire; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local UT_Shellcase s; local vector realLoc; realLoc = Owner.Location + CalcDrawOffset(); s = Spawn(class'UT_ShellCase',, '', realLoc + 20 * X + FireOffset.Y * Y + Z); if ( s != None ) s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160); if (Other == Level) { if ( bIsSlave || (SlaveEnforcer != None) ) Spawn(class'UT_LightWallHitEffect',,, HitLocation+HitNormal, Rotator(HitNormal)); else Spawn(class'UT_WallHit',,, HitLocation+HitNormal, Rotator(HitNormal)); } else if ((Other != self) && (Other != Owner) && (Other != None) ) { if ( FRand() < 0.2 ) X *= 5; Other.TakeDamage(HitDamage, Pawn(Owner), HitLocation, 3000.0*X, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); else Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); } } function bool HandlePickupQuery( inventory Item ) { local Pawn P; local Inventory Copy; if ( (Item.class == class) && (SlaveEnforcer == None) ) { P = Pawn(Owner); // spawn a double Copy = Spawn(class, P); Copy.BecomeItem(); ItemName = DoubleName; SlaveEnforcer = sgEnforcer(Copy); SetTwoHands(); AIRating = 0.4; SlaveEnforcer.SetUpSlave( Pawn(Owner).Weapon == self ); SlaveEnforcer.SetDisplayProperties(Style, Texture, bUnlit, bMeshEnviromap); SetTwoHands(); P.ReceiveLocalizedMessage( class'PickupMessagePlus', 0, None, None, Self.Class ); Item.PlaySound(Item.PickupSound); if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Item, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Item, Pawn(Owner)); Item.SetRespawn(); return true; } return Super.HandlePickupQuery(Item); } function SetUpSlave(bool bBringUp) { bIsSlave = true; ItemName = DoubleName; GiveAmmo(Pawn(Owner)); AmbientGlow = 0; if ( bBringUp ) BringUp(); else GotoState('Idle2'); } function SetTwoHands() { if ( SlaveEnforcer == None ) return; if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).Handedness == 2) ) { SetHand(2); return; } if ( Mesh == mesh'AutoML' ) SetHand(1); else SetHand(-1); } function setHand(float Hand) { local rotator newRot; if ( Hand == 2 ) { bHideWeapon = true; Super.SetHand(Hand); return; } if ( SlaveEnforcer != None ) { if ( Hand == 0 ) Hand = -1; SlaveEnforcer.SetHand(-1 * Hand); } bHideWeapon = false; Super.SetHand(Hand); if ( Hand == 1 ) Mesh = mesh'AutoML'; else Mesh = mesh'AutoMR'; } function BringUp() { if (SlaveEnforcer != none ) { SetTwoHands(); SlaveEnforcer.BringUp(); } bBringingUp = true; Super.BringUp(); } function TraceFire( float Accuracy ) { local vector RealOffset; RealOffset = FireOffset; FireOffset *= 0.35; if ( (SlaveEnforcer != None) || bIsSlave ) Accuracy = FClamp(3*Accuracy,0.75,3); else if ( Owner.IsA('Bot') && !Bot(Owner).bNovice ) Accuracy = FMax(Accuracy, 0.45); Super.TraceFire(Accuracy); FireOffset = RealOffset; } function Fire(float Value) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; ClientFire(value); if ( SlaveEnforcer != None ) Pawn(Owner).PlayRecoil(2 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.2); } } simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); bMuzzleFlash++; PlayAnim('Shoot',0.5 + 0.31 * FireAdjust, 0.02); } simulated function PlayAltFiring() { PlayAnim('T1', 1.3, 0.05); bFirstFire = true; } simulated function PlayRepeatFiring() { if ( Affector != None ) Affector.FireEffect(); if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.2, vect(325, 225, 95)); PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } bMuzzleFlash++; PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); PlayAnim('Shot2', 0.7 + 0.3 * FireAdjust, 0.05); } function AltFire( float Value ) { bPointing=True; bCanClientFire = true; AltAccuracy = 0.4; if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.AmmoAmount>0) { if ( SlaveEnforcer != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); ClientAltFire(value); GotoState('AltFiring'); } } state Active { function bool PutDown() { if ( bWeaponUp || (AnimFrame < 0.75) ) GotoState('DownWeapon'); else bChangeWeapon = true; return True; } function BeginState() { bChangeWeapon = false; } function EndState() { Super.EndState(); bBringingUp = false; } Begin: FinishAnim(); if ( bChangeWeapon ) GotoState('DownWeapon'); bWeaponUp = True; bCanClientFire = true; if ( !bIsSlave && (Level.Netmode != NM_Standalone) && (Owner != None) && Owner.IsA('TournamentPlayer') && (PlayerPawn(Owner).Player != None) && !PlayerPawn(Owner).Player.IsA('ViewPort') ) { if ( Pawn(Owner).bFire != 0 ) TournamentPlayer(Owner).SendFire(self); else if ( Pawn(Owner).bAltFire != 0 ) TournamentPlayer(Owner).SendAltFire(self); else if ( !bChangeWeapon ) TournamentPlayer(Owner).UpdateRealWeapon(self); } Finish(); } State DownWeapon { ignores Fire, AltFire, Animend; function BeginState() { Super.BeginState(); if ( Slaveenforcer != none ) Slaveenforcer.GoToState('DownWeapon'); } } //////////////////////////////////////////////////////// state NormalFire { ignores Fire, AltFire, AnimEnd; function Timer() { if ( SlaveEnforcer != none ) SlaveEnforcer.Fire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: FlashCount++; if ( SlaveEnforcer != none ) SetTimer(0.20, false); FinishAnim(); if ( bIsSlave ) GotoState('Idle'); else Finish(); } state ClientFiring { simulated function bool ClientAltFire(float Value) { if ( bIsSlave ) Global.ClientAltFire(Value); return false; } simulated function Timer() { if ( (SlaveEnforcer != none) && SlaveEnforcer.ClientFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) ) { PlayIdleAnim(); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayIdleAnim(); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveEnforcer != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState(''); } } state ClientAltFiring { simulated function bool ClientFire(float Value) { if ( bIsSlave ) Global.ClientFire(Value); return false; } simulated function Timer() { if ( (SlaveEnforcer != none) && SlaveEnforcer.ClientAltFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( Pawn(Owner) == None ) GotoState(''); else if ( Ammotype.AmmoAmount <= 0 ) { PlayAnim('T2', 0.9, 0.05); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayAnim('T2', 0.9, 0.05); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveEnforcer != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState(''); } } state AltFiring { ignores Fire, AltFire, AnimEnd; function Timer() { if ( Slaveenforcer != none ) Slaveenforcer.AltFire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: if ( SlaveEnforcer != none ) SetTimer(0.20, false); FinishAnim(); Repeater: if (AmmoType.UseAmmo(1)) { FlashCount++; if ( SlaveEnforcer != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); TraceFire(AltAccuracy); PlayRepeatFiring(); FinishAnim(); } if ( AltAccuracy < 3 ) AltAccuracy += 0.5; if ( bIsSlave ) { if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) Goto('Repeater'); } else if ( bChangeWeapon ) GotoState('DownWeapon'); else if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) { if ( PlayerPawn(Owner) == None ) Pawn(Owner).bAltFire = int( FRand() < AltReFireRate ); Goto('Repeater'); } PlayAnim('T2', 0.9, 0.05); FinishAnim(); Finish(); } simulated event RenderOverlays(canvas Canvas) { local PlayerPawn PlayerOwner; local int realhand; if ( (bMuzzleFlash > 0) && !Level.bDropDetail ) MFTexture = MuzzleFlashVariations[Rand(5)]; PlayerOwner = PlayerPawn(Owner); if ( PlayerOwner != None ) { if ( PlayerOwner.DesiredFOV != PlayerOwner.DefaultFOV ) return; realhand = PlayerOwner.Handedness; if ( (Level.NetMode == NM_Client) && (realHand == 2) ) { bHideWeapon = true; return; } if ( !bHideWeapon ) { if ( Mesh == mesh'AutoML' ) PlayerOwner.Handedness = 1; else if ( bIsSlave || (SlaveEnforcer != None) ) PlayerOwner.Handedness = -1; } } if ( (PlayerOwner == None) || (PlayerOwner.Handedness == 0) ) { if ( AnimSequence == 'Shot2' ) { FlashO = -2 * Default.FlashO; FlashY = Default.FlashY * 2.5; } else { FlashO = 1.9 * Default.FlashO; FlashY = Default.FlashY; } } else if ( AnimSequence == 'Shot2' ) { FlashO = Default.FlashO * 0.3; FlashY = Default.FlashY * 2.5; } else { FlashO = Default.FlashO; FlashY = Default.FlashY; } if ( !bHideWeapon && ( (SlaveEnforcer != None) || bIsSlave ) ) { if ( PlayerOwner == None ) bMuzzleFlash = 0; Super.RenderOverlays(Canvas); if ( SlaveEnforcer != None ) { if ( SlaveEnforcer.bBringingUp ) { SlaveEnforcer.bBringingUp = false; SlaveEnforcer.PlaySelect(); } SlaveEnforcer.RenderOverlays(Canvas); } } else Super.RenderOverlays(Canvas); if ( PlayerOwner != None ) PlayerOwner.Handedness = realhand; } simulated function PlayIdleAnim() { if ( Mesh == PickupViewMesh ) return; if ( (FRand()>0.96) && (AnimSequence != 'Twiddle') ) PlayAnim('Twiddle',0.6,0.3); else LoopAnim('Sway',0.2, 0.3); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo LoopAnim('Sway',0.2, 0.1); if ( Pawn(Owner).bFire!=0 ) Global.Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) Global.AltFire(0.0); } State ClientActive { simulated function AnimEnd() { bBringingUp = false; if ( !bIsSlave ) { Super.AnimEnd(); if ( (SlaveEnforcer != None) && !IsInState('ClientActive') ) { if ( (GetStateName() == 'None') || (GetStateName() == 'Enforcer') ) SlaveEnforcer.GotoState(''); else SlaveEnforcer.GotoState(GetStateName()); } } } simulated function BeginState() { Super.BeginState(); bBringingUp = false; if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState('ClientActive'); } } State ClientDown { simulated function AnimEnd() { if ( !bIsSlave ) Super.AnimEnd(); } simulated function EndState() { if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState(''); } } // End Class //============================================================================= Y//============================================================================= // sgEClip. //============================================================================= class sgEClip expands TournamentAmmo; A "X+#!w*q! u QLQ LQ6we6w6wa6`6b6^a w-c' BD C2/a6 CpB|C-C%*:C:3C0 3*10 d8,-88d( C Kf2/se(1&w* 8 a?( B *(w*aL>(&a?( @ $(6r.*%Gq!X- -q!-u:.%E-u(:.%88Gq! O{ H+ y *" SupplierX | *L-c(*.w***L.**//*/*.1** * ** h//============================================================================= // DoubleEnforcer // placeholder class holds player's prioritization for 2 enforcers //============================================================================= class sgDoubleEnforcer extends sgEnforcer; H I E [CUL[ /L?%N[LL[6(Z6(Y{N?%1N(g>B@Fg)\=[[B[[SB?,g[666666 BD O D# ?% D,1?,D,F?,D,[?,D, r2*2 ?,<2w2*~%~D2~zJw*6..,..,w**?.?.D?.?.&D?,~2  hGr*a h2 I2w*=?,!??,?,D?&A?,L>2$a $. @ E"& uP K2/a6 KpB|K-K%*:K:2K0 2*10  z (! Supplier  T 8#: 8L=?,  ?%KB J a1=::$fr*%-a/!,w.a!n(#? d^6ATT9O?a?&BPB|B{xD?, BAalx%6B.x6Bx6B^^^^F?@a6BD?6BF?^?&Fa+B::$s::$ r*Ma/!,w.*r..*oa::${e vW @K)zD?/a6 @  b$@ *:@:.@&.@?%@-r*@ @  @10 [ F L2V ZcvA"OJl"J:]Double EnforcersY NB  w*r.'*b$ 3.&.?%IP  aA$@?w?,N ?̌??  }db$NN?N IPN{a} I _//============================================================================= // sgCoreWarnMsg. //============================================================================= class sgCoreWarnMsg expands CriticalEventPlus; var() color col; static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { return Default.col; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "THE BASECORE IS UNDER ATTACK!"; } static simulated function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); //P.PlaySound(sound'sgmedia.sgcorewarn',slot_none,float(switch)/10); } A c( SuperProtector   \ 8: 8L=?, ?%KB {` :K)zD?/a6 :  b$: *:::.:&.:?%:-r*: :  :10 R )$a $. @ y//============================================================================= // sgContainerX. //============================================================================= class sgContainerX expands sgBuilding; var bool doneYet; function postbeginplay() { super.postbeginplay(); playerreplicationinfo.playername="ContainerX"; } function timer() { local pawn pwn; super.timer(); if(scount>0) return; if(!doneyet) { setcollision(true,true,true); bprojtarget=true; siegegi(level.game).maxrus[playerreplicationinfo.team]+=500; siegegi(level.game).maxrus[playerreplicationinfo.team]=fmax(siegegi(level.game).maxrus[playerreplicationinfo.team],300); doneyet=true; } foreach radiusactors(class'pawn', pwn, 256) { if(pwn!=self && sgbuilding(pwn)!=none && sgbasecore(pwn)==none && frand()<(0.5 - grade/20) && pwn.playerreplicationinfo.team==playerreplicationinfo.team) { sgbuilding(pwn).energy=fmin(sgbuilding(pwn).energy+1, sgbuilding(pwn).maxenergy); } } } function destruct() { if(doneyet) siegegi(level.game).maxrus[playerreplicationinfo.team]-=500; super.destruct(); } function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { local int actualDamage; local float tempscore; if ( Role < ROLE_Authority ) return; actualDamage = Level.Game.ReduceDamage(Damage, DamageType, self, instigatedBy); if(instigatedby.playerreplicationinfo.team==playerreplicationinfo.team) actualdamage*=teamgameplus(level.game).friendlyfirescale; actualdamage*=1-(grade*0.10); tempscore=fmin(energy, actualdamage); if(instigatedby.playerreplicationinfo.team==playerreplicationinfo.team) { tempscore*=-1; } tempscore*=1+grade/10; instigatedby.playerreplicationinfo.score+=tempscore/1000; sgpri(instigatedby.playerreplicationinfo).addru(tempscore/30); energy-=actualdamage; if(energy<=0) destruct(); } ^ i h(Nr/*a LO///O*O On E2/a6 EpB|E-E%*:E:)E0 )*10 Th l PD+F)d(u9#::$ ::$w.*w..*$$ Y ) # Health Pod m | PPXtwX3:.X.Y::$KwL>K?,X(Dw?K!aX!a$333? @??a za MVkFJ& KKp U~#RUT=>a$? @??b>a za xVnV%xW  Hu P/::$Pa P=L>PAa #@#@#@PP>=Y==aY( t x vc<^:8v-333?YC?,R(DK?C!aR!a$333? @??a za  I G ?% -Da'''-':. %?:. %:. %C-D'/a6 GCwGw.G*r.'G*??,*:G:.G.G?&.G410 @C D # ContainerX E M~#RMI=>a$? @??b>a za Jbx']b\rqpD\%ba  @[ba  @ ![]_^3Ea ] &w*a*] J G/::$Ga G=L>GAa #@#@#@GG>=T==aT( OM Hc<a:8H-333?T0) return; if(!doneyet) { setcollision(true,true,true); bprojtarget=true; siegegi(level.game).maxrus[playerreplicationinfo.team]+=50; siegegi(level.game).maxrus[playerreplicationinfo.team]=fmax(siegegi(level.game).maxrus[playerreplicationinfo.team],300); doneyet=true; } foreach radiusactors(class'pawn', pwn, 256) { if(pwn!=self && sgbuilding(pwn)!=none && sgbasecore(pwn)==none && frand()<(0.5 - grade/20) && pwn.playerreplicationinfo.team==playerreplicationinfo.team) { sgbuilding(pwn).energy=fmin(sgbuilding(pwn).energy+1, sgbuilding(pwn).maxenergy); } } } function destruct() { if(doneyet) siegegi(level.game).maxrus[playerreplicationinfo.team]-=50; super.destruct(); } function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { local int actualDamage; local float tempscore; if ( Role < ROLE_Authority ) return; actualDamage = Level.Game.ReduceDamage(Damage, DamageType, self, instigatedBy); if(instigatedby.playerreplicationinfo.team==playerreplicationinfo.team) actualdamage*=teamgameplus(level.game).friendlyfirescale; actualdamage*=1-(grade*0.10); tempscore=fmin(energy, actualdamage); if(instigatedby.playerreplicationinfo.team==playerreplicationinfo.team) { tempscore*=-1; } tempscore*=1+grade/10; instigatedby.playerreplicationinfo.score+=tempscore/1000; sgpri(instigatedby.playerreplicationinfo).addru(tempscore/30); energy-=actualdamage; if(energy<=0) destruct(); } rla )B:-]:. %?,2l  b F ?% -]a'''-':. %?,2:. %:. %C-]'/a6 FCwFw.F*r.'F*??,*:F:.F.F?&.F410  ] " Container Qc P//============================================================================= // sgNukeRing. //============================================================================= class sgNukeRing expands Effects; var() float ds; var bool done1, done2; replication { // Things the server should send to the client. reliable if ( Role == ROLE_Authority ) done1, done2, ds; } simulated function tick (float deltatime) { local sgnukering r; if(!done1 && lifespan<6.5) { r=Spawn(Class'Siege2x.sgnukering',,,Location+vector(rotation)*256); r.ds=320; r.done1=true; r.done2=true; r=Spawn(Class'Siege2x.sgnukering',,,Location-vector(rotation)*256); r.ds=320; r.done1=true; r.done2=true; done1=true; } else if(!done2 && lifespan<5) { r=Spawn(Class'Siege2x.sgnukering',,,Location+vector(rotation)*640); r.ds=280; r.done1=true; r.done2=true; r=Spawn(Class'Siege2x.sgnukering',,,Location-vector(rotation)*640); r.ds=280; r.done1=true; r.done2=true; done2=true; } drawscale=10+(ds-ds*(lifespan/default.lifespan)); scaleglow=lifespan/default.lifespan; ambientglow=128*scaleglow; } lnh  ::$Z?A?,??,?A?,?,C?, mg IC?,[?A?,??,?A?,CHA/a6 I?,qI LqqqU?,L?,Ia/![Ia/!|IdDU?,FI ի?IIq#!y10 KV//============================================================================= // sgConstructor. //============================================================================= class sgConstructor expands TournamentWeapon; var() string OptionNames[12]; var() sound ChangeSound; var() int BuildTimes[9]; var() float BuildCosts[9]; var() class BuildType[9]; var pawn IActor; var int sOption; var fontinfo myfonts; replication { // Things the server should send to the client. reliable if( bNetOwner && (Role==ROLE_Authority) ) soption; } simulated function AltFire( float Value ) { GotoState('ChangeMode'); } state changeMode { Begin: PlayOwnedSound(changeSound, SLOT_None, Pawn(Owner).SoundDampening*1.2,,,1+(FRand()*0.2- 0.4)); soption++; if (soption>11) soption=0; Sleep(0.3); Finish(); } function Fire( float F ) { GotoState('build'); } function getIActor() { local actor Other; local vector HitLocation, HitNormal, StartTrace, EndTrace; iactor=none; StartTrace = Owner.Location; StartTrace.Z += Pawn(Owner).BaseEyeHeight; EndTrace = StartTrace + vector(playerPawn(Owner).ViewRotation) * 75; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if(other!=none && other.isa('pawn')) IActor=pawn(other); } state build { ignores Fire, altfire; function tick(float delatime) { if(sgpri(pawn(owner).playerreplicationinfo)!=none) ammotype.ammoamount=sgpri(pawn(owner).playerreplicationinfo).ru; } function beginstate() { super.beginstate(); } function endstate() { super.endstate(); } Begin: if(soption<9) global.placeit(); else { global.getiactor(); global.interact(); } sleep(1); finish(); } function interact() { local float amount, tmp; if(iactor!=none && iactor.playerreplicationinfo.team==pawn(owner).playerreplicationinfo.team) { if(soption==10) { if(!iactor.isa('sgbuilding')) { amount=fmin(fmin(150-iactor.health, 40), sgpri(pawn(owner).playerreplicationinfo).ru*2.5); iactor.health+=amount; sgpri(pawn(owner).playerreplicationinfo).addru(-0.2*amount); } else if(sgbuilding(iactor).scount<=0) { amount=fmin(fmin(sgbuilding(iactor).maxenergy-sgbuilding(iactor).energy, 60), sgpri(pawn(owner).playerreplicationinfo).ru*2.5); sgbuilding(iactor).energy+=amount; sgpri(pawn(owner).playerreplicationinfo).addru(-0.2*amount); } pawn(owner).playerreplicationinfo.score+=amount/100; if(amount>0) Owner.Playsound(Misc2Sound,SLOT_None, Pawn(Owner).SoundDampening*2.5); return; } else if(soption==9) { if(!iactor.isa('sgbuilding')) { tmp=sgpri(iactor.playerreplicationinfo).ru; sgpri(iactor.playerreplicationinfo).addru(fmin(50, sgpri(pawn(owner).playerreplicationinfo).ru)); sgpri(pawn(owner).playerreplicationinfo).addru(-1*(sgpri(iactor.playerreplicationinfo).ru-tmp)); pawn(owner).playerreplicationinfo.score+= (sgpri(iactor.playerreplicationinfo).ru-tmp)/100; iactor.Playsound(sound'sgmedia.sgpickrus',SLOT_None, iactor.SoundDampening*2.5); return; } else if(sgbuilding(iactor).scount<=0) { amount=fmin(fmin(5-sgbuilding(iactor).grade, 1), sgpri(pawn(owner).playerreplicationinfo).ru/ (50+sgbuilding(iactor).grade*50)); sgpri(pawn(owner).playerreplicationinfo).addru(- 1*(50+sgbuilding(iactor).grade*50)*amount); sgbuilding(iactor).grade+=amount; pawn(owner).playerreplicationinfo.score+=amount; if(amount>0) Owner.Playsound(Misc3Sound,SLOT_None, pawn(Owner).SoundDampening*2.5); return; } } else { if(sgbasecore(iactor)==none && sgbuilding(iactor)!=none && sgbuilding(iactor).playerreplicationinfo.team==pawn(owner).playerreplicationinfo.team) { sgpri(pawn(owner).playerreplicationinfo).addru(sgbuilding(iactor).buildcost/2); sgbuilding(iactor).destruct(); return; } } } Owner.Playsound(Misc1Sound,SLOT_Misc, Pawn(Owner).SoundDampening*2.5); } function placeIt() { local sgbuilding test; if(sgpri(pawn(owner).playerreplicationinfo).ru0) { drawscale=0.64*(1-scount/(buildtime*10))+0.16; energy+=(maxenergy-maxenergy/5)/(buildtime*10); scount-=1; for(i=0;i m; if ( Role < ROLE_Authority ) return; actualDamage = Level.Game.ReduceDamage(Damage, DamageType, self, instigatedBy); if(instigatedby.playerreplicationinfo.team==playerreplicationinfo.team) actualdamage*=teamgameplus(level.game).friendlyfirescale; if(playerreplicationinfo.team==0) teamgameplus(level.game).teams[1].score=teamgameplus(level.game).GoalTeamScore-energy/1000; else teamgameplus(level.game).teams[0].score=teamgameplus(level.game).GoalTeamScore-energy/1000; tempscore=fmin(energy, actualdamage); if(instigatedby.playerreplicationinfo.team==playerreplicationinfo.team) { tempscore*=-1; } instigatedby.playerreplicationinfo.score+=tempscore/500; sgpri(instigatedby.playerreplicationinfo).addru(tempscore/25); for ( P = Level.PawnList; P!=None; P=P.nextPawn ) { if ( P.IsA('TournamentPlayer' ) && p.playerreplicationinfo.team==playerreplicationinfo.team) { m=class (DynamicLoadObject("Siege2x.sgcorewarnmsg",class'Class')); TournamentPlayer(P).ReceiveLocalizedMessage(m,actualdamage); } } energy-=actualdamage; if(energy<=0) { teamgameplus(level.game).EndGame("teamscorelimit"); destruct(); } } [//============================================================================= // sgArmor. //============================================================================= class sgArmor expands TournamentPickup; `z -b @a  9?`C-b'-d'a  9?`C-b'-d'-b'-d ?,a  9?`C-b'-d'a  9?`C-b'-d'-d' A``C<$ e=//============================================================================= // SiegeGI. //============================================================================= class SiegeGI extends TeamGamePlus; var float maxRUs[2]; replication { // Things the server should send to the client. reliable if ( Role == ROLE_Authority ) maxRUs; } event playerpawn Login ( string Portal, string Options, out string Error, class SpawnClass ) { SpawnClass.Default.PlayerReplicationInfoClass = class'Siege2x.sgpri'; return Super.Login(Portal, Options, Error, SpawnClass); } function beginplay() { local actor f; local sgbasecore b; super.beginplay(); maxRUs[0]=300; maxRUs[1]=300; foreach allactors( class'actor', f) { if(flagbase(f)!=none) { b=spawn(class'Siege2x.sgBaseCore',,,f.location); b.team=flagbase(f).team; b.playerreplicationinfo.team=flagbase(f).team; } else if(inventory(f)!=none && !f.isa('sgresources') && !f.isa('scubagear')) { f.destroy(); } else if(pathnode(f)!=none && frand()<0.2) { spawn(class'Siege2x.sgresources',,,f.location); } } } function AddDefaultInventory( pawn PlayerPawn ) { local Weapon NewWeapon; local Bot B; if ( PlayerPawn.IsA('Spectator') || (bRequireReady && (CountDown > 0)) ) return; GiveWeapon(PlayerPawn, "Botpack.Impacthammer"); GiveWeapon(PlayerPawn, "Botpack.PulseGun"); GiveWeapon(PlayerPawn, "Botpack.ShockRifle"); GiveWeapon(PlayerPawn, "Botpack.UT_FlakCannon"); GiveWeapon(PlayerPawn, "Botpack.UT_BioRifle"); GiveWeapon(PlayerPawn, "Botpack.Minigun2"); GiveWeapon(PlayerPawn, "Botpack.SniperRifle"); GiveWeapon(PlayerPawn, "Botpack.Ripper"); GiveWeapon(PlayerPawn, "Botpack.UT_Eightball"); GiveWeapon(PlayerPawn, "Siege2x.sgconstructor"); GiveWeapon(PlayerPawn, "Siege2x.sgconstructorx"); GiveWeapon(PlayerPawn, "Siege2x.sgNukeLauncher"); GiveWeapon(PlayerPawn, "Siege2x.sgEnforcer"); } function ScoreKill(pawn Killer, pawn Other) { sgpri(other.playerreplicationinfo).addru(-10); if( (killer == Other) || (killer == None) ) { Other.PlayerReplicationInfo.Score -= 1; sgpri(other.playerreplicationinfo).addru(-50); } else if ( killer != None ) { killer.killCount++; if ( Killer.PlayerReplicationInfo.Team != Other.PlayerReplicationInfo.Team ) { Killer.PlayerReplicationInfo.Score += 1; sgpri(killer.playerreplicationinfo).addru(50); } else { Killer.PlayerReplicationInfo.Score += 1; sgpri(killer.playerreplicationinfo).addru(-50); } } Other.DieCount++; BaseMutator.ScoreKill(Killer, Other); } function GiveWeapon(Pawn PlayerPawn, string aClassName ) { local class WeaponClass; local Weapon NewWeapon; WeaponClass = class(DynamicLoadObject(aClassName, class'Class')); if( PlayerPawn.FindInventoryType(WeaponClass) != None ) return; newWeapon = Spawn(WeaponClass); if( newWeapon != None ) { newWeapon.RespawnTime = 0.0; newWeapon.GiveTo(PlayerPawn); newWeapon.bHeldItem = true; newWeapon.GiveAmmo(PlayerPawn); newWeapon.SetSwitchPriority(PlayerPawn); newWeapon.WeaponSet(PlayerPawn); newWeapon.AmbientGlow = 0; if ( PlayerPawn.IsA('PlayerPawn') ) newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness); else newWeapon.GotoState('Idle'); PlayerPawn.Weapon.GotoState('DownWeapon'); PlayerPawn.PendingWeapon = None; PlayerPawn.Weapon = newWeapon; if(sgenforcer(newweapon)==none) newweapon.ammotype.ammoamount=0; } } function int ReduceDamage(int Damage, name DamageType, pawn injured, pawn instigatedBy) { Damage = Super.ReduceDamage(Damage, DamageType, injured, instigatedBy); if(injured.health-damage<=1 && damagetype=='sgSpecial' && sgbuilding(injured)==none) { injured.health=1; damage=0; } return Damage; } } <?,?,Z?,@?,C<$  BL>@ A +).% r*a @ @ | j | [@ | @ | p| C | _ | K | ^ | u^ w^ @ | ,| ` W bj z| W R 4| P ^ f | e | k@ x | | | \ ` -R ^ R| W Q| B | z| h| o@ z | c | f @ S ^ re Z@ } j y ` B^ }` #| J^ q e @| O ^ p| {W N` l| v| i | ;^ c K lj OV Be e^ K| ]e \| F | m| Z K ` @^ A| V e ZK ` A| g R | ^` 3K "| ^ ` mK e C| bc F^ g^ G| n` k` [j j | \ W c` _| n` Yj ` r c \^ +^ n ` SW t@ Hc A | x^ <` pj ` A` Ic a` { ^ U @ Xj ~| N e [` OK lc oK xZ | W |R _^ nW GW yc O ^ ?O fO XK W O Hc XO 9^ s | d l J j z` ` e lt Z K | L | s^ @ ^ ^ s | ]K @` @| | | K j ` {j tc [c hW D^ K K .K ~K c` g K K __ z2_ HJV  V a cLqR~Kb }C  MTZd hHvw  DKY  QKd^ Zl!,zsC  HJC  U b_ qC @|Nug  \qN iC  wmSD_ RN `OC  ni  {C  GCTlb^e pR }xLN  ZN  gR tSAC  OMMm\Ka  I5n V&C c5w  qC ~a LuX [C hB  vtC C7cQu  _x lI  yU FC S*xauW op  |C IBVuz fh rs Ai M ^ [pO gasPnBO pg  }TJ*Xs~Br  @V LTYU g#^ ts  AtMQ  [ThGxvmMD` Rp `x  mI zeF& TmUa/e ou |vw I}N  Vw cN  pr  }cIp Wp dr  qN  }TJjXrfrtcBr  Px]b k| z^ Fp SM `xmk| {M GI  TGc aw nuy{t tw  Cz P{ ]*k/tyKm GR V6cK qqR }Ki  J5^ WgxdsR r|  gK5{  YEI e^r^k@>s NKf [ Mj|v xr E>i  Rru_Kl Tkdv^ r^ ~aJ c Y^Ufb  {Q HoM  Uq aq  n{![IQ  W RdQ v [CdnRz @` M7L ZD g J  t7C AQ  OM\Yik BW ObU\{ qe  ~`KlM  Z>  fJ]  rb ~_  KC XKd fKj  sU  @jGLKi Sf ``Plm^ |C H#xVP d5h qXR@0P  N[xZmD hgz uv Bmu  O[k \'L  ikupcCE  Re^>n lby>Y  I>~  V>}  cr pI~C LteZbh`5xcm*z {@HDiW~@D NX [eg% uP  B|I  N{ [x  in vu  Dw  QI^Kk l  z/O GkTA  bg oe|vJrYq ho uA  AY Nd  [Jh&erx@INc \}jT  y#F #i'LENZ[hgkwgeEox S `%xm {S  HJ Ts cC  r L@g KAXsf t?Ae QE  ]C  isv?De Te `AmGj}O ge tO A!NO ]e jO we D}pQ} AeNA  \6iA  xe EZ Ry_e mI`z|o  JIW|k  f|p  s|m  @Y M~e Z|} gKtXSC*eQ*k_!y mH[zO}UTR _fN}EY BD Ox]K~kv  iq  vS CkP6`^Y nD {k I{ Vi dV  q|z  }KiJm[sD NA  \C iipVwGMZCTS W} d \qkM A  [ehA  vo CxQJ _PglxSP,aQ~  MGfZch/TKIDYJT]TxqB  i5s u&e Box OmGgGCne }f>Ic4Gj {w\G5~cqUa_4P>v.iFqYoe Hj Ufar%nod_4p Sj CWZOJ iw#FEiiLURe g ' ks^G^j eJCq$rtGgfYAM#N"'q YXe qf$}V-aq H_p_4sO.NB"\P"3lUT_DnsaKa l7j Ie VJ_4dbe F/j RgJ^`kh#SE  v9gB_4a i"%JGj oS_4}|/,y>eWA  cWxpWD ~ (LFtaA  zVGaD eaYs_4TAx2Ue Gz S_4Z#_"/y @hCh:kIn3e5+Xj CD O$(]IzqEd-v f_$i]H-F J 3sKL[f_4sAV td Ag NKCZ sxY"(QxyjGs2~U s 2S GEK1~L fJK]XxuLECBzH_4jB 9l GeD lKSz+e MKYOYXfhBnN 4| Op  HkG^ U Vbo_4DxKhQ|jM2~[TKP-YF]Fkq c  3pkP,ctAOoPV^A |oI~eW6n3|xo[}kXcIf D oL}Uo_Ik(hkFe Tk$ aq AloJNP,XtAD oxE j }A I o 4V~eJ6xdo_OS[bo}cIKORTLfkr(@k^e l$ ym *Yz C_4@ OUl_O_ nnz {#B Gl_4Smw RllG_ luf l 3[oNk\_4[j*_ En kSz ~m[J_4VVew {U'lH 'Rtl'2FJ [xC  S =` )]z F SRz e_4S/q'_4q%Dh_4fu J[z e _4p=q yaz Z Ffz l :xz r