rott/kf_sources/KFStoryGame/Classes/ObjAction_Random.uc
2026-07-14 20:27:09 +07:00

99 lines
2.5 KiB
Ucode

/*
--------------------------------------------------------------
Action_Random
--------------------------------------------------------------
This Action serves as a container for any number of other Actions.
when initalized, it picks one at random and activates it.
Author : Alex Quick
--------------------------------------------------------------
*/
class ObjAction_Random extends KF_ObjectiveAction
editinlinenew
HideCategories(KF_ObjectiveAction);
struct SRandomAction
{
var () editinlineuse KF_ObjectiveAction Action;
var () int Priority;
};
var (Actions) float PriorityBias;
var (Actions) editinlineuse array<SRandomAction> RandomActions;
var int RandIdx;
function ExecuteAction(Controller ActionInstigator)
{
Super.ExecuteAction(ActionInstigator);
AssignRandomAction(ActionInstigator);
}
function Reset()
{
super.Reset();
SwapAction(self);
}
function AssignRandomAction(Controller ActionInstigator)
{
local float HighestRating;
local float PriorityVal;
local int BestIdx;
local array<float> Ratings;
local int i,idx;
HighestRating = -1;
BestIdx = -1;
for(i = 0 ; i < RandomActions.length ; i ++)
{
PriorityVal = RandomActions[i].Priority ;
Ratings[i] = RandRange( FMin(Ratings[idx] * PriorityBias,Ratings[idx]) , PriorityVal ) ;
}
for(idx = 0 ; idx < Ratings.length ; idx ++)
{
if(Ratings[idx] > highestRating &&
RandomActions[idx].Action.IsValidActionFor(GetObjOwner()) )
{
BestIdx = idx;
HighestRating = Ratings[idx] ;
}
}
if(BestIdx < 0 || BestIdx >= RandomActions.length)
{
log("Warning - Cannot find a valid action for : "@self@" Random action will fail. ",'Story_Debug');
}
RandIdx = BestIdx;
RandomActions[RandIdx].Action.ActionType = ActionType;
RandomActions[RandIdx].Action.SetObjOwner(GetObjOwner());
SwapAction(RandomActions[RandIdx].Action) ;
RandomActions[RandIdx].Action.ExecuteAction(ActionInstigator);
}
function SwapAction(KF_ObjectiveAction SwapAction)
{
switch(ActionType)
{
case 0 : GetObjOwner().FailureAction = SwapAction; break;
case 1 : GetObjOwner().SuccessAction = SwapAction; break;
}
}
defaultproperties
{
PriorityBias = 0.5
}