class FtgHUD extends TSCHUD; var localized string titleStinkyClot; var localized string hintStinkyClot; var transient float StinkyTime; var transient bool bFoundStinkyClot; simulated function bool CheckForStinkyClot() { local StinkyClot SC; if ( PawnOwner != none ) { foreach PawnOwner.VisibleCollidingActors(class'StinkyClot', SC, 1000, PawnOwner.Location) { StinkyTime = Level.TimeSeconds + 60; // show stinky hint for the next minute return true; } } StinkyTime = Level.TimeSeconds + 3; // look again in 3s return false; } simulated function DrawTSCHUDTextElements(Canvas C) { local TSCTeamBase TeamBase; local bool bAtOwnBase, bAtEnemyBase; local int FontSize; local float XL, YL, BottomY; local string aHint, aTitle; local bool bCriticalHint; local string s; local int row; // enemy base TeamBase = TSCTeamBase(KFGRI.Teams[1-TeamIndex].HomeBase); if ( TeamBase != none && TeamBase.bActive ) { bAtEnemyBase = TSCGRI.AtBase(PawnOwner.Location, TeamBase); if ( EnemyBaseDirPointer == None ) { EnemyBaseDirPointer = Spawn(Class'KFShopDirectionPointer'); } // apply enemy team color if ( TeamIndex == 0) EnemyBaseDirPointer.UV2Texture = ConstantColor'TSC_T.HUD.BlueCol'; else EnemyBaseDirPointer.UV2Texture = none; if ( bAtEnemyBase ) C.SetDrawColor(196, 206, 0, KFHUDAlpha); else C.DrawColor = TextColors[1-TeamIndex]; DrawDirPointer(C, EnemyBaseDirPointer, TeamBase.Location, 1, 0, false, strEnemyBase); } // own base TeamBase = TSCTeamBase(KFPRI.Team.HomeBase); if ( TeamBase == none ) return; // just in case if ( !TeamBase.bHidden && !(TeamBase.bHeld && TeamBase.HolderPRI == KFPRI) ) { if ( BaseDirPointer == None ) { BaseDirPointer = Spawn(Class'KFShopDirectionPointer'); BaseDirPointer.UV2Texture = ConstantColor'TSC_T.HUD.GreenCol'; } bDrawShopDirPointer = !KFGRI.bWaveInProgress && (ScrnGRI == none || ScrnGRI.bTraderArrow); // always draw Trader Arrow during the Trader Time bAtOwnBase = TSCGRI.AtBase(PawnOwner.Location, TeamBase); if ( TeamBase.bActive ) { s = strOurBase; if ( bAtOwnBase) C.SetDrawColor(32, 255, 32, KFHUDAlpha); else C.SetDrawColor(196, 206, 0, KFHUDAlpha); } else if ( TeamBase.bHeld ) { s = strCarrier; C.SetDrawColor(196, 206, 0, KFHUDAlpha); } else { s = strGnome; C.SetDrawColor(200, 0, 0, KFHUDAlpha); // dropped somewhere } if ( bDrawShopDirPointer ) row = 1; // shift team base arrow to fit trader pointer DrawDirPointer(C, BaseDirPointer, TeamBase.GetLocation(), row, 0, false, s); } else bDrawShopDirPointer = (ScrnGRI == none || ScrnGRI.bTraderArrow); // no gnome = draw shop arrow // hints if ( bHideTSCHints || KFGRI.EndGameType > 0 ) return; if ( TSCGRI.ElapsedTime <= 10 ) { aTitle = titleWelcome; aHint = hintWelcome; bCriticalHint = true; } else if ( TSCGRI.bWaveInProgress ) { bFoundStinkyClot = bFoundStinkyClot || ( StinkyTime < Level.TimeSeconds && CheckForStinkyClot() ); if ( TSCGRI.WaveNumber == 0 ) aHint = hintFirstWave; else if ( TSCGRI.bSuddenDeath ) { aHint = hintSuddenDeath; aTitle = titleSuddenDeath; } else if ( bAtEnemyBase ) { aHint = hintEnemyBase; bCriticalHint = true; } else if ( TSCGRI.MaxMonsters >= 10 && !bAtOwnBase && TeamBase.bActive ) { aHint = hintGotoBase; } else if ( bFoundStinkyClot && StinkyTime > Level.TimeSeconds ) { aHint = hintStinkyClot; aTitle = titleStinkyClot; } } else { if ( TSCGRI.bSuddenDeath ) { aHint = hintSuddenDeathTrader; aTitle = titleSuddenDeath; bCriticalHint = true; } else if ( bAtEnemyBase ) { if ( TeamBase.bHeld && TeamBase.HolderPRI == KFPRI ) aHint = hintSetupEnemyBase; else aHint = hintEnemyBase; bCriticalHint = true; } else if ( TeamBase.bActive ) { if ( TSCGRI.TimeToNextWave < 30 && !bAtOwnBase ) aHint = hintGotoBase; else if ( TSCGRI.TimeToNextWave < 10 ) aHint = hintPrepareToFight; else aHint = hintShopping; } else if ( TeamBase.bHeld ) { if ( TeamBase.HolderPRI == KFPRI ) { aTitle = titleSetupBase; aHint = hintSetupBase; s = PlayerOwner.ConsoleCommand("BINDINGTOKEY SetupBase"); if ( s == "" ) s = PlayerOwner.ConsoleCommand("BINDINGTOKEY AltFire"); ReplaceText(aHint, "%KEY%", s); } else if ( TSCGRI.TimeToNextWave < 30 ) aHint = hintFollowCarrier; // enough shopping, time to get to the base else aHint = hintShopping; // others can do shopping while somebody sets up the base } else if ( TSCGRI.TeamCarrier[TeamIndex] == none || TSCGRI.TeamCarrier[TeamIndex] == KFPRI ) { aTitle = titleSetupBase; aHint = hintGetGnome; } else aHint = hintShopping; } if ( C.ClipX <= 1024 ) FontSize = 7; else if ( C.ClipX < 1400 ) FontSize = 6; else FontSize = 5; BottomY = C.ClipY; if ( aHint != "" ) { C.Font = LoadFont(FontSize); C.StrLen(aHint, XL, YL); if ( bCoolHud && !bCoolHudLeftAlign ) { C.SetPos((c.ClipX-XL)/2, 0); // top center BottomY = YL; } else { BottomY -= YL; C.SetPos((c.ClipX-XL)/2, BottomY); // bottom center } if ( bCriticalHint ) { CriticalHintBG -= fmax(1.0, (Level.TimeSeconds - LastCriticalHintTime) * 200.0); LastCriticalHintTime = Level.TimeSeconds; if ( CriticalHintBG < 32 ) CriticalHintBG = 232; C.SetDrawColor(CriticalHintBG, CriticalHintBG, 0, 128); } else C.SetDrawColor(32, 32, 32, 80); C.DrawTileStretched(WhiteMaterial, XL, YL); C.DrawColor = TextColors[TeamIndex]; C.DrawText(aHint); } if ( aTitle != "" ) { C.Font = LoadFont(FontSize-1); C.StrLen(aTitle, XL, YL); if ( bCoolHud && !bCoolHudLeftAlign ) CowboyTileY = fmax(CowboyTileY, (BottomY + YL) / C.ClipY); // shift down cowboy mode to properly display hints else BottomY -= YL; C.SetPos((c.ClipX-XL)/2, BottomY); C.SetDrawColor(32, 32, 32, 80); C.DrawTileStretched(WhiteMaterial, XL, YL); C.DrawColor = TextColors[TeamIndex]; C.DrawText(aTitle); } } defaultproperties { titleStinkyClot="STINKY CLOT" hintStinkyClot="OMG it is a Stinky Clot! You cannot kill them but those things are really nasty." titleWelcome="FOLLOW THE GUARDIAN" titleBaseLost="FAILED TO FOLLOW THE GUARDIAN" hintWelcome=" Welcome to FTG! Watch this place for useful hints. " hintFirstWave="First wave is a usual KF wave. Kill all zeds and dont die :)" hintGotoBase="Get to your Base and protect The Guardian!" hintGetGnome="Take the Guardian from your trader to set up a Base" hintBaseLostTrader="You lost your Guardian and now you are dead!" }