
//==============================================================================
//
//    Final Fight
//
//==============================================================================

bool bFinalFight = false;

void ToggleForceField( bool bOn )
{
	bFinalFight = bOn;

	int anim = bOn ? anim_doorClose : anim_doorOpen;
	for ( int i=TID_River_ForceField1; i<TID_River_ForceField_End; ++i )
	{
		kActor@ actor = World.GetActorByTID( i );
		if ( actor !is null )
			actor.AnimState().Set( anim, 4, 0 );
	}

}

bool TriggerIfPresent( int TID )
{
	kActor@ actor = World.GetActorByTID( TID );
	if ( actor is null )
		return false;
	World.TriggerActorsByTID( Player.Actor().CastToActor(), TID );
	return true;
}

// Force Field Activate
$script 304
{
	if ( bFinalFight )
		return;

	// don't activate inside the forcefield itself if player is dropping into the clearing
	if ( instigator.Origin().y < 2352 && instigator.Origin().x < 4545 )
		return;

	// don't start fight if everyone's already dead
	int count = 0;
	for ( int i=TID_River_Fight1_PurLin; i<TID_River_Fight3_End; ++i )
	{
		kActor@ actor = World.GetActorByTID( i );
		if ( actor !is null && actor.Flags() & AF_DEAD == 0 )
			++count;
	}
	if ( count <= 0 )
		return;

	ToggleForceField( true );
	PlayMusic( 4 );

	for ( int i=TID_River_Fight1_PurLin; i<=TID_River_Fight1_Pistolero; ++i )
		World.TriggerActorsByTID( instigator, i );

	Game.CallDelayedMapScript( TID_River_ForceField_Active, instigator, 0 );
}

// Force Field Active
$script 305
{
	// arena sector music is the same as save area sector music, which means respawning won't trigger a music change
	// so if the player dies, we need to start the normal music back up, so the fight music doesn't get stuck playing
	if ( Player.Actor().Flags() & AF_DEAD != 0 )
	{
		PlayMusic( 1 );
		return;
	}

	// push the player inward if he's inside the forcefield itself (player tried to jump around the edge)
	if ( GetAreaFlags(Player.Actor()) & AAF_BLOCK != 0 )
	{
		kVec3 v = kVec3( 4887, 2400, 0 ) - Player.Actor().Origin();
		v.z = 0;
		v.Normalize();
		Player.Actor().SetPosition( Player.Actor().Origin() + v * 25 );
	}

	int count = 0;
	for ( int i=TID_River_Fight1_PurLin; i<TID_River_Fight3_End; ++i )
	{
		kActor@ actor = World.GetActorByTID( i );
		if ( actor is null || actor.Flags() & AF_DEAD != 0 )
		{
			// actor target TID can only trigger actors, not scripts, so we have to track their deaths manually...
			switch ( i )
			{
				case TID_River_Fight1_PurLin:
					Game.CallDelayedMapScript( TID_River_Fight1_PurLin_Death, instigator, 0 );
					break;
				case TID_River_Fight1_Polearm1:
					Game.CallDelayedMapScript( TID_River_Fight1_Polearm1_Death, instigator, 0 );
					break;
				case TID_River_Fight1_Polearm2:
					Game.CallDelayedMapScript( TID_River_Fight1_Polearm2_Death, instigator, 0 );
					break;
				case TID_River_Fight1_Rifleman:
					Game.CallDelayedMapScript( TID_River_Fight1_Rifleman_Death, instigator, 0 );
					break;
				case TID_River_Fight1_Pistolero:
					Game.CallDelayedMapScript( TID_River_Fight1_Pistolero_Death, instigator, 0 );
					break;
				case TID_River_Fight2_Commander:
					Game.CallDelayedMapScript( TID_River_Fight2_Commander_Death, instigator, 0 );
			}
		}
		else
			++count;
	}

	if ( count <= 0 )
	{
//		delay( 2 );
		ToggleForceField( false );
		PlayMusic( 1 );
	}
	else
		$restart;
}

// Pur-Lin Death
$script 344
{
	// TODO: this is probably unnecessary, as force field active event will see that the commander is dead and trigger his death event
	if ( !TriggerIfPresent(TID_River_Fight2_Commander) )
		Game.CallDelayedMapScript( TID_River_Fight2_Commander_Death, instigator, 0 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Polearm1 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Polearm2 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Polearm3 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Polearm4 );
}

// Polearm1 Death
$script 345
{
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Knife1 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Bludgeon1 );
}
// Polearm2 Death
$script 346
{
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Knife2 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Axeman );
}

// Rifleman Death
$script 347
{
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Rifleman1 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Rifleman2 );
}
// Pistolero Death
$script 348
{
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Shotgunner1 );
	World.TriggerActorsByTID( instigator, TID_River_Fight2_Shotgunner2 );
}

// Commander Death
$script 349
{
	for ( int i=TID_River_Fight3_Start; i<TID_River_Fight3_End; ++i )
		World.TriggerActorsByTID( instigator, i );
}
