'######################
' Script 6-Gang-Schaltgetriebe für Omnibusse

'######################

'Revision History

'Rüdiger Hülsmann	16.02.2011	Schalthebelbewegung und Synchronisation
'Marcel Kuhnt		10.06.2012	Neutralgang ist auch wirklich neutral
'Marcel Kuhnt		19.06.2012	Schalthebelgeschwindigkeit in Konstante, Kupplungspedal-Soundevents, Schalthebel-Sounds
'Marcel Kuhnt		30.06.2012	Rückgebaut auf 4 Gänge, Warnleuchte Kupplungskraftverstärker
'Marcel Kuhnt		26.01.2013	Kupplungs-Punkt korrigiert und variabel gemacht
'Marcel Kuhnt		22.03.2013	+/- Schaltbefehle


'######################
'	Macro- und Triggerteil
'######################


'######################
'	Antrieb
'######################

'----------------------
'	Trigger
'----------------------


{trigger:kw_s_plus}
		(L.L.antrieb_getr_gang) s0 6 <
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		l0 1 + (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
	{endif}
{end}

{trigger:kw_s_minus}
		(L.L.antrieb_getr_gang) s0 -1 >
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		l0 1 - (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
	{endif}
{end}


{trigger:kw_s_1_fest}
{trigger:kw_s_1}
		(L.L.antrieb_getr_gang) s0 1 = !
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		1 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}

{trigger:kw_s_2_fest}
{trigger:kw_s_2}
	(L.L.antrieb_getr_gang) s0 2 = !
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		2 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}

{trigger:kw_s_3_fest}
{trigger:kw_s_3}
	(L.L.antrieb_getr_gang) s0 3 = !
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		3 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}

{trigger:kw_s_4_fest}
{trigger:kw_s_4}
	(L.L.antrieb_getr_gang) s0 4 = !
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		4 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}

{trigger:kw_s_5_fest}
{trigger:kw_s_5}
	(L.L.antrieb_getr_gang) s0 5 = !
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		5 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}

{trigger:kw_s_6_fest}
{trigger:kw_s_6}
	(L.L.antrieb_getr_gang) s0 6 = !
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		6 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}

{trigger:kw_s_R_fest}
{trigger:kw_s_R}
	(L.L.antrieb_getr_gang) s0 -1 = !
	{if}
		l0 0 = !
		{if}
			(T.L.ev_schalthebel_0)
		{endif}
		-1 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}

{trigger:kw_s_1_fest_off}
{trigger:kw_s_2_fest_off}
{trigger:kw_s_3_fest_off}
{trigger:kw_s_4_fest_off}
{trigger:kw_s_5_fest_off}
{trigger:kw_s_6_fest_off}
{trigger:kw_s_R_fest_off}
{trigger:kw_s_N}
	(L.L.antrieb_getr_gang) 0 = !
	{if}
		(T.L.ev_schalthebel_0)
		0 (S.L.antrieb_getr_gang)
		0 (S.L.antrieb_shifter_posy_target)
'		0 (S.L.antrieb_shifter_posx_target)
	{endif}
{end}
{end}
{end}
{end}
{end}
{end}


'----------------------
'	Init
'----------------------

{macro:antrieb_init}
	0 (S.L.antrieb_getr_gang)
'Variation von 0.4 bis 0.8
	40 random 100 / 0.4 + (S.L.antrieb_Clutch_Variation)
{end}

'----------------------
'	Frame
'----------------------

{macro:antrieb_frame}


'Setzen der aktuellen Übersetzung, aber nur, wenn Gang korrekt eingelegt:

'Die Drehzahl, auf die das Getriebe die Kupplungsdrehzahl bremsen oder beschleunigen muss, prüfen. Hierdurch können synchro-Getriebe simuliert werden.
(L.L.n_Wheel) (C.L.antrieb_i_achse) * (L.L.antrieb_getr_gang) (F.L.antrieb_getr_ratio) * (L.L.antrieb_kupp_n) - abs s2

