aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/cl_gg_earn_meter.gnut
blob: f28e8cbd5f17150dcd46fdb0f40855a25c875034 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
global function Cl_GGEarnMeter_Init
global function Cl_GGEarnMeter_RegisterNetwork

const float FILL_ANIM_DURATION = 0.2

struct EarnChangeData
{
	float startValue = 0.0
	float endValue = 0.0
	float updateTime = 0.0
}

struct {
	EarnChangeData lastEarnedData
	var earnMeterRui
	asset functionref() getIconFunction
	bool functionref() testIconFunction
} file

void function Cl_GGEarnMeter_Init( asset functionref() getIconFunction, bool functionref() testIconFunction = null )
{
	AddCallback_OnClientScriptInit( CreateGGEarnMeterUI )

	file.getIconFunction = getIconFunction
	file.testIconFunction = testIconFunction
}

void function CreateGGEarnMeterUI( entity player )
{
	file.earnMeterRui = CreateCockpitRui( $"ui/earn_meter.rpak" )

	RuiSetFloat( file.earnMeterRui, "fillAnimDuration", FILL_ANIM_DURATION )
	RuiSetGameTime( file.earnMeterRui, "lastEarnChangeTime", RUI_BADGAMETIME )
	RuiSetFloat( file.earnMeterRui, "earnedStartFrac", 0.0 )
	RuiSetInt( file.earnMeterRui, "meterMode", 5 )

	RuiTrackFloat( file.earnMeterRui, "earnedFrac", player, RUI_TRACK_SCRIPT_NETWORK_VAR, GetNetworkedVariableIndex( "gunGameLevelPercentage" ) )

	thread Cl_GGEarnMeter_TrackWeaponIcon()
}

void function Cl_GGEarnMeter_RegisterNetwork()
{
	RegisterNetworkedVariableChangeCallback_float( "gunGameLevelPercentage", GunGamePercentageUpdate )
}

void function GunGamePercentageUpdate( entity player, float oldValue, float newValue, bool actuallyChanged )
{
	if ( !actuallyChanged )
		return

	float currentValue = Cl_GGEarnMeter_GetCurrentMeterValue( file.lastEarnedData )
	RuiSetGameTime( file.earnMeterRui, "lastEarnChangeTime", Time() )
	RuiSetFloat( file.earnMeterRui, "earnedStartFrac", currentValue )

	file.lastEarnedData.startValue = oldValue
	file.lastEarnedData.endValue = newValue
	file.lastEarnedData.updateTime = Time()
}

float function Cl_GGEarnMeter_GetCurrentMeterValue( EarnChangeData earnData )
{
	float elapsedTime = Time() - earnData.updateTime
	float delta = earnData.endValue - earnData.startValue
	return earnData.endValue - (delta * EaseIn( GraphCapped( elapsedTime, 0.0, FILL_ANIM_DURATION, 1.0, 0.0 ) ) )
}

void function Cl_GGEarnMeter_TrackWeaponIcon()
{
	int lastScore = -1
	while ( IsValid( file.earnMeterRui ) )
	{
		if ( file.testIconFunction == null || file.testIconFunction() )
		{
			asset weaponImage = file.getIconFunction()

			RuiSetImage( file.earnMeterRui, "goalBuildingIcon", weaponImage )
			RuiSetImage( file.earnMeterRui, "goalReadyIcon", weaponImage )
		}

		WaitFrame()
	}
}