124 lines
3.6 KiB
Ucode
124 lines
3.6 KiB
Ucode
/*
|
|
--------------------------------------------------------------
|
|
Condition_Counter
|
|
--------------------------------------------------------------
|
|
|
|
A Condition which increments each time its owning Objective is
|
|
triggered.
|
|
|
|
Author : Alex Quick
|
|
|
|
--------------------------------------------------------------
|
|
*/
|
|
|
|
class ObjCondition_Counter extends KF_ObjectiveCondition
|
|
editinlinenew;
|
|
|
|
enum ECounterType
|
|
{
|
|
CT_Default, // default setting - NumToCount is user defined and NumCounted represents the number of times this objective has been triggered .
|
|
CT_Cash, // NumCounted becomes the total cash sum accrued by all players. NumToCount is whatever sum of cash you expect them to accumulate.
|
|
CT_PlayerCount, // NumCounted becomes the number of unique players who triggered this Objective. NumToCount is the total number of active players in the match.
|
|
};
|
|
|
|
|
|
var () ECounterType CountType;
|
|
|
|
var () int NumToCount;
|
|
|
|
var int NumCounted,SavedNumCounted;
|
|
|
|
/* if SuccessCondition is set to OBJ_Counter and CountType is CT_PlayerCount, this array will store unique player IDs for each
|
|
played who has been 'counted' so far. */
|
|
var array<int> CountedPlayerIDs;
|
|
|
|
|
|
function SaveState()
|
|
{
|
|
Super.SaveState();
|
|
SavedNumCounted = NumCounted;
|
|
}
|
|
|
|
function Reset()
|
|
{
|
|
Super.Reset();
|
|
NumCounted = SavedNumCounted;
|
|
CountedPlayerIDs.length = 0;
|
|
}
|
|
|
|
|
|
|
|
/* returns the percentage of completion for this condition */
|
|
function float GetCompletionPct()
|
|
{
|
|
local float Numerator;
|
|
local float Denominator;
|
|
|
|
switch(CountType)
|
|
{
|
|
case CT_Default : break;
|
|
case CT_Cash : NumCounted = GetObjOwner().StoryGI.GetTotalCashSum(); break;
|
|
case CT_PlayerCount : NumToCount = Max(GetObjOwner().StoryGI.GetTotalActivePlayers(),1); break;
|
|
}
|
|
|
|
Numerator = float(NumCounted);
|
|
// Take the floor of the modified amount to ensure accuracy. Also, there's no floor function available.
|
|
Denominator = float(int(float(NumToCount) * GetTotalDifficultyModifier()));
|
|
return FClamp(Numerator/Denominator,0.f,1.f) ;
|
|
}
|
|
|
|
|
|
function Trigger( actor Other, pawn EventInstigator)
|
|
{
|
|
Super.Trigger(Other,EventInstigator);
|
|
|
|
/* each trigger increments the 'counter' for objectives of that type */
|
|
if(ConditionIsActive() && ValidForCounting(EventInstigator))
|
|
{
|
|
SetTargetActor(InstigatorName,EventInstigator);
|
|
NumCounted = Min(NumCounted + 1,Round(NumToCount * GetTotalDifficultyModifier())) ;
|
|
}
|
|
}
|
|
|
|
/* Relevant if this Objective is configured to count players -
|
|
returns true if this is the first time the supplied pawn has triggered us
|
|
*/
|
|
|
|
function bool ValidForCounting(Pawn CountedPawn)
|
|
{
|
|
local int i;
|
|
|
|
if(CountType == CT_PlayerCount &&
|
|
CountedPawn.PlayerReplicationInfo != none)
|
|
{
|
|
for( i = 0 ; i < CountedPlayerIDs.length ; i ++)
|
|
{
|
|
/* this guy has already been counted. ignore him */
|
|
if(CountedPlayerIDs[i] == CountedPawn.PlayerReplicationInfo.PlayerID)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* If we got this far CountedPawn is unique - add his ID to the array */
|
|
CountedPlayerIDs[CountedPlayerIDs.length] = CountedPawn.PlayerReplicationInfo.PlayerID ;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function string GetDataString()
|
|
{
|
|
if(HUD_Screen.Screen_CountStyle < 1)
|
|
{
|
|
return NumCounted$"/"$int(NumToCount * GetTotalDifficultyModifier()) ;
|
|
}
|
|
|
|
return string(Max((int(NumToCount * GetTotalDifficultyModifier()))-NumCounted,0)) ;
|
|
}
|
|
|
|
DefaultProperties
|
|
{
|
|
NumToCount = 1
|
|
}
|