(L.L.antrieb_shifter_posy_target) 0 = !
{if}
	l2 3000 <
	(L.L.Clutch) (L.L.antrieb_Clutch_Variation) / 0.8 >
	(L.L.engine_n) abs 20 < || &&
	{if}	
		(L.L.antrieb_shifter_posy) 0.3 >
		(L.L.antrieb_shifter_posy) -0.3 < ||
		{if}
			(L.L.antrieb_getr_ratio_act) s3 (L.L.antrieb_getr_gang) (F.L.antrieb_getr_ratio) (S.L.antrieb_getr_ratio_act) l3 = !
			{if}
				(T.L.ev_schalthebel_1)
			{endif}
		{endif}
	{else}
		(L.L.antrieb_shifter_posy) 0.3 <
		(L.L.antrieb_shifter_posy) -0.3 > &&
		{if}
			(L.L.engine_n) 300 >
			{if}
				(T.L.ev_schalthebel_fail)
			{endif}
			(T.L.ev_ratsch)
			0 (S.L.antrieb_shifter_posy_target) (S.L.antrieb_getr_gang) (S.L.antrieb_getr_ratio_act)
		{endif}
	{endif}
{else}
	0 (S.L.antrieb_getr_ratio_act)
{endif}



'Bewegen des Schalthebels

'Erst Gang rausnehmen, bevor Schaltgasse gewechselt werden kann:
(L.L.antrieb_shifter_posy) 0 =
{if}
	(L.L.antrieb_getr_gang) (F.L.antrieb_shifter_posx) (S.L.antrieb_shifter_posx_target)
{endif}

'Gang erst einlegbar, wenn zugehörige Schaltgasse erreicht:
(L.L.antrieb_shifter_posx) (L.L.antrieb_shifter_posx_target) =
(L.L.antrieb_shifter_posy) 0 = &&
{if}
	(L.L.antrieb_getr_gang) (F.L.antrieb_shifter_posy) (S.L.antrieb_shifter_posy_target)
{endif}


(L.L.antrieb_shifter_posy) (L.L.antrieb_shifter_posy_target) <
{if}
	(L.L.antrieb_shifter_posy) (L.S.Timegap) (C.L.antrieb_shifter_spdy) * + (S.L.antrieb_shifter_posy)
	(L.L.antrieb_shifter_posy_target) s0 >
	{if}
		l0 (S.L.antrieb_shifter_posy)
	{endif}
{endif}
(L.L.antrieb_shifter_posy) (L.L.antrieb_shifter_posy_target) >
{if}
	(L.L.antrieb_shifter_posy) (L.S.Timegap) (C.L.antrieb_shifter_spdy) * - (S.L.antrieb_shifter_posy)
	(L.L.antrieb_shifter_posy_target) s1 < 
	{if}
		l1 (S.L.antrieb_shifter_posy)
	{endif}
{endif}


(L.L.antrieb_shifter_posx) (L.L.antrieb_shifter_posx_target) <
{if}
	(L.L.antrieb_shifter_posx) (L.S.Timegap) (C.L.antrieb_shifter_spdx) * + (S.L.antrieb_shifter_posx)
	(L.L.antrieb_shifter_posx_target) s0 >
	{if}
		l0 (S.L.antrieb_shifter_posx)
		0 =
		{if}
			(T.L.ev_schalthebel_gasse_0)
		{else}
			l0 -2 =
			{if}
				(T.L.ev_schalthebel_gasse_R)
			{else}
				(T.L.ev_schalthebel_gasse_1)
			{endif}
		{endif}
	{endif}
{endif}
(L.L.antrieb_shifter_posx) (L.L.antrieb_shifter_posx_target) >
{if}
	(L.L.antrieb_shifter_posx) (L.S.Timegap) (C.L.antrieb_shifter_spdx) * - (S.L.antrieb_shifter_posx)
	(L.L.antrieb_shifter_posx_target) s1 < 
	{if}
		l1 (S.L.antrieb_shifter_posx)
		0 =
		{if}
			(T.L.ev_schalthebel_gasse_0)
		{else}
			l1 -2 =
			{if}
				(T.L.ev_schalthebel_gasse_R)
			{else}
				(T.L.ev_schalthebel_gasse_1)
			{endif}
		{endif}
	{endif}
{endif}





'Berechnung der Kupplungsdrehzahl:

	(L.L.antrieb_getr_ratio_act) 0 = !
	{if}
		(L.L.n_Wheel) (C.L.antrieb_i_achse) * (L.L.antrieb_getr_ratio_act) * (S.L.antrieb_kupp_n)
	{endif}

'Berechnung des Motormomentes:

	(M.L.engine_moment)


'Berechnung der Differenz zwischen Motordrehzahl und Kupplungsdrehzahl:

	(L.L.antrieb_kupp_n) (L.L.engine_n) - (S.L.antrieb_kupp_n_delta) abs 50 >
'	{if}
'		1 (S.L.antrieb_kupp_schleif)
'	{endif}



