Įƒ*žE@Q‘ ‹Ć›ģ‡Jµ|fD°uņȟ¹aĀQNone FlagIconGetSRI SubstatsTickDrawNameAndPing GetSmallFontCoreEngineDrawUnrealityDrawPingAndMultiKills DrawFlags MyDrawScore DrawNameDrawSpreesAndEfficiency DrawLocationPostBeginPlaySystemBotpackGetMediumFontsubflagInsta m_bSpreesm_bMultiKills m_bAccuracym_bEfficiencym_bFPH SortScores DrawHeader DrawTrailerm_bPacketLoss WhiteColor ShowScoresColorCTFGame GetGameTime Domination UpdateThreat UpdateEff UpdateFPHIsLame UpdateAcc CreateFlagsubsupershockrifle PreBeginPlayToDPSpawnNotificationTimer GetBigFont UpdateTimes AddMutator ScoreKillFire substatstgp substatsdmp substatsctfsubreplicationinfosubnotifyinfosubinstanotify InstaGibDMAltFire SpectatorDrawCategoryHeaders CommanderLightBrightness SendHome TeamGamePlusTournamentPlayer PlayerPawn LightRadius substatsdomhomeBot LightHueDropLevelGod SmallFontPing DeltaTimeOtherPKiller WeaponName bReadyToPlayLMSeconds PRIArray PlayerNameScoreHasFlag PacketLoss bIsSpectatorbWaitingPlayerPlayerLocationPRIbAdminGame nextPawnSpreeOwner TimeSecondsNetMode PawnList bGameEndedDefaultWeaponScoreBoardTypeSetPos NextMutatorValueYLXLVictimClipYo PlayerOwnernewVel LocationNameRemainingTime ElapsedTimeGameEndedComments TeamNameDeaths DrawIcon PlayerZone LocationYStartClipXCurYYB ZoneName SecretCount DieCountFontbLowResOffsetIcons CurrentTimeStruct AltTeamColorActor ReturnValuePawnStyleTexture TeamInfo TimeLimitXOffset PlayerCount PlayerCountsYOffsetLoopCountTeamXStartTemp1Team DrawColorRoleDeathMatchPlus UnrealShareTimeDOMR StrPropertyBScaleCanvasStructPropertybAlwaysRelevantClass CyanColorArenaTeamScoreBoardCTFFlagUnrealCTFScoreboard GoldColorSuperShockRiflePlayersNotShownLightCyanColor CountDown bTournamentSTournamentGameReplicationInfo LastKillTimeRedFlagTournamentScoreBoard GreenFlag FontInfoDominationScoreboard MultiLevelratioFPHbRequireReadyOrdered ScoreStart bTimeDownMyFonts CanvasFontXL2 bLocalPlayer OwnerInfo OwnerGame LongLists BottomSlot BlueFlag YellowFlag bCompressedDMPClassPropertyPackagetempAXCi KillCount ScriptTextMutatorShowBonusInfoShowClickBoard FakeFlagSRI LevelInfoKillsRampUnDoubleMultiUltraMonsterEffAcc GameTime GameOffset PlayerTimePlayerJoinTimeThreat AccString OwnerPRI GameInfo ZoneInfoDP DecorationPlayerReplicationInfoReplicationInfoThreats FPHPercent AccPercentGameReplicationInfo locationidName m_bInstaboardidmm_SNIm_InstaNotifykillVector m_OwnerGRI m_ppOwner SpawnNotify TextBufferObject FunctionStateTeams nNameHeightnLocationHeight cDrawColor NamePropertyObjectPropertyFloatProperty BoolProperty IntPropertycTempnStyle ByteProperty TeamColor SpreeString RampString DomString UnString GodStringėH Y8Ų š:’:$’’’’’’’’’’"b¼,‚ėYQ²ZŽ•P؎•P؎•P؜…Óš0Ni掕P؜…Ó§;¬ŗ(Ž•P؜…Óš0Ni掕P؜…Óš0Ni掕P؜…ÓŽ•P؜…Ó„{#U拻T‹»T‹»T‹»T‹»T‹»T‹»T‹»T‹»TŽ•P؎•P؜…Ó‹»T›X€‚Y€‚V€‚LS^w€‚R€‚L€‚K€‚v€‚S€‚d€‚Kk€‚f€‚783V#!J‹$D1€‚r€„] @ND€„Fz€„<KJ€‚D€‚S€‚h€‚IoVAEIv\€‚]€„l€‚+\€‚t”U€‚)*»d€‚L€[ v „r€= ?€A€‚E€;€]€H€~€,.R€‚-/\€‚V€t€ €‚y€Š~”o”€[€€c€v”u b"€‚ee f m @€‹t i l€X€J j €‚^€gw€ušx yšD€@ Eø|€@€c€F@pkšp€C€~S@k@tn N~}€ŠTV€‚ŖG O’’’’’’’’’’’’’’’’’’8P]®‰Ŗ=$:eø']ELø']ELŖ=$:eŽ•P؎•P؎•PØ®-¤%nb¼,‚‹»Tb¼,‚‹»T‹»Tb¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚‹»T‹»TŽ•PØb¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚b¼,‚Ŗ=$:eŽ•P؜…ÓŽ•P؜…ÓŽ•P؜…ÓŽ•P؜…ÓŽ•P؜…ÓŽ•P؜…ÓŽ•P؜…Ó›o€‚Fj@Q„}€‚U„Z„b W€„> @{i f€‚h£_ @”z@P„s q£_€‚|€‚d€‚gGj@A}HG”Y€‚u£H”W@\|@J”kQ€‹U€@@SXG@NKJ€„{D€„HB”Q@g@G€„[@O€„C@W@]@UX@b€@m@[@R@@c@d@e@f@@@G€„og’q@l”p€„r@@€ø}’@A€„j{’b@e€„L”E’j@£ški€„O@E@d ®C€„gs^@Q[n€@B€„clCvīK Q ’’’’’’’’B™’’’’’’’’’’YšDu2ī'·mŅ›@IE½I w9’’’’’’’’’’’’’’’’’’Z2Œ5½Œ”móŽ•P؜…ÓŽ•P؜…ÓŽ•PØ®-¤%n®-¤%nŽ•P؋»T‹»T‹»T’ŗµ§+‹»T„{#U拻T„{#U拻TŽ•P؋»T‹»T„{#U拻T»G©™ĄŠœŌXŠœŌXŠœŌXŠœŌX›yO@I£_@MēD [F’’’’’’’’’’’’’’’’’’6O`–'ģlēƒ2‚x‚x‚x‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚x‚xŽ•PØb¼,‚‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚xb¼,‚‚x‚x„{#Uæ‚x‚x‚x„{#Uæ„{#Uæ»G©™Ą‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ’ŗµ§+„{#Uæ„{#Uæ„{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚xb¼,‚„{#Uæ„{#Uæ’ŗµ§+„{#Uæ‚x„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ¼’F×z„{#Uæ„{#Uæŗ1ŚČb¼,‚‹»T‚x‚xš0Niæš0Niæ„{#Uæ„{#Uæ„{#Uæ‚x„ĆflU‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ„{#Uæ‚x‚x‚x‚x‚x‚x„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ‚x„ĆflU‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x§;¬ŗ(¬ōŖŖ‘‚x‚x‚x§;¬ŗ(¬ōŖŖ‘‚x„ĆflU‚x‚x‚x‚x„ĆflU‚xŽ•P؂x„ĆflU‚x‚x‚x’ŗµ§+’ŗµ§+š0Niæ›ÓÓÓÓÓÓ*!’’’Ī•Ö…¶•ĖkaF£}€@e”RH€h€Us£9K€n€lŠM£hb£ v”y€_€[£\€@TJ£_£M’C€]€o€F”D€A”x€I€iO£V£}z€O€hK@aT`@WdY£K€@vI€B€@€Ŗxa@az@cu€@hxTi@d@@½J :’’’’’’’’’’’’’’’’’’mĪ«0ķ½Œ”móŠœŌXP]®‰P]®‰›V’ĢG€D€„Z@r@s@~€”Ģ_@w@x@t@e@y@|@@€A€„Q€^G€”mT€CZD’H€~€Z}@L€@M€e€Q€„P€T€R£Sk€„NP€@FX@Y@a@n€Z]€”^€N€Z€z5@x€@v€S€„f€s€r@~` q@\€„no€@p€o€r@z@XĢ€p€„€ČB @ +’’’’’’’’ €’’’’’’’’’’2x’ƒÜZČźļgJ‹»T›jY@f€{€|€”Ģ˜C J5’’’’’’’’’’’’’’’’’’6O~„:;˜ös­®‚x‚x‚x‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚x‚xŽ•PØb¼,‚‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚xb¼,‚‚x‚x„{#Uæ‚x‚x‚x„{#Uæ„{#Uæ»G©™Ą‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ’ŗµ§+„{#Uæ„{#Uæ„{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚xb¼,‚„{#Uæ„{#Uæ’ŗµ§+„{#Uæ‚x„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ¼’F×z„{#Uæ„{#Uæŗ1ŚČb¼,‚‹»T‚x‚xš0Niæš0Niæ„{#Uæ„{#Uæ„{#Uæ‚x„ĆflU‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ„{#Uæ‚x‚x‚x‚x‚x‚x„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ‚x„ĆflU‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x§;¬ŗ(¬ōŖŖ‘‚x‚x‚x§;¬ŗ(¬ōŖŖ‘‚x„ĆflU‚x‚x‚x‚x„ĆflU‚xŽ•P؂x„ĆflU‚x‚x‚x’ŗµ§+’ŗµ§+š0Niæ›ÓÓÓÓÓÓ*!’’’Ī•Ö…¶•Ėm€ˆE ~6’’’’’’’’’’’’’’’’’’6gA,— €ˆygt‚x‚x‚x‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚x‚xŽ•PØb¼,‚‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚xb¼,‚‚x‚x„{#Uæ‚x‚x‚x„{#Uæ„{#Uæ»G©™Ą‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚x‚x‚x‚x„{#Uæ’ŗµ§+„{#Uæ‚x‚x‚x„{#Uæ‚x‚x‚x„{#Uæ‚x„{#Uæ‚x‚x‚x„{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚xb¼,‚„{#Uæ’ŗµ§+„{#Uæ„{#Uæ‚x‚x„ĆflU‚x„{#Uæ‚x„{#Uæ‚x‚x‚xb¼,‚‚x‚x’ŗµ§+š0Niæ’ŗµ§+š0Niæ„{#Uæ„{#Uæ‚x‚x„ĆflU‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x„ĆflU‚xŽ•P؂x„ĆflU‚x‚x‚x’ŗµ§+’ŗµ§+š0Niæ›ÓÓÓÓÓÓ*!’’’Ī•Ö…¶•ĖāF u7’’’’’’’’’’’’’’’’’’6OB5‹ņāJEBm‚x‚x‚x‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚x‚xŽ•PØb¼,‚‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚x‚xb¼,‚‚x‚xb¼,‚‚x‚x„{#Uæ‚x‚x‚x„{#Uæ„{#Uæ»G©™Ą‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ’ŗµ§+„{#Uæ„{#Uæ„{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚xb¼,‚„{#Uæ„{#Uæ’ŗµ§+„{#Uæ‚x„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ¼’F×z„{#Uæ„{#Uæŗ1ŚČb¼,‚‹»T‚x‚xš0Niæš0Niæ„{#Uæ„{#Uæ„{#Uæ‚x„ĆflU‚x‚x‚x‚x‚x‚x‚x‚x„{#Uæ„{#Uæ‚x‚x‚x‚x‚x‚x„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ„{#Uæ‚x„ĆflU‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x§;¬ŗ(¬ōŖŖ‘‚x‚x‚x§;¬ŗ(¬ōŖŖ‘‚x„ĆflU‚x‚x‚x‚x„ĆflU‚xŽ•P؂x„ĆflU‚x‚x‚x’ŗµ§+’ŗµ§+š0Niæ›ÓÓÓÓÓÓ*!’’’Ī•Ö…¶•ĖP’Uz@i€„I |ō&RK]   © •Z<›:™×:$gD¬R`?,< aŠTIME: I, ‰CE aŃØTIME:Sg( aŠPING: I, ‰C®E, aŃØPING:SKŌ( aŠDouble: A, ‰®CIE°-e aŃØDOUBLE:SRn( aŠMulti: A, ‰®CI®E,+-e aŃØMULTI: SRj( aŠUltra: p, ‰®®CIAE§-e aŃØUltra: SRi( aŠMonster: p, %‰®®CIA®E,*-e aŃØMONSTER:SRt( %‰®®®CIApEŠ-z aŃpØACC: R]%( ,‰®®®CIAp®E,ņ-r !aŃpØLOSS:RKĶ%( ] f€L& [»#Pf&•e:&¢%wD­*¹D­a/!&•Z&¢$&‰Æi?, h&· ¶€?%&•Z&¢$&‰Æi?, h& ·:Do€?&•f&¢=e G¾z.Nk_SPREES[RAMPSXDOMSWUNSTOPSCGODS ©•Zż-{aŠp_: ‰ÆÆ\?,[aŃØp_:SNd(aŠp[: #‰ÆÆ\?,®[aŃØp[:SNe(aŠpX: (‰ÆÆ\?,®[«?,aŃØpX:SNf(aŠpW: (‰ÆÆ\?,®[«?,aŃØpW:SNm(aŠpC: (‰ÆÆ\?,®[«?,aŃØpC:SNJ(|-saŠFPH: (‰ÆÆ\?,®[«?,aŃØFPH:SN@(-taŠEFF: (‰ÆÆ\?,®[«?, aŃpØEFF:SN=%( l€MLDc!ōvpTHREAT: nRpLOCATION: RlLL ©L‰onL aŃR(LaŠvsXL‰o®nXL aŃv(LlD«?,X OW 1Nē=z} .’—Ø ~³X~:}¾LD}æW•~WaŠSLshW,‰Æ®e¬W”?,sfW aŃSL( `€Pm "Ścm•\m‰]^m aŃ|(maŠ|`zDz R6 ’łU ` R 6•Z6aŠ`KioÆ6”K6‰o@6 aŃU(6‰o®i?,6 aŃ`(6‰o®«@i?,6 aŃR( ^€UNś'5/a0 ^0/r^>N0^10* @F£źWoĄš8DrD* F.’— orw-Dn-ŹvZæ«z .’—Ø v³ævo•S o vrw orw­š::Ą^wĀ*GĀŚwÄ*GÄßŖzGGUnknown¼GUnknown[oGDr®w?S or®®w?S?[orw cįX 9ÕĄ.‹—ز.§u¢$a%–, “*wu€µ*Vu€µ„V-ÕV-ŠQ“V„Q„:Vc„`Q¦”aŠTEXT~®Ņ«?,*±®®«?Q?,Ē-h'a ©saŠTEXT~s¬sa%@–Q6–:“,®“­<“?,?%3Ƭ”?,¬”?,į3Æ«¬”?,?,¬”?,aŠTEXT~•:“Ū+®®«:“L?,õ‚—:“&#—“:“,c%:“c&+®®«?, «:“L”‚‚–:“,š:“c%#š’:“,c%:“e&“3+-hźź°:“L?,“3+-h-hø:“L?,6ø:“L?,„1%)–,¦”—c%Ó“­??,?%3Ƭ”?,¬”?,3Æ«¬”?,?,¬”?,+®Æ?,T—&T—“,c%+®«?, •¾‰3+aŠÅ~aŃÅ(,aŠSD²¹Ę~,‰Æ®3¬”?,~+#aŃSD²¹Ę(—c,Ž–,+®«?,„+®«?,¦”‰3+še%aŃØS“c,Ż(„G¦” «™-Ų¦”a•Z “Z0P“Nw.’—*y.’—Nwy°*uy° €ĆuYÆ+)‚wu*{uÓv! \ ¾€.FSYSPREES]RAMPSmDOMSqUNSTOPSrGODSX   © •Yż-g aŠpY: ! ‰ÆÆk?,l aŃØpY:SFd( aŠp]: ! #‰ÆÆk?,®l! aŃØp]:SFe( aŠpm: ! (‰ÆÆk?,®l«?,! aŃØpm:SFf( aŠpq: ! (‰ÆÆk?,®l«?,! aŃØpq:SFm( aŠpr: ! (‰ÆÆk?,®l«?,! aŃØpr:SFJ(|-r aŠFPH: ! (‰ÆÆk?,®l«?,! aŃØFPH:SF@(-q aŠEFF: ! (‰ÆÆk?,®l«?,! aŃpØEFF:SF=%( X ^ |ś&hLL   © •Y<›:™×:$QD¬h`?,< aŠTIME: O/ ‰D; aŃØTIME:SQ( aŠPING: O/ ‰D®;/ aŃØPING:SLŌ( aŠDouble: v/ ‰®DO;°-r aŃØDOUBLE:Shn( aŠMulti: v/ ‰®DO®;/+-r aŃØMULTI: Shj( aŠUltra: / ‰®®DOv;§-r aŃØUltra: Shi( aŠMonster: / %‰®®DOv®;/*-r aŃØMONSTER:Sht( %‰®®®DOv;Š-j aŃpØACC: h]%( ,‰®®®DOv®;/ņ-z !aŃpØLOSS:RLĶ%( L E€`' [Į#PE'•F:'¢%wS­*¹S­a/!'•Y'¢$'‰ÆB?, C'· ¶€?%'•Y'¢$'‰ÆB?, C' ·:S~€?'•E'¢=F {€aQDi!ōUpTHREAT: b\pLOCATION: \{QQ ©Q‰xyQ aŃ\(QaŠU[ZQ‰x®yZQ aŃU(Q{D«?,Z gR 1Tē=zo .’—Ø n³Xn:o¾lDoæR•nRaŠSlplR,‰Æ®p¬R”?,poR aŃSl( ĆBcµ+)‚wB*{BÓv! €“b6P“Nw.’—*.’—Nw°*B° õd 4öi¢$‰%_–, “*„<%–, w.’—°€µ*f.’—°€µ„f-Õf-ŠP“f„PšP, „fPA¦0”'‰«¬ C@DĒ>aŠTESTDUsŅNs—P,PDō?PƬÆĒsU?&‰%•–PN®Æs?, ««?U?,“N(„7•5A¦” ?™-Ų¦”A•5 y€hn "ącn•}n‰|{n aŃd(naŠdyjDj j4 ł\ O ^ 4•Y4aŠO_MgÆ4”_4‰g@4 aŃ\(4‰g®M?,4 aŃO(4‰g®«@M?,4 aŃ^( W€nFś-5/a0 W0/rW>F0W10* @NC£źqbĄö8P"rP* C.’— b"z|-@n"-ŹyYæ«z" .’—Ø y³æyb•Q b" yz| b"z|­š:":Ą^w"Ā*H"ĀŚw"Ä*H"ÄßŖzHHUnknown¼HUnknown[bHPz®|?Q b"z®®|?Q?[b"z| ańe{¤ :M1rM* @.’— 1]-c-pz1 @Ø œ1-Ź}5¾³-p}³¾}ģ]«”@>¦0”H 1 }] 1] ©Š1-Ź•5¾Ŗ-p•³¾•ģNJM]®?H 1]®®?H?N1] įr 9–ÕĄ.‹—ز.§B¢$k%–, “*wB€µ*YB€µ„Y-ÕY-ŠZ“Y„Z„:Ya„`Z¦”aŠTEXT{®Ņ«?,*±®®«?Z?,Ē-q'k ©GaŠTEXT{G¬Gk%@–Z6–:“,®“­<“?,?%8Ƭ”?,¬”?,į8Æ«¬”?,?,¬”?,aŠTEXT{•:“Ū*®®«:“^?,õ‚—:“&#—“:“,a%:“a&*®®«?, «:“^”‚‚–:“,š:“a%#š’:“,a%:“b&“8*-qźź°:“^?,“8*-q-qø:“^?,6ø:“^?,„1%)–,¦”—a%Ó“­??,?%8Ƭ”?,¬”?,8Æ«¬”?,?,¬”?,*®Æ?,T—&T—“,a%*®«?, •¾‰8*aŠÅ{aŃÅ(,aŠSD²¹Ę{,‰Æ®8¬”?,{*#aŃSD²¹Ę(—a,Ž–,*®«?,„*®«?,¦”‰8*šb%aŃØS“a,Ż(„G¦” «™-Ų¦”k•Y “t6P“Nw.’—*k.’—Nwk°*Bk° €ĆBsµ+)‚wB*{BÓv! w¼{.KdbSPREEScRAMPSdDOMSeUNSTOPSfGODSt ©•_ż-}aŠpb: $‰ÆÆS?,VaŃØpb:SKd(aŠpc: $#‰ÆÆS?,®V$aŃØpc:SKe(aŠpd: $(‰ÆÆS?,®V«?,$aŃØpd:SKf(aŠpe: $(‰ÆÆS?,®V«?,$aŃØpe:SKm(aŠpf: $(‰ÆÆS?,®V«?,$aŃØpf:SKJ(|-xaŠFPH: $(‰ÆÆS?,®V«?,$aŃØFPH:SK@(-yaŠEFF: $(‰ÆÆS?,®V«?,$ aŃpØEFF:SK=%(t @£y zõ&TR~   © •_<›:™×:$}D¬T`?,< aŠTIME: J. ‰GH aŃØTIME:S}( aŠPING: J. ‰G®H. aŃØPING:SRŌ( aŠDouble: I. ‰®GJH°-| aŃØDOUBLE:STn( aŠMulti: I. ‰®GJ®H.+-| aŃØMULTI: STj( aŠUltra: t. ‰®®GJIH§-| aŃØUltra: STi( aŠMonster: t. %‰®®GJI®H.*-| aŃØMONSTER:STt( %‰®®®GJItHŠ-| aŃpØACC: T]%( ,‰®®®GJIt®H.ņ-w !aŃpØLOSS:RRĶ%( ~ H€{% Y¼#PH%•A:%¢%wJ­*¹J­a/!%•_%¢$%‰ÆJ?, I%· ¶€?%%•_%¢$%‰ÆJ?, I% ·:Jv€?%•H%¢=A M€|BBd!ōGpTHREAT: UApLOCATION: AMBB ©B‰POB aŃA(BaŠGVFB‰P®OFB aŃG(BMD«?,F @O /Oē=zV .’—Ø N³XN:V¾BDVæO•NOaŠSBTTO,‰Æ®O¬O”?,TPO aŃSB( p@I€p¼ 5/a0 {0/r{>0{10* Bl Ūcl•Bl‰GHl aŃ_(laŠ_IZDZ {€E: łd z b :•_:aŠzaxjÆ:”a:‰j@: aŃd(:‰j®x?,: aŃz(:‰j®«@x?,: aŃb( 2 Źåłl @ j 2•52aŠ@iTcÆ2”i2‰c@2 aŃl(2‰c®T?,2 aŃ@(2‰c®«@T?,2 aŃj( |€Hqų(5/a0 |0/r|>q0|10* @n£ĄJW¾ń8V rV* n.’— W DC-pn -Źd_æ«z  .’—Ø d³ædW•C W  dDC W DC­š: :Ą^w Ā*@ ĀŚw Ä*@ ÄßŖz@@Unknown¼@UnknownkW@VD®C?C W D®®C?C?kW DC qįL 9—ÕĄ.‹—ز.§s¢$x%–, “*ws€µ*Xs€µ„X-ÕX-ŠU“X„U„:Xq„`U¦”aŠTEXTF®Ņ«?,*±®®«?U?,Ē-u'x ©HaŠTEXTFH¬Hx%@–U6–:“,®“­<“?,?%7Ƭ”?,¬”?,į7Æ«¬”?,?,¬”?,aŠTEXTF•:“Ū)®®«:“S?,õ‚—:“&#—“:“,q%:“h&)®®«?, «:“S”‚‚–:“,š:“h%#š’:“,q%:“g&“7)-uźź°:“S?,“7)-u-uø:“S?,6ø:“S?,„1%)–,¦”—q%Ó“­??,?%7Ƭ”?,¬”?,7Æ«¬”?,?,¬”?,)®Æ?,T—&T—“,q%)®«?, •¾‰7)aŠÅFaŃÅ(,aŠSD²¹ĘF,‰Æ®7¬”?,F)#aŃSD²¹Ę(—q,Ž–,)®«?,„)®«?,¦”‰7)šg%aŃØS“q,Ż(„G¦” «™-Ų¦”x•_ C` äĄc`•u`‰~@` aŃf(`aŠfA^D^ “N5P“Nw.’—*u.’—Nwu°*su° €ĆsM“+)‚ws*{sÓv! PtÄä=;wt*tż xtĀ!+-E' łS`2¹9Ewy*y/rÉ*É`CÉ 2` A€€ĆUR®z \r™ž* Z‚w.®™ž* .®™ž-Év! K0 ó&r-\z\ .’—Ø 0aŠ0000IKn-\0•Č0aŠSD\æ{K05‰Æ®«0” ?«I?{]0aŃSD\æ(0aŠSD\ķ{K05‰Æ®«0”@?«I?{]0aŃSD\ķ( šVg3<Œ  rg* r@* /a0 NƒVrN>gØN‚rN>@ØKN10“‚w* wKgÅ Č,„dn š, ¦d„en ,¦e„fn @,¦f„mn h,¦m„Jn ’’n“wg*“wg™*Tg™ä°ÆTb?,„x—x%x &„n :,„j¦n b,„i¦j Š,„t¦i ’’ x%bTćwK*Kx%Kb€ĄwÉ*É3g@ ÜE Į`ÜC™ža/!$™žŃ `Ś€™ža/!"™žŃ BŚ½™ža/!B™žŃ Ś™žŃ AEa Z/a0 øywy*-E'10--ECa m^ēSUBSTATS: Insta is already presenty ]€y`[1g;_#iÆ™ä_`Æ_u }€`Z#ŲÅw™ž*›—™žĻć%}?.§™žĻĒ,<}Æ}?™žĻćĀ}?™žĻļŠ}_} ]”\P€Tw/*šapTHREAT: KYpLOCATION: YwaŠaRSw‰LMw aŃa(wQD«?,S g^(ē~+™ža/!"P@@XV™ža/!$P€@X(z±¬>æ?IP'( ’abcQ€@hf%@ #,‚°`?, -iUNKNOWN!E(LAMER!V«ČB¬?@?XW«ČB¬[?,#®®«333??=«š™>V«š™>Wø«ĶĢĢ>?dø«€??eø«ffę??fø«ĶĢL@?mø«ĶĢ¬@?Jø«ĶĢĢ=?nø«€>?jø«ffę>?iø«333??tx°*BN00B!™°?,2COMPETENT!ŗ°?,7DANGEROUS!Ū°?,<LIABILITY!ų°?,APWNER!°?,KOMFG!!BOT? m&yv{yw—*r—.‹—Į%=D«¬?.‹—Į?’.‹—Į.‹—ó?,dy=% _( F… Pw(•v:(¢%wh­*¹h­a/!(•5(¢$(‰ÆG?, D(· ¶€?%(•5(¢$(‰ÆG?, D( ·:ht€?(•w(¢=v ikpl'` Z r—* -iXQ—.‹—Į%@D¬«??I`X@% T€@w€q_-P"OTU_j~T.G›j’’’’T€T’’jZ&T t)?ģ|zw—*\—.‹—Ž%[«¬?.‹—Į?.‹—Ž?,dg[]-[, j g¾#Uwr ©•5<›:™×:$kD¬U`?,<aŠTIME: M-‰A?aŃØTIME:Sk(aŠPING: M-‰A®?-aŃØPING:SwŌ(aŠDouble: E-‰®AM?°-zaŃØDOUBLE:SUn(aŠMulti: E-‰®AM®?-+-zaŃØMULTI: SUj(aŠUltra: ~-‰®®AME?§-zaŃØUltra: SUi(aŠMonster: ~-%‰®®AME®?-*-zaŃØMONSTER:SUt(%‰®®®AME~?Š-W aŃpØACC: U]%(,‰®®®AME~®?-ņ-a!aŃpØLOSS:RwĶ%(r €Ćus#²Œr—*v!.I.‹—Įaw™ž*-i™ž-ĮŠ-i1'&)% ÜIėR>.‹—Øx%b€Ą=%@%u#[ iöx/7xÅĆ‚-m w9*Ć„™ža/!$™ža/!"J.®™žM‚—JĆ%J-Ę™åJw*3‚‚‚a/!Da/!=.’-ŹrØ­*Ø­9č§Ć™åœw*Ø­*ča³w9*9a9*a( zq*&][9a Yw9* /a0 ŠqX9a Y* q ųWw9*0 10 m€Šé{X.vsrX*Xk„Xa/!H*‚Xa/!CXa/!?ma .‹XX  ą|, —-ą-m'-ņ'*/aś~Ŗ>' m€Šr ©D+<vFSPREESERAMPSODOMSQUNSTOPSgGODSc   © •5ż-E aŠpF: # ‰ÆÆp?,^ aŃØpF:S<d( aŠpE: # #‰ÆÆp?,®^# aŃØpE:S<e( aŠpO: # (‰ÆÆp?,®^«?,# aŃØpO:S<f( aŠpQ: # (‰ÆÆp?,®^«?,# aŃØpQ:S<m( aŠpg: # (‰ÆÆp?,®^«?,# aŃØpg:S<J(|-Y aŠFPH: # (‰ÆÆp?,®^«?,# aŃØFPH:S<@(-X aŠEFF: # (‰ÆÆp?,®^«?,# aŃpØEFF:S<=%( c éM.cum‚wM*w.P—*mMa/!;.P—y.øM.P—.øMM  ÄA u< ± 4u ęw4U"ęw„.‹—Ž Eclass SubSuperShockRifle extends SuperShockRifle; function Fire(float Value) { Super.Fire(Value); Pawn(Owner).SecretCount++; } function AltFire(float Value) { Fire(Value); } qŠclass SubStatsTgp extends TeamScoreboard config(substats); var GameReplicationInfo m_OwnerGRI; var PlayerPawn m_ppOwner; // Options var config bool m_bSprees; var config bool m_bMultiKills; var config bool m_bAccuracy; var config bool m_bEfficiency; var config bool m_bFPH; var config bool m_bPacketLoss; // Colors var Color WhiteColor; // Flags var Texture FlagIcon[4]; function Tick(float DeltaTime) { if((m_OwnerGRI != None) && (m_OwnerGRI.GameEndedComments != "")) { Disable('Tick'); } } function PostBeginPlay() { Super.PostBeginPlay(); // Store a couple of things if(PlayerPawn(Owner) != None) { m_ppOwner = PlayerPawn(Owner); if(m_ppOwner.GameReplicationInfo != None) { m_OwnerGRI = m_ppOwner.GameReplicationInfo; } } } 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(m_OwnerGRI); Canvas.Style = ERenderStyle.STY_Normal; CanvasFont = Canvas.Font; // Header DrawHeader(Canvas); for(i=0;i<32;i++) { Ordered[i] = None; if(m_OwnerGRI.PRIArray[i] != None) { PRI = m_OwnerGRI.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] += 3; else LoopCountTeam[Ordered[I].Team] += 3; } } 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); } } } Canvas.font = MyFonts.GetSmallFont(Canvas.ClipX); DrawUnreality(Canvas); // Trailer if ( !Level.bLowRes ) { Canvas.Font = MyFonts.GetSmallFont( Canvas.ClipX ); DrawTrailer(Canvas); } Canvas.Font = CanvasFont; Canvas.DrawColor = WhiteColor; } function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local Font CanvasFont; local PlayerPawn PlayerOwner; local SubReplicationInfo SRI; local int nNameHeight, nLocationHeight; local Color cDrawColor; local String L,O; SRI = GetSRI(PRI); if(SRI == None) { return; } PlayerOwner = PlayerPawn(Owner); // Flags DrawFlags(Canvas, PRI, XOffset, YOffset, bCompressed); // What color should we draw the name? if(PRI.bAdmin) cDrawColor = WhiteColor; else if(PRI.PlayerName == PlayerPawn(Owner).PlayerReplicationInfo.PlayerName) cDrawColor = GoldColor; else cDrawColor = Canvas.DrawColor; // Now draw the name nNameHeight = DrawName(Canvas, PRI.PlayerName, cDrawColor, XOffset, YOffset); // Draw Score MyDrawScore(Canvas, PRI, XOffset, YOffset); // On our team? if(PRI.Team == OwnerInfo.Team) { if(PRI.PlayerLocation != None) L = PRI.PlayerLocation.LocationName; else if(PRI.PlayerZone != None) L = PRI.PlayerZone.ZoneName; if(L == "") { L = "Unknown"; } } else { L = "Unknown"; } // Draw Location nLocationHeight = DrawLocation(Canvas, L, SRI.Threat, XOffset, YOffset + nNameHeight); // Draw Ping, Time, and Multi Kills DrawPingAndMultiKills(Canvas, PRI, XOffset, YOffset + nNameHeight + nLocationHeight); // Draw Sprees and Efficiency DrawSpreesAndEfficiency(Canvas, PRI, XOffset, YOffset); } function SubReplicationInfo GetSRI(PlayerReplicationInfo PRI) { local SubReplicationInfo SRI; foreach AllActors(class'SubReplicationInfo', SRI) { if(SRI.OwnerPRI == PRI) return SRI; } return None; } function DrawUnreality(Canvas Canvas) { local String a,b,c; local float XL, YL, X; a = " "; b = " "; c = " "; Canvas.DrawColor = WhiteColor; // Work out X position Canvas.StrLen(b,XL,YL); X = Canvas.ClipX - XL; Canvas.SetPos(X,2); Canvas.DrawText(a, False); Canvas.SetPos(X,YL + 3); Canvas.DrawText(b, False); Canvas.SetPos(X,2*YL + 5); Canvas.DrawText(c, False); } function int DrawName(Canvas Canvas, String Name, Color cDrawColor, float XOffset, float YOffset) { local float XL, YB; // Draw Name Canvas.DrawColor = cDrawColor; Canvas.SetPos(XOffset, YOffset); Canvas.DrawText(Name, False); Canvas.StrLen(Name, XL, YB); return YB; } function MyDrawScore(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local float XL, YL; local Color cDrawColor; local int Score; // What color should we draw the score? if(PRI.PlayerName == PlayerPawn(Owner).PlayerReplicationInfo.PlayerName) cDrawColor = GoldColor; else cDrawColor = TeamColor[PRI.Team]; Score = int(PRI.Score); Canvas.DrawColor = cDrawColor; Canvas.StrLen(string(Score),XL,YL); Canvas.SetPos(XOffset + (Canvas.ClipX/4) - XL,YOffset); Canvas.DrawText(Score,False); } function int DrawLocation(Canvas Canvas, String L, String Threat, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL; local String O; O = "THREAT: "$Threat; L = "LOCATION: "$L; CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.SetPos(XOffset, YOffset); Canvas.DrawText(L, False); Canvas.StrLen(O, XL, YL); Canvas.SetPos(XOffset, YOffset + YL); Canvas.DrawText(O, False); Canvas.Font = CanvasFont; return 2*YL; } // Draw the ready flag for tournament mode, and if the game has started, // draw the flag icon for the flag carrier. function DrawFlags(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local Color cTemp; local int nStyle; cTemp = Canvas.DrawColor; nStyle = Canvas.Style; if(PRI.HasFlag != None) { if(PRI.HasFlag.IsA('SubFlag')) { Canvas.DrawColor = WhiteColor; Canvas.Style = 1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } else { // This player is a flag carrier, draw the appropriate flag icon Canvas.DrawColor = WhiteColor; Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(XOffset - 32, YOffset); Canvas.DrawIcon(FlagIcon[PRI.Team],1.00); } } Canvas.DrawColor = cTemp; Canvas.Style = nStyle; } function DrawPingAndMultiKills(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL, temp, temp1; local int Time; local SubReplicationInfo SRI; SRI = GetSRI(PRI); CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(Level.NetMode != NM_Standalone) { // Draw Time Time = int(SRI.PlayerTime/60); //Time = PlayerTime; Canvas.StrLen("TIME: ", XL, YL); Canvas.SetPos(XOffset, YOffset); Canvas.DrawText("TIME:"@Time, false); // Draw Ping Canvas.StrLen("PING: ", XL, YL); Canvas.SetPos(XOffset, YOffset + YL); Canvas.DrawText("PING:"@PRI.Ping, false); } // Double Kills Canvas.StrLen("Double: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset); if(m_bMultiKills) Canvas.DrawText("DOUBLE:"@SRI.Double, false); // Multi Kills Canvas.StrLen("Multi: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MULTI: "@SRI.Multi, false); // Ultra Kills Canvas.StrLen("Ultra: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset); if(m_bMultiKills) Canvas.DrawText("Ultra: "@SRI.Ultra, false); // Monster Kills Canvas.StrLen("Monster: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MONSTER:"@SRI.Monster, false); // Draw Accuracy //Canvas.StrLen("ACC: % ", XL, YL); Canvas.SetPos(XOffset + XL + temp + temp1, YOffset); if(m_bAccuracy) Canvas.DrawText("ACC: "@SRI.AccString$"%", false); // Draw Packet Loss Canvas.SetPos(XOffset + XL + temp + temp1, YOffset + YL); if(m_bPacketLoss) Canvas.DrawText("LOSS:"@PRI.PacketLoss$"%", false); Canvas.Font = CanvasFont; } function DrawSpreesAndEfficiency(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local String SpreeString,RampString,DomString,UnString,GodString; local float XL, YL; local SubReplicationInfo SRI; SRI = GetSRI(PRI); SpreeString = "SPREES"; RampString = "RAMPS"; DomString = "DOMS"; UnString = "UNSTOPS"; GodString = "GODS"; CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(m_bSprees) { // Sprees Canvas.StrLen(SpreeString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset); Canvas.DrawText(SpreeString$":"@SRI.Spree, false); // Rampages Canvas.StrLen(RampString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + YL); Canvas.DrawText(RampString$":"@SRI.Ramp, false); // Dominating Canvas.StrLen(DomString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 2*YL); Canvas.DrawText(DomString$":"@SRI.Dom, false); // Unstoppable Canvas.StrLen(UnString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 3*YL); Canvas.DrawText(UnString$":"@SRI.Un, false); // Godlike Canvas.StrLen(GodString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 4*YL); Canvas.DrawText(GodString$":"@SRI.God, false); } if(m_bFPH) { // FPH Canvas.StrLen("FPH: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 5*YL); Canvas.DrawText("FPH:"@SRI.Fph, false); } if(m_bEfficiency) { // EFF Canvas.StrLen("EFF: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 6*YL); Canvas.DrawText("EFF:"@SRI.Eff$"%", false); } Canvas.Font = CanvasFont; } wŠclass SubStatsDom extends DominationScoreboard config(substats); var GameReplicationInfo m_OwnerGRI; var PlayerPawn m_ppOwner; // Options var config bool m_bSprees; var config bool m_bMultiKills; var config bool m_bAccuracy; var config bool m_bEfficiency; var config bool m_bFPH; var config bool m_bPacketLoss; // Colors var Color WhiteColor; // Flags var Texture FlagIcon[4]; function Tick(float DeltaTime) { if((m_OwnerGRI != None) && (m_OwnerGRI.GameEndedComments != "")) { Disable('Tick'); } } function PostBeginPlay() { Super.PostBeginPlay(); // Store a couple of things if(PlayerPawn(Owner) != None) { m_ppOwner = PlayerPawn(Owner); if(m_ppOwner.GameReplicationInfo != None) { m_OwnerGRI = m_ppOwner.GameReplicationInfo; } } } 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(m_OwnerGRI); Canvas.Style = ERenderStyle.STY_Normal; CanvasFont = Canvas.Font; // Header DrawHeader(Canvas); for(i=0;i<32;i++) { Ordered[i] = None; if(m_OwnerGRI.PRIArray[i] != None) { PRI = m_OwnerGRI.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] += 3; else LoopCountTeam[Ordered[I].Team] += 3; } } 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); } } } Canvas.font = MyFonts.GetSmallFont(Canvas.ClipX); DrawUnreality(Canvas); // Trailer if ( !Level.bLowRes ) { Canvas.Font = MyFonts.GetSmallFont( Canvas.ClipX ); DrawTrailer(Canvas); } Canvas.Font = CanvasFont; Canvas.DrawColor = WhiteColor; } function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local Font CanvasFont; local PlayerPawn PlayerOwner; local SubReplicationInfo SRI; local int nNameHeight, nLocationHeight; local Color cDrawColor; local String L,O; SRI = GetSRI(PRI); if(SRI == None) { return; } PlayerOwner = PlayerPawn(Owner); // Flags DrawFlags(Canvas, PRI, XOffset, YOffset, bCompressed); // What color should we draw the name? if(PRI.bAdmin) cDrawColor = WhiteColor; else if(PRI.PlayerName == PlayerPawn(Owner).PlayerReplicationInfo.PlayerName) cDrawColor = GoldColor; else cDrawColor = Canvas.DrawColor; // Now draw the name nNameHeight = DrawName(Canvas, PRI.PlayerName, cDrawColor, XOffset, YOffset); // Draw Score MyDrawScore(Canvas, PRI, XOffset, YOffset); // On our team? if(PRI.Team == OwnerInfo.Team) { if(PRI.PlayerLocation != None) L = PRI.PlayerLocation.LocationName; else if(PRI.PlayerZone != None) L = PRI.PlayerZone.ZoneName; if(L == "") { L = "Unknown"; } } else { L = "Unknown"; } // Draw Location nLocationHeight = DrawLocation(Canvas, L, SRI.Threat, XOffset, YOffset + nNameHeight); // Draw Ping, Time, and Multi Kills DrawPingAndMultiKills(Canvas, PRI, XOffset, YOffset + nNameHeight + nLocationHeight); // Draw Sprees and Efficiency DrawSpreesAndEfficiency(Canvas, PRI, XOffset, YOffset); } function SubReplicationInfo GetSRI(PlayerReplicationInfo PRI) { local SubReplicationInfo SRI; foreach AllActors(class'SubReplicationInfo', SRI) { if(SRI.OwnerPRI == PRI) return SRI; } return None; } function DrawUnreality(Canvas Canvas) { local String a,b,c; local float XL, YL, X; a = " "; b = " "; c = " "; Canvas.DrawColor = WhiteColor; // Work out X position Canvas.StrLen(b,XL,YL); X = Canvas.ClipX - XL; Canvas.SetPos(X,2); Canvas.DrawText(a, False); Canvas.SetPos(X,YL + 3); Canvas.DrawText(b, False); Canvas.SetPos(X,2*YL + 5); Canvas.DrawText(c, False); } function int DrawName(Canvas Canvas, String Name, Color cDrawColor, float XOffset, float YOffset) { local float XL, YB; // Draw Name Canvas.DrawColor = cDrawColor; Canvas.SetPos(XOffset, YOffset); Canvas.DrawText(Name, False); Canvas.StrLen(Name, XL, YB); return YB; } function MyDrawScore(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local float XL, YL; local Color cDrawColor; local int Score; // What color should we draw the score? if(PRI.PlayerName == PlayerPawn(Owner).PlayerReplicationInfo.PlayerName) cDrawColor = GoldColor; else cDrawColor = TeamColor[PRI.Team]; Score = int(PRI.Score); Canvas.DrawColor = cDrawColor; Canvas.StrLen(string(Score),XL,YL); Canvas.SetPos(XOffset + (Canvas.ClipX/4) - XL,YOffset); Canvas.DrawText(Score,False); } function int DrawLocation(Canvas Canvas, String L, String Threat, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL; local String O; O = "THREAT: "$Threat; L = "LOCATION: "$L; CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.SetPos(XOffset, YOffset); Canvas.DrawText(L, False); Canvas.StrLen(O, XL, YL); Canvas.SetPos(XOffset, YOffset + YL); Canvas.DrawText(O, False); Canvas.Font = CanvasFont; return 2*YL; } // Draw the ready flag for tournament mode, and if the game has started, // draw the flag icon for the flag carrier. function DrawFlags(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local Color cTemp; local int nStyle; cTemp = Canvas.DrawColor; nStyle = Canvas.Style; if(PRI.HasFlag != None) { if(PRI.HasFlag.IsA('SubFlag')) { Canvas.DrawColor = WhiteColor; Canvas.Style = 1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } else { // This player is a flag carrier, draw the appropriate flag icon Canvas.DrawColor = WhiteColor; Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(XOffset - 32, YOffset); Canvas.DrawIcon(FlagIcon[PRI.Team],1.00); } } Canvas.DrawColor = cTemp; Canvas.Style = nStyle; } function DrawPingAndMultiKills(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL, temp, temp1; local int Time; local SubReplicationInfo SRI; SRI = GetSRI(PRI); CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(Level.NetMode != NM_Standalone) { // Draw Time Time = int(SRI.PlayerTime/60); //Time = PlayerTime; Canvas.StrLen("TIME: ", XL, YL); Canvas.SetPos(XOffset, YOffset); Canvas.DrawText("TIME:"@Time, false); // Draw Ping Canvas.StrLen("PING: ", XL, YL); Canvas.SetPos(XOffset, YOffset + YL); Canvas.DrawText("PING:"@PRI.Ping, false); } // Double Kills Canvas.StrLen("Double: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset); if(m_bMultiKills) Canvas.DrawText("DOUBLE:"@SRI.Double, false); // Multi Kills Canvas.StrLen("Multi: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MULTI: "@SRI.Multi, false); // Ultra Kills Canvas.StrLen("Ultra: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset); if(m_bMultiKills) Canvas.DrawText("Ultra: "@SRI.Ultra, false); // Monster Kills Canvas.StrLen("Monster: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MONSTER:"@SRI.Monster, false); // Draw Accuracy //Canvas.StrLen("ACC: % ", XL, YL); Canvas.SetPos(XOffset + XL + temp + temp1, YOffset); if(m_bAccuracy) Canvas.DrawText("ACC: "@SRI.AccString$"%", false); // Draw Packet Loss Canvas.SetPos(XOffset + XL + temp + temp1, YOffset + YL); if(m_bPacketLoss) Canvas.DrawText("LOSS:"@PRI.PacketLoss$"%", false); Canvas.Font = CanvasFont; } function DrawSpreesAndEfficiency(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local String SpreeString,RampString,DomString,UnString,GodString; local float XL, YL; local SubReplicationInfo SRI; SRI = GetSRI(PRI); SpreeString = "SPREES"; RampString = "RAMPS"; DomString = "DOMS"; UnString = "UNSTOPS"; GodString = "GODS"; CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(m_bSprees) { // Sprees Canvas.StrLen(SpreeString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset); Canvas.DrawText(SpreeString$":"@SRI.Spree, false); // Rampages Canvas.StrLen(RampString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + YL); Canvas.DrawText(RampString$":"@SRI.Ramp, false); // Dominating Canvas.StrLen(DomString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 2*YL); Canvas.DrawText(DomString$":"@SRI.Dom, false); // Unstoppable Canvas.StrLen(UnString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 3*YL); Canvas.DrawText(UnString$":"@SRI.Un, false); // Godlike Canvas.StrLen(GodString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 4*YL); Canvas.DrawText(GodString$":"@SRI.God, false); } if(m_bFPH) { // FPH Canvas.StrLen("FPH: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 5*YL); Canvas.DrawText("FPH:"@SRI.Fph, false); } if(m_bEfficiency) { // EFF Canvas.StrLen("EFF: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 6*YL); Canvas.DrawText("EFF:"@SRI.Eff$"%", false); } Canvas.Font = CanvasFont; } {Ćclass SubStatsDmp extends TournamentScoreboard config(substats); var GameReplicationInfo m_OwnerGRI; var PlayerPawn m_ppOwner; // Options var config bool m_bSprees; var config bool m_bMultiKills; var config bool m_bAccuracy; var config bool m_bEfficiency; var config bool m_bFPH; var config bool m_bPacketLoss; // Colors var Color WhiteColor; // Flags var Texture FlagIcon[4]; function Tick(float DeltaTime) { if((m_OwnerGRI != None) && (m_OwnerGRI.GameEndedComments != "")) { Disable('Tick'); } } function PostBeginPlay() { Super.PostBeginPlay(); // Store a couple of things if(PlayerPawn(Owner) != None) { m_ppOwner = PlayerPawn(Owner); if(m_ppOwner.GameReplicationInfo != None) { m_OwnerGRI = m_ppOwner.GameReplicationInfo; } } } function ShowScores(canvas Canvas) { local PlayerReplicationInfo PRI; local int PlayerCount, i; local float XL, YL, Scale; local float YOffset, YStart; local font CanvasFont; Canvas.Style = ERenderStyle.STY_Normal; // Header Canvas.SetPos(0, 0); DrawHeader(Canvas); // Wipe everything. for ( i=0; i 15 ) PlayerCount = FMin(PlayerCount, (Canvas.ClipY - YStart)/YL - 1); Canvas.SetPos(0, 0); for ( I=0; I 512) && (Level.NetMode != NM_Standalone) ) { Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetSmallestFont(Canvas.ClipX); // Draw Time Time = Max(1, (Level.TimeSeconds + PlayerOwner.PlayerReplicationInfo.StartTime - PRI.StartTime)/60); Canvas.TextSize( TimeString$": 999", XL3, YL3 ); Canvas.SetPos( Canvas.ClipX * 0.75 + XL, YOffset ); Canvas.DrawText( TimeString$":"@Time, false ); // Draw FPH Canvas.TextSize( FPHString$": 999", XL2, YL2 ); Canvas.SetPos( Canvas.ClipX * 0.75 + XL, YOffset + 0.5 * YL ); Canvas.DrawText( FPHString$": "@int(60 * PRI.Score/Time), false ); XL3 = FMax(XL3, XL2); // Draw Ping Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset ); Canvas.DrawText( PingString$":"@PRI.Ping, false ); }*/ // What color should we draw the score? /*if(PRI.PlayerName == PlayerPawn(Owner).PlayerReplicationInfo.PlayerName) cDrawColor = GoldColor; else cDrawColor = BlueColor; Score = int(PRI.Score); Canvas.DrawColor = cDrawColor; Canvas.StrLen(string(Score),XL,YL); Canvas.SetPos(XOffset + (Canvas.ClipX/4) - XL,YOffset); Canvas.DrawText(Score,False);*/ } function int DrawLocation(Canvas Canvas, String L, String Threat, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL; local String O; O = "THREAT: "$Threat; L = "LOCATION: "$L; //CanvasFont = Canvas.Font; //Canvas.Font = Font'SmallFont'; //Canvas.SetPos(XOffset, YOffset); //Canvas.DrawText(L, False); Canvas.StrLen(O, XL, YL); Canvas.SetPos(XOffset, YOffset); Canvas.DrawText(O, False); Canvas.Font = CanvasFont; return 2*YL; } // Draw the ready flag for tournament mode, and if the game has started, // draw the flag icon for the flag carrier. function DrawFlags(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local Color cTemp; local int nStyle; cTemp = Canvas.DrawColor; nStyle = Canvas.Style; if(PRI.HasFlag != None) { if(PRI.HasFlag.IsA('SubFlag')) { Canvas.DrawColor = WhiteColor; Canvas.Style = 1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } else { // This player is a flag carrier, draw the appropriate flag icon Canvas.DrawColor = WhiteColor; Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(XOffset - 32, YOffset); Canvas.DrawIcon(FlagIcon[PRI.Team],1.00); } } Canvas.DrawColor = cTemp; Canvas.Style = nStyle; } function DrawPingAndMultiKills(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL, temp, temp1; local int Time; local SubReplicationInfo SRI; SRI = GetSRI(PRI); CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(Level.NetMode != NM_Standalone) { // Draw Time Time = int(SRI.PlayerTime/60); //Time = PlayerTime; Canvas.StrLen("TIME: ", XL, YL); Canvas.SetPos(XOffset, YOffset); Canvas.DrawText("TIME:"@Time, false); // Draw Ping Canvas.StrLen("PING: ", XL, YL); Canvas.SetPos(XOffset, YOffset + YL); Canvas.DrawText("PING:"@PRI.Ping, false); } // Double Kills Canvas.StrLen("Double: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset); if(m_bMultiKills) Canvas.DrawText("DOUBLE:"@SRI.Double, false); // Multi Kills Canvas.StrLen("Multi: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MULTI: "@SRI.Multi, false); // Ultra Kills Canvas.StrLen("Ultra: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset); if(m_bMultiKills) Canvas.DrawText("Ultra: "@SRI.Ultra, false); // Monster Kills Canvas.StrLen("Monster: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MONSTER:"@SRI.Monster, false); // Draw Accuracy //Canvas.StrLen("ACC: % ", XL, YL); Canvas.SetPos(XOffset + XL + temp + temp1, YOffset); if(m_bAccuracy) Canvas.DrawText("ACC: "@SRI.AccString$"%", false); // Draw Packet Loss Canvas.SetPos(XOffset + XL + temp + temp1, YOffset + YL); if(m_bPacketLoss) Canvas.DrawText("LOSS:"@PRI.PacketLoss$"%", false); Canvas.Font = CanvasFont; } function DrawSpreesAndEfficiency(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local String SpreeString,RampString,DomString,UnString,GodString; local float XL, YL; local SubReplicationInfo SRI; SRI = GetSRI(PRI); SpreeString = "SPREES"; RampString = "RAMPS"; DomString = "DOMS"; UnString = "UNSTOPS"; GodString = "GODS"; CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(m_bSprees) { // Sprees Canvas.StrLen(SpreeString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset); Canvas.DrawText(SpreeString$":"@SRI.Spree, false); // Rampages Canvas.StrLen(RampString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + YL); Canvas.DrawText(RampString$":"@SRI.Ramp, false); // Dominating Canvas.StrLen(DomString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 2*YL); Canvas.DrawText(DomString$":"@SRI.Dom, false); // Unstoppable Canvas.StrLen(UnString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 3*YL); Canvas.DrawText(UnString$":"@SRI.Un, false); // Godlike Canvas.StrLen(GodString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 4*YL); Canvas.DrawText(GodString$":"@SRI.God, false); } if(m_bFPH) { // FPH Canvas.StrLen("FPH: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 5*YL); Canvas.DrawText("FPH:"@SRI.Fph, false); } if(m_bEfficiency) { // EFF Canvas.StrLen("EFF: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 6*YL); Canvas.DrawText("EFF:"@SRI.Eff$"%", false); } Canvas.Font = CanvasFont; } rŠclass SubStatsCtf extends UnrealCTFScoreboard config(substats); var GameReplicationInfo m_OwnerGRI; var PlayerPawn m_ppOwner; // Options var config bool m_bSprees; var config bool m_bMultiKills; var config bool m_bAccuracy; var config bool m_bEfficiency; var config bool m_bFPH; var config bool m_bPacketLoss; // Colors var Color WhiteColor; // Flags var Texture FlagIcon[4]; function Tick(float DeltaTime) { if((m_OwnerGRI != None) && (m_OwnerGRI.GameEndedComments != "")) { Disable('Tick'); } } function PostBeginPlay() { Super.PostBeginPlay(); // Store a couple of things if(PlayerPawn(Owner) != None) { m_ppOwner = PlayerPawn(Owner); if(m_ppOwner.GameReplicationInfo != None) { m_OwnerGRI = m_ppOwner.GameReplicationInfo; } } } 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(m_OwnerGRI); Canvas.Style = ERenderStyle.STY_Normal; CanvasFont = Canvas.Font; // Header DrawHeader(Canvas); for(i=0;i<32;i++) { Ordered[i] = None; if(m_OwnerGRI.PRIArray[i] != None) { PRI = m_OwnerGRI.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] += 3; else LoopCountTeam[Ordered[I].Team] += 3; } } 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); } } } Canvas.font = MyFonts.GetSmallFont(Canvas.ClipX); DrawUnreality(Canvas); // Trailer if ( !Level.bLowRes ) { Canvas.Font = MyFonts.GetSmallFont( Canvas.ClipX ); DrawTrailer(Canvas); } Canvas.Font = CanvasFont; Canvas.DrawColor = WhiteColor; } function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local Font CanvasFont; local PlayerPawn PlayerOwner; local SubReplicationInfo SRI; local int nNameHeight, nLocationHeight; local Color cDrawColor; local String L,O; SRI = GetSRI(PRI); if(SRI == None) { return; } PlayerOwner = PlayerPawn(Owner); // Flags DrawFlags(Canvas, PRI, XOffset, YOffset, bCompressed); // What color should we draw the name? if(PRI.bAdmin) cDrawColor = WhiteColor; else if(PRI.PlayerName == PlayerPawn(Owner).PlayerReplicationInfo.PlayerName) cDrawColor = GoldColor; else cDrawColor = Canvas.DrawColor; // Now draw the name nNameHeight = DrawName(Canvas, PRI.PlayerName, cDrawColor, XOffset, YOffset); // Draw Score MyDrawScore(Canvas, PRI, XOffset, YOffset); // On our team? if(PRI.Team == OwnerInfo.Team) { if(PRI.PlayerLocation != None) L = PRI.PlayerLocation.LocationName; else if(PRI.PlayerZone != None) L = PRI.PlayerZone.ZoneName; if(L == "") { L = "Unknown"; } } else { L = "Unknown"; } // Draw Location nLocationHeight = DrawLocation(Canvas, L, SRI.Threat, XOffset, YOffset + nNameHeight); // Draw Ping, Time, and Multi Kills DrawPingAndMultiKills(Canvas, PRI, XOffset, YOffset + nNameHeight + nLocationHeight); // Draw Sprees and Efficiency DrawSpreesAndEfficiency(Canvas, PRI, XOffset, YOffset); } function SubReplicationInfo GetSRI(PlayerReplicationInfo PRI) { local SubReplicationInfo SRI; foreach AllActors(class'SubReplicationInfo', SRI) { if(SRI.OwnerPRI == PRI) return SRI; } return None; } function DrawUnreality(Canvas Canvas) { local String a,b,c; local float XL, YL, X; a = " "; b = " "; c = " "; Canvas.DrawColor = WhiteColor; // Work out X position Canvas.StrLen(b,XL,YL); X = Canvas.ClipX - XL; Canvas.SetPos(X,2); Canvas.DrawText(a, False); Canvas.SetPos(X,YL + 3); Canvas.DrawText(b, False); Canvas.SetPos(X,2*YL + 5); Canvas.DrawText(c, False); } function int DrawName(Canvas Canvas, String Name, Color cDrawColor, float XOffset, float YOffset) { local float XL, YB; // Draw Name Canvas.DrawColor = cDrawColor; Canvas.SetPos(XOffset, YOffset); Canvas.DrawText(Name, False); Canvas.StrLen(Name, XL, YB); return YB; } function MyDrawScore(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local float XL, YL; local Color cDrawColor; local int Score; // What color should we draw the score? if(PRI.PlayerName == PlayerPawn(Owner).PlayerReplicationInfo.PlayerName) cDrawColor = GoldColor; else cDrawColor = TeamColor[PRI.Team]; Score = int(PRI.Score); Canvas.DrawColor = cDrawColor; Canvas.StrLen(string(Score),XL,YL); Canvas.SetPos(XOffset + (Canvas.ClipX/4) - XL,YOffset); Canvas.DrawText(Score,False); } function int DrawLocation(Canvas Canvas, String L, String Threat, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL; local String O; O = "THREAT: "$Threat; L = "LOCATION: "$L; CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.SetPos(XOffset, YOffset); Canvas.DrawText(L, False); Canvas.StrLen(O, XL, YL); Canvas.SetPos(XOffset, YOffset + YL); Canvas.DrawText(O, False); Canvas.Font = CanvasFont; return 2*YL; } // Draw the ready flag for tournament mode, and if the game has started, // draw the flag icon for the flag carrier. function DrawFlags(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local Color cTemp; local int nStyle; cTemp = Canvas.DrawColor; nStyle = Canvas.Style; if(PRI.HasFlag != None) { if(PRI.HasFlag.IsA('SubFlag')) { Canvas.DrawColor = WhiteColor; Canvas.Style = 1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } else { // This player is a flag carrier, draw the appropriate flag icon Canvas.DrawColor = WhiteColor; Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(XOffset - 32, YOffset); Canvas.DrawIcon(FlagIcon[PRI.Team],1.00); } } Canvas.DrawColor = cTemp; Canvas.Style = nStyle; } function DrawPingAndMultiKills(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local float XL, YL, temp, temp1; local int Time; local SubReplicationInfo SRI; SRI = GetSRI(PRI); CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(Level.NetMode != NM_Standalone) { // Draw Time Time = int(SRI.PlayerTime/60); //Time = PlayerTime; Canvas.StrLen("TIME: ", XL, YL); Canvas.SetPos(XOffset, YOffset); Canvas.DrawText("TIME:"@Time, false); // Draw Ping Canvas.StrLen("PING: ", XL, YL); Canvas.SetPos(XOffset, YOffset + YL); Canvas.DrawText("PING:"@PRI.Ping, false); } // Double Kills Canvas.StrLen("Double: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset); if(m_bMultiKills) Canvas.DrawText("DOUBLE:"@SRI.Double, false); // Multi Kills Canvas.StrLen("Multi: ", temp, YL); Canvas.SetPos(XOffset + XL, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MULTI: "@SRI.Multi, false); // Ultra Kills Canvas.StrLen("Ultra: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset); if(m_bMultiKills) Canvas.DrawText("Ultra: "@SRI.Ultra, false); // Monster Kills Canvas.StrLen("Monster: ", temp1, YL); Canvas.SetPos(XOffset + XL + temp, YOffset + YL); if(m_bMultiKills) Canvas.DrawText("MONSTER:"@SRI.Monster, false); // Draw Accuracy //Canvas.StrLen("ACC: % ", XL, YL); Canvas.SetPos(XOffset + XL + temp + temp1, YOffset); if(m_bAccuracy) Canvas.DrawText("ACC: "@SRI.AccString$"%", false); // Draw Packet Loss Canvas.SetPos(XOffset + XL + temp + temp1, YOffset + YL); if(m_bPacketLoss) Canvas.DrawText("LOSS:"@PRI.PacketLoss$"%", false); Canvas.Font = CanvasFont; } function DrawSpreesAndEfficiency(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset) { local Font CanvasFont; local String SpreeString,RampString,DomString,UnString,GodString; local float XL, YL; local SubReplicationInfo SRI; SRI = GetSRI(PRI); SpreeString = "SPREES"; RampString = "RAMPS"; DomString = "DOMS"; UnString = "UNSTOPS"; GodString = "GODS"; CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if(m_bSprees) { // Sprees Canvas.StrLen(SpreeString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset); Canvas.DrawText(SpreeString$":"@SRI.Spree, false); // Rampages Canvas.StrLen(RampString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + YL); Canvas.DrawText(RampString$":"@SRI.Ramp, false); // Dominating Canvas.StrLen(DomString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 2*YL); Canvas.DrawText(DomString$":"@SRI.Dom, false); // Unstoppable Canvas.StrLen(UnString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 3*YL); Canvas.DrawText(UnString$":"@SRI.Un, false); // Godlike Canvas.StrLen(GodString$": ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 4*YL); Canvas.DrawText(GodString$":"@SRI.God, false); } if(m_bFPH) { // FPH Canvas.StrLen("FPH: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 5*YL); Canvas.DrawText("FPH:"@SRI.Fph, false); } if(m_bEfficiency) { // EFF Canvas.StrLen("EFF: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + 6*YL); Canvas.DrawText("EFF:"@SRI.Eff$"%", false); } Canvas.Font = CanvasFont; } m=class SubStats extends Mutator; var bool m_bInsta; var SubStatsDom board; var InstaGibDM idm; var SubNotifyInfo m_SNI; var SubInstaNotify m_InstaNotify; function PostBeginPlay() { Super.PostBeginPlay(); if(Level.Game.IsA('Domination')) Level.Game.ScoreboardType = class'SubStatsDom'; else if(Level.Game.IsA('CTFGame')) Level.Game.ScoreboardType = class'SubStatsCtf'; else if (Level.Game.IsA('TeamGamePlus')) Level.Game.ScoreboardType = class'SubStatsTGP'; else Level.Game.ScoreboardType = class'SubStatsDMP'; /*else if (Level.Game.IsA('Assault')) Level.Game.ScoreboardType = class'ngWatcher3b.ngScoreboardAss'; else if (Level.Game.IsA('TeamGamePlus')) Level.Game.ScoreboardType = class'ngWatcher3b.ngScoreboardTGP'; else if (Level.Game.IsA('LastManStanding')) Level.Game.ScoreboardType = class'ngWatcher3b.ngScoreboardLMS'; else Level.Game.ScoreboardType = class'ngWatcher3b.ngScoreboardDMP';*/ m_SNI = spawn(class'SubNotifyInfo'); // Are we playing insta? foreach AllActors(class'InstaGibDM',idm) { if(idm != None) { m_bInsta = true; break; } } if(!m_bInsta) { m_InstaNotify = spawn(class'SubInstaNotify',Self); } else { log("SUBSTATS: Insta is already present"); Insta(idm); } } function ScoreKill(Pawn Killer, Pawn Other) { local SubReplicationInfo kill,victim,SRI; local float CurrentTime; if(Killer == None) return; if(Other == None) return; // called by GameInfo.ScoreKill() foreach AllActors(class'SubReplicationInfo',SRI) { if(SRI.OwnerPRI == Killer.PlayerReplicationInfo) { kill = SRI; } if(SRI.OwnerPRI == Other.PlayerReplicationInfo) { victim = SRI; } } // If kill exists and the killer wasn't the victim (suicide) if((kill != None) && (kill != victim)) { // Record whether it's a spree, and make sure we convert // from a lower spree to a higher if necessary // NOTE: for some reason, Spree seems to be -1 from the actual spree // at this point, I guess it hasn't been updated yet. switch(Killer.Spree) { case 4: kill.Spree++; break; case 9: kill.Spree--; kill.Ramp++; break; case 14: kill.Ramp--; kill.Dom++; break; case 19: kill.Dom--; kill.Un++; break; case 24: kill.Un--; kill.God++; break; default: break; } if(Killer != None) { if(Killer.Level != None) { CurrentTime = Killer.Level.TimeSeconds; // Work out if it's double kill, multi, etc. if((CurrentTime - kill.LastKillTime) < 3) { kill.MultiLevel++; if(kill.MultiLevel > 0) { switch(kill.MultiLevel) { case 1: kill.Double++; break; case 2: kill.Multi++; kill.Double--; break; case 3: kill.Ultra++; kill.Multi--; break; case 4: kill.Monster++; kill.Ultra--; break; } } } else { kill.MultiLevel = 0; } kill.LastKillTime = CurrentTime; } } } if(victim != None) { // Reset their multi level victim.MultiLevel = 0; // Bodge last kill time back to -4 seconds. victim.LastKillTime = -4.0; } if ( NextMutator != None ) NextMutator.ScoreKill(Killer, Other); } function Tick(float DeltaTime) { if (Level.Game==None) return; if ((DeathMatchPlus(Level.Game)!=None)&& !DeathMatchPlus(Level.Game).bRequireReady) { Disable('Tick'); } } function AddMutator(Mutator M) { if(idm != None) Insta(idm); if(NextMutator == None) NextMutator = M; else NextMutator.AddMutator(M); } function Insta(InstaGibDM a) { if(a != None) { a.DefaultWeapon = class'SubSuperShockRifle'; a.WeaponName = 'SubSuperShockRifle'; m_bInsta = true; } } GUclass SubReplicationInfo extends ReplicationInfo; // Used to store, and draw the scoreboards var int Kills, Spree, Ramp, Dom, Un, God, Double, Multi, Ultra, Monster, MultiLevel, FPH, Eff; var float Acc, LastKillTime; var float GameTime, GameOffset, PlayerTime, PlayerJoinTime; var String Threat, AccString; // PlayerReplicationInfo associated with our PlayerPawn var PlayerReplicationInfo OwnerPRI; var bool bTimeDown; var bool bGameEnded; replication { reliable if(Role == ROLE_Authority) Kills, Spree, Ramp, Dom, Un, God, OwnerPRI, Double, Multi, Ultra, Monster, LastKillTime, MultiLevel, FPH, Eff, Acc, Threat, PlayerTime, PlayerJoinTime, GameTime, GameOffset, AccString, bGameEnded; } function PostBeginPlay() { OwnerPRI = Pawn(Owner).PlayerReplicationInfo; MultiLevel = 0; LastKillTime = -4.0; Eff = 0; FPH = 0; PlayerJoinTime = GetGameTime(); Acc = 0; } function Tick(float DeltaTime) { if(Owner == None) { Disable('Tick'); } else { Kills = Pawn(Owner).KillCount; } if(Level.Game != None) bGameEnded = Level.Game.bGameEnded; if(!bGameEnded) { UpdateTimes(); UpdateFPH(); UpdateEff(); UpdateAcc(); UpdateThreat(); } } function UpdateAcc() { if(Owner != None) { if(Pawn(Owner).SecretCount > 0) Acc = (float(Pawn(Owner).KillCount) / float(Pawn(Owner).SecretCount)) * 100; else Acc = 0; AccString = ToDP(Acc,2); } } function string ToDP(float Value, int DP) { local string s; local int i; // Convert value to string s = string(Value); // Find the decimal point i = InStr(s, "."); // Now grab the correct length if (i != -1) s = Left(s, i+DP+1); return s; } function UpdateFPH() { local float Time, CurrentTime, Offset; if(Owner == None) return; if(bGameEnded) { // Just keep the old value } else { // We are working out kills per hour, // we have a time in seconds, so have to // multiply by 3600 if(Pawn(Owner).KillCount > 0) { FPH = int(3600*float(Kills)/PlayerTime); } else { FPH = 0; } } } function UpdateEff() { if(Owner != None) { if(Pawn(Owner).KillCount > 0) { Eff = int((float(Pawn(Owner).KillCount) / float(Pawn(Owner).KillCount + Pawn(Owner).DieCount)) * 100); } else { Eff = 0; } } } function UpdateThreat() { local String Threats[7]; local float Value; local float FPHPercent, AccPercent; local float Time, CurrentTime, Offset; local PlayerPawn PlayerOwner; // If time is small, make them an unknown threat if(PlayerTime < 30 && !bGameEnded) { Threat = "UNKNOWN"; } else { if(IsLame()) { Threat = "LAMER"; } else { // Work out a number which we shall call the threat value // This takes FPH and EFF and ACC into account, they get bonus points added // to this for sprees and multi kills // Work out value from FPH on the basis that 600 FPH counts as 100% FPHPercent = 100*(float(FPH)/600); // Work out value from Acc on the basis that 35% acc counts as 100% AccPercent = 100*(Acc/35); // Efficiency counts for more than FPH and Acc Value = (0.70 * Eff) + (0.15 * FPHPercent) + (0.15 * AccPercent); // Add bonus points for sprees Value += 0.4*Spree; Value += (1.0*Ramp); Value += (1.8*Dom); Value += (3.2*Un); Value += (5.4*God); // Add bonus points for multi kills Value += (0.1*Double); Value += (0.25*Multi); Value += (0.45*Ultra); Value += (0.7*Monster); if(Value < 42.5) { // This guy sux ass Threat = "N00B"; } else if(Value < 50) { // Competent Threat = "COMPETENT"; } else if(Value < 55) { // Dangerous Threat = "DANGEROUS"; } else if(Value < 60) { // PWNS Threat = "LIABILITY"; } else if(Value < 65) { // Dangerous Threat = "PWNER"; } else if(Value < 75) { // Dangerous Threat = "OMFG!"; } else { // Dangerous Threat = "BOT?"; } } } } function bool IsLame() { // Compare kill count with score // If they've got an excessively high score for their // kill count, then they are probably flag whoring // or point whoring local float Ratio; // CTF if(Level.Game.IsA('CTFGame')) { Ratio = 3; } else if(Level.Game.IsA('Domination')) { // Dom Ratio = 4; } else { return false; } // Check if lame if((OwnerPRI.Score / float(Kills)) > Ratio) { return true; } return false; } function float GetGameTime() { local float Seconds; // Work out time since game start if(Level.Game != None) { if(Level.Game.GameReplicationInfo.RemainingTime > 0) { Seconds = TournamentGameReplicationInfo(Level.Game.GameReplicationInfo).TimeLimit*60; Seconds = (Seconds - Level.Game.GameReplicationInfo.RemainingTime); } else { Seconds = Level.Game.GameReplicationInfo.ElapsedTime; } } else { Seconds = GameTime; } return Seconds; } function UpdateTimes() { // Total Game Time, i.e. since match started GameTime = GetGameTime(); // The level time at which the match started GameOffset = Level.TimeSeconds - GameTime; // The length of time this player has been in the game PlayerTime = GameTime - PlayerJoinTime; } yclass SubNotifyInfo extends SpawnNotify; var int ShowBonusInfo; var bool ShowClickBoard; var Decoration FakeFlag; function PreBeginPlay() { Super.PreBeginPlay(); ShowClickBoard = true; bAlwaysRelevant = true; CreateFlag(); Timer(); SetTimer(0.333, True); } simulated event Actor SpawnNotification(actor A) { local SubReplicationInfo SRI; if(A == None) return A; if ( A.IsA('Bot') || (A.IsA('TournamentPlayer') && !A.IsA('Commander')) ) { SRI = Spawn(Class'SubReplicationInfo', Pawn(A)); } return A; } function CreateFlag() { local Actor A; FakeFlag = Spawn(class'SubFlag'); if (FakeFlag != None) return; foreach AllActors(class'Actor', A) { FakeFlag = Spawn(class'SubFlag', None,, A.Location); if (FakeFlag != None) return; } } function Timer() { local Pawn P; local DeathMatchPlus DMP; if(ShowClickBoard && FakeFlag != None) { if(Level.Game.IsA('Domination') || Level.Game.IsA('CTFGame')) { DMP = DeathMatchPlus(Level.Game); if ((DMP.CountDown > 0) && DMP.bTournament) { For(P=Level.PawnList;P!=None;P=P.NextPawn) { if (P.IsA('PlayerPawn') && !P.IsA('Spectator') && PlayerPawn(P).bReadyToPlay && P.PlayerReplicationInfo.HasFlag == None) P.PlayerReplicationInfo.HasFlag = FakeFlag; } } else { For(P=Level.PawnList; P!=None; P=P.NextPawn ) { P.PlayerReplicationInfo.HasFlag = None; } if (FakeFlag != None) FakeFlag.Destroy(); FakeFlag = None; SetTimer(0, False); } } } } bclass SubInstaNotify extends SpawnNotify; simulated event Actor SpawnNotification(Actor A) { if(A != None && SubStats(Owner) != None) { if(A.IsA('InstaGibDM')) { SubStats(Owner).idm = InstaGibDM(A); SubStats(Owner).Insta(InstaGibDM(A)); } } return A; } r// Just a dummy class for displaying ready flags on console class SubFlag extends GreenFlag; event PreBeginPlay() { } event PostBeginPlay() { } function SendHome() { } function Drop(vector newVel) { } auto state Home { ignores Touch, Timer, BeginState, EndState; } ą,} ĖL  ž žM A½ üN P Jå €÷ūO G,!’Žü’’’’’’’Qi’’’’fQi’’’’sQiż’’’Oiż’’’Niū’’’yGž’’’li’’’’Mi’’’’Oiż’’’GNž’’’Fi’’’’^iż’’’QTü’’’[iż’’’ci’’’’DNų’’’AOž’’’@gž’’’\iż’’’PNö’’’eiū’’’lNö’’’Ki’’’’xiż’’’Fi’’’’oOų’’’BNņ’’’biż’’’gcü’’’YKå’’’!Tž’’’Pi’’’’FQū’’’Iiū’’’{Nų’’’Diū’’’vNõ’’’sF’’’’Mi’’’’YQ_iÕ’’’RNü’’’[iū’’’^iż’’’ENī’’’xiż’’’iNč’’’Igų’’’oGų’’’Nę’’’XQÜ’’’zGž’’’|iū’’’;NŁ’’’Ii’’’’pi’’’’ri’’’’yi’’’’Dgč’’’UOü’’’ZNč’’’HQõ’’’WNü’’’_Gö’’’Nü’’’}cč’’’zOŌ’’’ZOž’’’riū’’’pNÖ’’’mPü’’’aQÜ’’’Mi’’’’QTü’’’\QÜ’’’xNä’’’xPü’’’^Pä’’’kOž’’’Acę’’’yQü’’’NPü’’’]QÜ’’’LTņ’’’gPņ’’’Giū’’’mcÄ’’’vgč’’’LGö’’’cč’’’qQõ’’’DcĘ’’’CGö’’’,Gč’’’ iū’’’nQę’’’wOņ’’’fNņ’’’hGø’’’4iū’’’|Nõ’’’cGĆ’’’.Gč’’’i’’’’tgų’’’jOü’’’{iū’’’zQę’’’xGÖ’’’3Gų’’’Pö’’’hQõ’’’Eiż’’’HGų’’’ Gö’’’/Kå’’’Agö’’’~GÖ’’’2iū’’’kH§’’’GG§’’’JPÖ’’’jG§’’’ATö’’’]Gž’’’Pä’’’iM†’’’SQŅ’’’sGø’’’<Qõ’’’dPŅ’’’tQŁ’’’Sgų’’’rPŅ’’’@Pī’’’TG§’’’ė8BDB‡ fFH‡ńfTH‡×fbH×V pH V }HńV JI‡2fWI‡÷feI‡ÜfsI‡ĒfAJ‡>fOJ‡Ūf]J‡õfkJ‡@yJ‡ŹfGK‡åfUK† o cK†ńo oK†×o {K†'n GL†Źp TL†>p `L†Ūp lL‡7QxL†õp FMåV RM‡šf _M‡Õ`lM‘lzM†Źo IN‡`VN†Ūo dN‡ī`qN†>o N†õo KO‡łfXO‡ÉffO‡ŽftO‡*fBP† W PP†ńW ]P†×W jP†Ēo wP†2o DQ†÷o QQ†Üo ^Q‡fkQ‡š`yQ‡fGR†×T UR‡čfaRŸĮoR‡Šf}R† T KS†ńT WS‡\ cS‡fpS†ÜW ~S‡>] KTfXT‡ngT†2W wTDU†2T RU‡ūf^U†ĒT lU†ÜT yU†ĒW EV‡Ū] RV†÷T _V†÷W lV†Ēp yV†÷p EW‡õ] QW‡Ģf^W†2p lW‡Ź] xW†Üp EXåU QX‡ąf]X‡Ē] kX†õT xX‡÷] EY‡2] RY†õW _Y‡f lY‡:SyYŸ GZŸæUZ†ŹW cZ†ŹT pZ†šT }Z†>W J[ŸĀW[†je[ńV t[‡īf A\×V N\d[\`j\ay\‡RH]‡Ü] V]dc]cr]†ŪT A^†ŪW N^a[^bj^‡Õf y^†>T F_ V S_†ÕT `_‡ĀBm_e{_‡æBJ`†ÜR X`†ÕW e`}r`‡}Aa†īT Oa†ńp \a†īW ha†W ua†×p Ab†šW Mb‘U Zb†ĒR gb‡ Btb†W Bc†T Oc†2R \c† p ic‘ÕU uc‘īU Bd†÷R OdL\d‡qkd†×X yd‡?SFe‡]Te‡üfbeŖ~pe×U nn‡įfzn† X Ho‘0u Uo U bo‡×`no‡Ķf|o‡ `Jp‡ń`XpńU fp†grp‡`Aq‘mOq†ńX ]q†hjq‡ fyq‡×EGr†wUr†T drŸLpr–æ ~r‡å`Ks†čT Ys–×N es–irs†T @t‡ńELt‡fZt‡Ļfht‡ēfvt†ŠT Du†ĒZ Pu–ńN ]u–  ju†å wu†÷Z Dv– N QvŸÕL^v‡flv‡ EzvŸīLHw–Į Vw†F cw–Ā pwŸšL}w†2Z Kx†ÜZ Xx‡P ex‘ūU rxüZ x‘ŹZ Ky‡Õ]Wy–{ ey†ūo ry‘ūs yšJ Kz†p Xz‡ł`ez†o sz‡Ü`@{‡š]N{ŸüL\{‘>X j{† ~ w{‘>Y C|‡÷`P|ÕJ ^|†J k|‘ąs w|‡ü`C}‘ŹY Q}‘ŹX ^}‘ŪV k}†ąo x}‘ŹW E~‘ąU R~‘ŪW _~‡Ņ] l~‘ŹV y~‘Šd F‘s S‘õV _‘õW l‘õX y‘õY F€‘õZ S€‘>Z _€‡*`k€†Šo y€0V F‡ CRįZ `‘ŪX lŸįLy‡į`G‚–šG U‚‘ŪY a‚‘ŪZ n‚†×b z‚‡S Fƒ‡ĀCSƒ‘Ģs aƒ‡2`mƒ†o {ƒ‡æCH„‘d V„‡’] c„‡] p„‡Ķ`}„ŸĶLK…‡ĮCY…‘d g…‡åE t…‡ĮBA†J O†‡É`\†‘>W j†‘>V w††ńb D‡† b P‡_\‡‡7O k‡‡Ē`x‡ĶZ Fˆ†čo Rˆ†åW _ˆ‘čd lˆ‡ī]yˆīJ G‰‘ĢU T‰‡Ž`a‰†o o‰†åo |‰‡]IŠ‡ź] WŠ†Ģo dŠīgqŠ½9KXŒīK c‘‘čS p‘‡ĒE}‘‘čU K’†čp X’ēF}e’ńK b±ńJ o±‡>E|±‘ēz J²ÉS W²ŸÉRc²Ē` q²†ÉW ~²†ÉT K³†ēB X³2` d³‡ĢEq³–[ ³†ĢW K“†ĢT X“†įp e“‡8S r“‡2E“†Ķp Mµ‡õEZµ†khµ*S vµŸ*RB¶†ąT P¶†ąW ]¶†ĻB j¶‡ąEv¶‘Ļz D·÷` Q·‡÷E^·‡ŹEl·‡štz·łS Hø†ŽT Tø†ŽW aø†*W nøŸŽR{øŽS I¹†*T U¹ŸłRb¹†łW p¹†łT }¹†Šp Jŗ‡ÜEWŗ‡ūEeŗšK sŗ†ūW @»†ūT M»Ü` Z»‘ŠU g»†o t»†üp A¼‘ŠS N¼†'v [¼†'w h¼‡ŪEu¼‘U C½†B P½ÕK \½–G i½†W u½† B B¾‘z N¾‡V [¾†p h¾‘U u¾×K Bæ‘S Oæ×J \æ‘ z iæ J væ K CĄ†p PĄ‘U ]ĄK jĄ‘S wĄ½:uDĮ‡tyĀ‡æGĆ–N UƇ`bĆ–æ pĆ–æ }Ć–æ JÄŸ LWćĀeÄ–Ā sÄ–Ā @Å–Ā MÅ–æ ZÅ–æ gÅ–Ā tÅ–Ā Aʆ T Nʇ’`[ʆ W iʆ p vĘŸLCĒ‡QĒ–ÕN _Ē‡~lĒ‡Õt{Ē†T IȆW VȆp cČ‘šU pČ‘l }ȆT JɆW WɇŅ`dɆüT rɆüW ɇELŹ†p ZŹ‡Ū`gŹ†üo uŹ‘ūl BĖ†ūp OĖ–Į \Ė–Į iĖ–Į vĖ0q CĢ†ąp PĢŸĻL]Ģ†ĻT kĢ†ĻW xĢ†0n EĶ†Ļp RĶ–Į _Ķ‘ąl kĶ–šN xĶ‡õ`EĪ†ĶT SĪ†ĶW `Ī–  mĪ†Ķo zĪ†iGĻ–  VĻ‡Ź`cĻ†įo qĻ‡:] ~Ļ‘Ģl KŠ†įW XŠ†įT eŠ–  rŠ–  Š†Ģp LчĮYц@n gч>`sцAn AŅČ+dMŅ†ēp qÓ–  ~Ó†ēW KŌ†ēT XŌŸēLeŌ‡ sŌ˜5zAÕ–īN {óˆ6RHōā7|Z‡ītV¬†åp d¬–Į q¬‡ź`~¬Œæ I L­–ÉN U¹Œæ wb¹ŒæF Y½ĢN _ÉŒæKlÉŒæ xwĢĻN oĻŒæ `|ĻŒæ G\чŅNcŌŒæBqŌ‘Õs sÕ‡ÕEÕŒźæQMÖ†×Y ^ÜŒįæ NkÜŒ“æMyó†ŚO FõŒĆæ>RõŒ F PöŒ  A V‚–ŽN WŽŒ  wdŽąN [’Œ Kh’Œ  xs•ŒĆĮ>k˜†āO i™Œ“ĮMu™ŒõĮ W B›ēN Y¤Œ  `f¤Œ  GF¦‡źNM©Œ B[©‘īs ]Ŗ†åe iŖ‡īEvŖŒź QD«†ńY U±ŒńĮwb±Œį  NY·Œ“ MgĪ†ōO tĻŒĆ >@ŠŒĀF ~Š‡šEDŻŒĀ I RŻ–łN [éŒĀ whéūN _ķŒĀKlķŒĀ xwš‘šs oóN |óŒĮBIōŒĀ `Kõ‡’NköŒĀ GyöŒĮ F@ś‡NFżŒĀBTż‘s Vž‡EbžŒĄĀQpž† Y A…ŒįĀ NN…ŒĮ `\œŒ“ĀM|†O IŸŒĆĀ>UŸŒGS Œł2MZ” N g¢†O t¢ŒĆ[@£ŒĮ ^[¤Œš3\ y،ܐ_U²†T t¶‡|A·Œ1AP·†N QøŒ#t^øŸLR»Z `»– N m»ŒĮOz»Œ(yI¾‡'t BĄ†'H OĄ†'J \Ą†'` iĄN vĄ‘'u CĮŒ%KOĮŒ&lZȆ-H FŹŒĮ uRŹ†-J GĪ†-` TĪŒ'`aĪ‘0N AŠ–*N NŠŒ-V[ŠŒ)pqŃŒĮ @ aÓ†4O aߌĆwmߌÜQdį–C uāŒö/VBćŒ*]Xč‡:NuéŒé.rCźŒą,