{$CLEO .cs}

//-------------MAIN---------------
thread 'StromSubmarine'
0000: NOP  

0004: $RYDER_TOTAL_PASSED_MISSIONS = 99 

// NOTE Heigh in water depend of the '% submerged' in handling.cfg

:SUBMARINE_11
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @SUBMARINE_11 
if 
   Actor.DrivingVehicleType($PLAYER_ACTOR, #STROMBERG)
else_jump @SUBMARINE_11 
03C0: 5@ = actor $PLAYER_ACTOR car 

//--------------------------------

:SUBMARINE_58
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @SUBMARINE_1170 
if 
   not Car.Wrecked(5@)
else_jump @SUBMARINE_1170 
if 
   Actor.Driving($PLAYER_ACTOR)
else_jump @SUBMARINE_1170 
0407: store_coords_to 11@ 12@ 13@ from_car 5@ with_offset 0.0 0.0 0.0 

// control heigh in water
13@ -= 1.0 
092E: get_water_height_at 11@ 12@ flag 0 store_to 10@ 
if 
  10@ > -150.0 
else_jump @SUBMARINE_58 
if 
0025:   10@ > 13@ // (float) 
else_jump @SUBMARINE_58 

//--- WATER mod ON
0004: $RYDER_TOTAL_PASSED_MISSIONS = 98 
073C: car 5@ damage_component 1
073C: car 5@ damage_component 4
wait 200

//--------------------------------

wait 500 
9@ = Car.Angle(5@)
02F6: 11@ = sine 9@ // (float) 
02F7: 12@ = cosine 9@ // (float) 
11@ *= 0.01 
12@ *= 0.01 
11@ *= -1.0 
07D5: set_car 5@ velocity_in_direction_XYZ 11@ 12@ 0.01 rotation_velocitiesXY 0.0 0.0 unk 0.0 

:SUBMARINE_292
wait 20 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @SUBMARINE_1170 
if 
   Actor.Driving($PLAYER_ACTOR)
else_jump @SUBMARINE_1170 
0407: store_coords_to 11@ 12@ 13@ from_car 5@ with_offset 0.0 0.0 0.0 

// control heigh in water
13@ -= 1.0 
092E: get_water_height_at 11@ 12@ flag 0 store_to 10@ 
if 
  10@ > -100.0 
else_jump @SUBMARINE_restore
if 
0025:   10@ > 13@ // (float) 
else_jump @SUBMARINE_restore
9@ = Car.Angle(5@)

//=== 16 Accelerate
if 
00E1:   player 0 pressed_key 16 
else_jump @SUBMARINE_down 
Car.Angle(5@) = 9@
02F6: 11@ = sine 9@ // (float) 
02F7: 12@ = cosine 9@ // (float) 
11@ *= 0.01 
12@ *= 0.01 
11@ *= -1.0 
07D5: set_car 5@ velocity_in_direction_XYZ 11@ 12@ 0.01 rotation_velocitiesXY 0.0 0.0 unk 0.0 
jump @SUBMARINE_733 

//=== 1 Forward/backward
:SUBMARINE_down
if 
00E1:   player 0 pressed_key 1 
else_jump @SUBMARINE_up
07D5: set_car 5@ velocity_in_direction_XYZ 0.0 0.0 -0.05 rotation_velocitiesXY 0.0 0.0 unk 0.0 
jump @SUBMARINE_733 

//=== 3 Special ctrl up/down
:SUBMARINE_up
if 
00E1:   player 0 pressed_key 3 
else_jump @SUBMARINE_537
07D5: set_car 5@ velocity_in_direction_XYZ 0.0 0.0 0.05 rotation_velocitiesXY 0.0 0.0 unk 0.0
jump @SUBMARINE_733 

//=== 14 Reverse
:SUBMARINE_537
if 
00E1:   player 0 pressed_key 14 
else_jump @SUBMARINE_656 
9@ = Car.Angle(5@)
9@ += 180.0 
02F6: 11@ = sine 9@ // (float) 
02F7: 12@ = cosine 9@ // (float) 
11@ *= 0.01 
12@ *= 0.01 
11@ *= -1.0 
07D5: set_car 5@ velocity_in_direction_XYZ 11@ 12@ 0.01 rotation_velocitiesXY 0.0 0.0 unk 0.0 
jump @SUBMARINE_733 

//=== 

:SUBMARINE_656
02F6: 11@ = sine 9@ // (float) 
02F7: 12@ = cosine 9@ // (float) 
11@ *= 0.001 
12@ *= 0.001 
11@ *= -1.0 
07D5: set_car 5@ velocity_in_direction_XYZ 11@ 12@ 0.007 rotation_velocitiesXY 0.0 0.0 unk 0.0 

//=== 0 Left/Right

:SUBMARINE_733
if 
00E1:   player 0 pressed_key 0 
else_jump @SUBMARINE_848 
0494: get_joystick 0 data_to 0@ 1@ 8@ 3@ 
if 
  0@ == 0 
else_jump @SUBMARINE_791 
jump @SUBMARINE_848 

:SUBMARINE_791
if 
  0@ > 0 
else_jump @SUBMARINE_823 
gosub @SUBMARINE_1143 
jump @SUBMARINE_848 

:SUBMARINE_823
if 
  0 > 0@ 
else_jump @SUBMARINE_848 
gosub @SUBMARINE_1123 

//=== 15 Exit

:SUBMARINE_848
if 
00E1:   player 0 pressed_key 15 
else_jump @SUBMARINE_292 
Car.LockInCurrentPosition(5@) = True
0633: AS_actor $PLAYER_ACTOR exit_car 

:SUBMARINE_877
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @SUBMARINE_1170 
if 
   not Actor.InCar($PLAYER_ACTOR, 5@)
else_jump @SUBMARINE_877 
wait 500 

:SUBMARINE_921
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @SUBMARINE_1170 
if 
   not Car.Wrecked(5@)
else_jump @SUBMARINE_1170 
if and
  $ONMISSION == 0 
82BF:   not car 5@ sunk 
0202:   actor $PLAYER_ACTOR near_car 5@ radius 70.0 70.0 flag 0 
else_jump @SUBMARINE_1163 
if 
   Actor.Driving($PLAYER_ACTOR)
else_jump @SUBMARINE_1049 
if 
   Actor.InCar($PLAYER_ACTOR, 5@)
else_jump @SUBMARINE_1163 
Car.LockInCurrentPosition(5@) = False
jump @SUBMARINE_restore

:SUBMARINE_1049
if and
00E1:   player 0 pressed_key 15 
0202:   actor $PLAYER_ACTOR near_car 5@ radius 7.0 7.0 flag 0 
else_jump @SUBMARINE_921 

:SUBMARINE_1086
wait 0 
80E1:   not player 0 pressed_key 15 
else_jump @SUBMARINE_1086 
036A: put_actor $PLAYER_ACTOR in_car 5@ 
wait 500 
jump @SUBMARINE_921 

//--- WATER mode OFF
:SUBMARINE_restore
0004: $RYDER_TOTAL_PASSED_MISSIONS = 99 
068A: set_car 5@ repair_componentA 1
068A: set_car 5@ repair_componentA 4
wait 200

jump @SUBMARINE_58

//=========================

:SUBMARINE_1123
// degrade speed rotation
9@ += 1.0 
Car.Angle(5@) = 9@
return 

:SUBMARINE_1143
// degrade speed rotation
9@ -= 1.0 
Car.Angle(5@) = 9@
return 

:SUBMARINE_1163
Car.LockInCurrentPosition(5@) = False

:SUBMARINE_1170
Car.RemoveReferences(5@)
jump @SUBMARINE_11 

//=========================

0A93: end_custom_thread