'Berechnen der aktuellen Kupplungsmomente:
	
'Variation der Kupplung nur, wenn man selbst und ohne Auto-Kupplung fährt (sonst müsste die ja darauf noch justiert werden):

	(L.L.AI) (L.S.AutoClutch) ||
	{if}
		(L.L.Clutch) (F.L.antrieb_kupplung) s0
	{else}
		(L.L.Clutch) (L.L.antrieb_Clutch_Variation) / (F.L.antrieb_kupplung) s0
	{endif}

	(C.L.antrieb_kupp_Mmax_haft) * (S.L.antrieb_kupp_M_haft)
	l0 (C.L.antrieb_kupp_Mmax_gleit) * (S.L.antrieb_kupp_M_gleit)


'Wenn kein Gang eingelegt ist...
	(L.L.antrieb_getr_ratio_act) 0 = 
	{if}
		0 (S.L.antrieb_kupp_M_haft) (S.L.antrieb_kupp_M_gleit)
		1 (S.L.antrieb_kupp_schleif)

		l0 2000 * 600 + (L.S.timegap) * s5
		l0 -2000 * 600 + (L.S.timegap) * s6
		(L.L.antrieb_kupp_n) (L.L.antrieb_kupp_n_delta) l5 min l6 max - 0 max (S.L.antrieb_kupp_n)
	{endif}


'Wenn die Kupplung nicht schleift...

	(L.L.antrieb_kupp_schleif) 0 =
	{if}
		(L.L.antrieb_getr_M_an) (S.L.antrieb_getr_M_last)
		
		(L.L.antrieb_kupp_n) (S.L.engine_n)
		(L.L.engine_M) (S.L.antrieb_getr_M_an)

		(L.L.engine_M) abs (L.L.antrieb_kupp_M_haft) >
		{if}
			1 (S.L.antrieb_kupp_schleif)
		{endif}
		(L.L.engine_n) (S.L.engine_last_n) 
	{else}


		
'Sonst...

		(L.L.antrieb_kupp_n_delta) s0
		0 >
'Wenn Motor durch Kupplung beschleunigt wird...
		{if}
'Berechnen des Motor-Beschleunigungsmomentes:

			(L.L.antrieb_kupp_M_gleit) /-/ (S.L.antrieb_getr_M_an)
		{else}
			(L.L.antrieb_kupp_M_gleit) (S.L.antrieb_getr_M_an)
		{endif}



'Nun wird der Motor beschleunigt...

		(M.L.engine_acceleration)


'Prüfen, ob sich das Vorzeichen der Drehzahldifferenz umkehrt:


		(L.L.antrieb_kupp_n) (L.L.engine_n) - (L.L.antrieb_kupp_n_delta) * 0 <

		(L.L.engine_M) abs (L.L.antrieb_kupp_M_haft) > ! &&

		{if}
			0 (S.L.antrieb_kupp_schleif)
			(L.L.antrieb_kupp_n) (S.L.engine_n)
		{endif}


	{endif}
		
		
	
(L.L.antrieb_getr_M_an)
(L.L.antrieb_kupp_schleif)

	
'Berechnung des Abtriebmomentes:

	(L.L.antrieb_getr_M_an) (L.L.antrieb_getr_ratio_act) * (C.L.antrieb_i_achse) * (S.L.M_Wheel)

'-----------------------------------------------------------
'Sound-Trigger für das Kupplungspedal:

	(L.L.antrieb_prev_clutch) s0
	(L.L.clutch) s1

	l1 l0 - (L.S.Timegap) / (S.L.antrieb_clutch_spd)

	l0 0.0 <=
	l1 0.0 > &&
	{if}
		(T.L.ev_kupplung_inc_start)
	{endif}

	l0 1.0 <
	l1 1.0 >= &&
	{if}
		(T.L.ev_kupplung_inc_end)
	{endif}

	l0 0.0 >
	l1 0.0 <= &&
	{if}
		(T.L.ev_kupplung_dec_end)
	{endif}

	l1 (S.L.antrieb_prev_clutch)

'---------------------------------------------------------------
' Simulation des Kupplungskraftverstärkers:

	(L.L.Clutch) 0.1 >
	{if}
		(L.L.antrieb_clutch_timer) (L.S.Timegap) + s0
	{else}
		0 s0
	{endif}
	l0 (S.L.antrieb_clutch_timer) (C.L.antrieb_clutch_warning_time) > (L.L.elec_busbar_main) * (S.L.antrieb_clutch_warning)


{end}


