<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.trainzsimulator.com/index.php?action=history&amp;feed=atom&amp;title=CCG%2FKind%3A_Interior_Steam_Cab_Script</id>
	<title>CCG/Kind: Interior Steam Cab Script - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.trainzsimulator.com/index.php?action=history&amp;feed=atom&amp;title=CCG%2FKind%3A_Interior_Steam_Cab_Script"/>
	<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=CCG/Kind:_Interior_Steam_Cab_Script&amp;action=history"/>
	<updated>2026-11-05T16:23:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=CCG/Kind:_Interior_Steam_Cab_Script&amp;diff=2078&amp;oldid=prev</id>
		<title>Pev: New page: ==STEAM CAB SCRIPT==   &#039;&#039;&#039;PB15Cabin.gs&#039;&#039;&#039;  This is the PB15 steam interior script file.  This script is responsible for mapping all the steam-specific controls to the physics system, and f...</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=CCG/Kind:_Interior_Steam_Cab_Script&amp;diff=2078&amp;oldid=prev"/>
		<updated>2011-06-03T23:53:37Z</updated>

		<summary type="html">&lt;p&gt;New page: ==STEAM CAB SCRIPT==   &amp;#039;&amp;#039;&amp;#039;PB15Cabin.gs&amp;#039;&amp;#039;&amp;#039;  This is the PB15 steam interior script file.  This script is responsible for mapping all the steam-specific controls to the physics system, and f...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==STEAM CAB SCRIPT==&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PB15Cabin.gs&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
This is the PB15 steam interior script file.&lt;br /&gt;
&lt;br /&gt;
This script is responsible for mapping all the steam-specific controls to the physics system, and for handling PB-15 specific functions such as the coal shovelling dude.&lt;br /&gt;
&lt;br /&gt;
 include &amp;quot;train.gs&amp;quot;&lt;br /&gt;
 include &amp;quot;locomotive.gs&amp;quot;&lt;br /&gt;
 include &amp;quot;cabin.gs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 class PB15CabinData isclass CabinData&lt;br /&gt;
 {&lt;br /&gt;
   public float fire_plates_val;&lt;br /&gt;
   public float left_window_val; &lt;br /&gt;
   public float right_window_val;&lt;br /&gt;
   public float left_sliding_window_val;&lt;br /&gt;
   public float right_sliding_window_val;&lt;br /&gt;
   public float seat0_val;&lt;br /&gt;
   public float seat1_val;&lt;br /&gt;
   public float sanding_lever_val;&lt;br /&gt;
   public float whistle_lever_val;&lt;br /&gt;
   public float regulator_lever_val;&lt;br /&gt;
   public float blowdown_lever_val;&lt;br /&gt;
   public bool fireboxDoorOpen;&lt;br /&gt;
 };&lt;br /&gt;
   &lt;br /&gt;
 class PB15Cabin isclass Cabin&lt;br /&gt;
 {&lt;br /&gt;
   Locomotive loco;&lt;br /&gt;
   &lt;br /&gt;
     CabinControl speedometer;&lt;br /&gt;
     CabinControl main_reservoir_needle;&lt;br /&gt;
     CabinControl brake_cylinder0_needle;&lt;br /&gt;
     CabinControl brake_cylinder1_needle;&lt;br /&gt;
     CabinControl no3_pipe_needle;&lt;br /&gt;
     CabinControl brake_pipe_needle;&lt;br /&gt;
     CabinControl equaliser_needle;&lt;br /&gt;
     CabinControl flow_needle;&lt;br /&gt;
     CabinControl ampmeter_needle0;&lt;br /&gt;
     CabinControl ampmeter_needle1;&lt;br /&gt;
     //CabinControl throttle_lever;&lt;br /&gt;
     CabinControl reverser_lever;&lt;br /&gt;
     CabinControl train_brake_lever;&lt;br /&gt;
     CabinControl train_lapbrake_lever;&lt;br /&gt;
     CabinControl loco_brake_lever;&lt;br /&gt;
     CabinControl dynamic_brake_lever;&lt;br /&gt;
     CabinControl wheelslip_light;&lt;br /&gt;
     CabinControl horn_rope;&lt;br /&gt;
     CabinControl pantograph_lever;&lt;br /&gt;
     CabinControl light_switch;&lt;br /&gt;
   &lt;br /&gt;
     CabinControl     waterGlassLeft_dial, waterGlassRight_dial;&lt;br /&gt;
     CabinControl     firebox;&lt;br /&gt;
     CabinControl     boiler_needle;&lt;br /&gt;
     CabinControl     regulator_lever;&lt;br /&gt;
     CabinControl     fire_plates;&lt;br /&gt;
     CabinControl     left_window;&lt;br /&gt;
     CabinControl     right_window;&lt;br /&gt;
     CabinControl     left_sliding_window;&lt;br /&gt;
     CabinControl     right_sliding_window;&lt;br /&gt;
     CabinControl     seat0;&lt;br /&gt;
     CabinControl     seat1;&lt;br /&gt;
     CabinControl     sanding_lever;&lt;br /&gt;
     CabinControl     whistle_lever;&lt;br /&gt;
     CabinControl     blowdown_lever;&lt;br /&gt;
   &lt;br /&gt;
     CabinControl waterInjector0, waterInjector1;&lt;br /&gt;
   &lt;br /&gt;
     PB15CabinData cabinData;&lt;br /&gt;
   &lt;br /&gt;
    bool shovellingCoal;&lt;br /&gt;
    bool waving;&lt;br /&gt;
   &lt;br /&gt;
    thread void RunAnimation(void);&lt;br /&gt;
   &lt;br /&gt;
    public void Init(void)&lt;br /&gt;
    {&lt;br /&gt;
      speedometer =         GetNamedControl(&amp;quot;speedo_needle&amp;quot;);&lt;br /&gt;
      main_reservoir_needle =     GetNamedControl(&amp;quot;bplocomain_needlev);&lt;br /&gt;
      brake_cylinder0_needle = GetNamedControl(vbptrainbrakecylinder_needle&amp;quot;);&lt;br /&gt;
      brake_cylinder1_needle = GetNamedControl(&amp;quot;no3pipe_needle&amp;quot;);&lt;br /&gt;
      no3_pipe_needle =       GetNamedControl(&amp;quot;bptrainbrakecylinder2_needle&amp;quot;);&lt;br /&gt;
      brake_pipe_needle =       GetNamedControl(&amp;quot;bptrainbrakepipe_needle&amp;quot;);&lt;br /&gt;
      equaliser_needle =       GetNamedControl(vbploco_equaliser&amp;quot;);&lt;br /&gt;
      flow_needle =        GetNamedControl(&amp;quot;flow_needle&amp;quot;);&lt;br /&gt;
      ampmeter_needle0 =       GetNamedControl(&amp;quot;ampmeter_needle&amp;quot;);&lt;br /&gt;
      ampmeter_needle1 =       GetNamedControl(vampmeter2_needle&amp;quot;);&lt;br /&gt;
      //throttle_lever =       GetNamedControl(vthrottle_lever&amp;quot;);&lt;br /&gt;
      train_brake_lever =       GetNamedControl(&amp;quot;trainbrake_lever&amp;quot;);&lt;br /&gt;
      train_lapbrake_lever =     GetNamedControl(&amp;quot;trainbrakelap_lever&amp;quot;);&lt;br /&gt;
      loco_brake_lever =       GetNamedControl(vindependantbrake_lever&amp;quot;);&lt;br /&gt;
      dynamic_brake_lever =     GetNamedControl(&amp;quot;dynamicbrake_lever&amp;quot;);&lt;br /&gt;
      wheelslip_light =       GetNamedControl(&amp;quot;wheelslip_light&amp;quot;);&lt;br /&gt;
      horn_rope =           GetNamedControl(&amp;quot;horn&amp;quot;);&lt;br /&gt;
      light_switch =         GetNamedControl(&amp;quot;light_switch&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        waterGlassLeft_dial = GetNamedControl(&amp;quot;waterglass_left&amp;quot;);&lt;br /&gt;
        waterGlassRight_dial = GetNamedControl(&amp;quot;waterglass_right&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        firebox = GetNamedControl(&amp;quot;firebox&amp;quot;);&lt;br /&gt;
        boiler_needle = GetNamedControl(&amp;quot;boiler_needle&amp;quot;);&lt;br /&gt;
        regulator_lever = GetNamedControl(&amp;quot;regulator&amp;quot;);&lt;br /&gt;
        reverser_lever = GetNamedControl(&amp;quot;reverser&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        waterInjector0 = GetNamedControl(vwater_injector_0&amp;quot;);&lt;br /&gt;
        waterInjector1 = GetNamedControl(&amp;quot;water_injector_1&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        fire_plates = GetNamedControl(&amp;quot;fire_plates&amp;quot;);&lt;br /&gt;
        left_window = GetNamedControl(&amp;quot;left_window&amp;quot;);&lt;br /&gt;
        right_window = GetNamedControl(&amp;quot;right_window&amp;quot;);&lt;br /&gt;
        left_sliding_window = GetNamedControl(&amp;quot;left_sliding_window&amp;quot;);&lt;br /&gt;
        right_sliding_window = GetNamedControl(&amp;quot;right_sliding_window&amp;quot;);&lt;br /&gt;
        seat0 = GetNamedControl(&amp;quot;seat0&amp;quot;);&lt;br /&gt;
        seat1 = GetNamedControl(&amp;quot;seat1&amp;quot;);&lt;br /&gt;
        sanding_lever = GetNamedControl(&amp;quot;sanding_lever&amp;quot;);&lt;br /&gt;
        whistle_lever = GetNamedControl(&amp;quot;whistle_lever&amp;quot;);&lt;br /&gt;
        blowdown_lever = GetNamedControl(&amp;quot;blowdown_lever&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        RunAnimation();&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    //! Attach this cabin to a game object (i.e. a locomotive).&lt;br /&gt;
    // Param: obj Game object to attach this cabin to (usually a Locomotive).&lt;br /&gt;
    public void Attach(GameObject obj)&lt;br /&gt;
    {&lt;br /&gt;
      loco = cast&amp;lt;Locomotive&amp;gt;(obj);&lt;br /&gt;
   &lt;br /&gt;
        // get cabin data&lt;br /&gt;
        CabinData cd = loco.GetCabinData();&lt;br /&gt;
        if(cd)&lt;br /&gt;
        {&lt;br /&gt;
          // reset the controls from saved values&lt;br /&gt;
          PB15CabinData pbcd = cast&amp;lt;PB15CabinData&amp;gt;cd;&lt;br /&gt;
          if(fire_plates)&lt;br /&gt;
          fire_plates.SetValue(pbcd.fire_plates_val);&lt;br /&gt;
          if(left_window)&lt;br /&gt;
          left_window.SetValue(pbcd.left_window_val);&lt;br /&gt;
          if(right_window)&lt;br /&gt;
          right_window.SetValue(pbcd.right_window_val);&lt;br /&gt;
          if(left_sliding_window)&lt;br /&gt;
          left_sliding_window.SetValue(pbcd.left_sliding_window_val);&lt;br /&gt;
          if(right_sliding_window)&lt;br /&gt;
          right_sliding_window.SetValue(pbcd.right_sliding_window_val);&lt;br /&gt;
          if(seat0)&lt;br /&gt;
          seat0.SetValue(pbcd.seat0_val);&lt;br /&gt;
          if(seat1)&lt;br /&gt;
          seat1.SetValue(pbcd.seat1_val);&lt;br /&gt;
          if(sanding_lever)&lt;br /&gt;
          sanding_lever.SetValue(pbcd.sanding_lever_val);&lt;br /&gt;
          if(whistle_lever)&lt;br /&gt;
          whistle_lever.SetValue(pbcd.whistle_lever_val);&lt;br /&gt;
          if(regulator_lever)&lt;br /&gt;
          regulator_lever.SetValue(pbcd.regulator_lever_val);&lt;br /&gt;
          if(blowdown_lever)&lt;br /&gt;
          blowdown_lever.SetValue(pbcd.blowdown_lever_val);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          PB15CabinData pbd = new PB15CabinData();&lt;br /&gt;
          loco.SetCabinData(pbd);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    // the default locomotive config uses kPa to describe pressure dial ranges&lt;br /&gt;
    // this function converts from g/m^3 into kPa-above-atmospheric&lt;br /&gt;
    public float GetPressureParam(string param)&lt;br /&gt;
    {&lt;br /&gt;
      float pressureMultiplier = 1.0 / (0.145 * 0.0000703);&lt;br /&gt;
      float pressureBase = 14.7 * 0.0000703;&lt;br /&gt;
   &lt;br /&gt;
        return pressureMultiplier * (loco.GetEngineParam(param) - pressureBase);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public void Update(void)&lt;br /&gt;
    {&lt;br /&gt;
      float value;&lt;br /&gt;
      Train train = loco.GetMyTrain();&lt;br /&gt;
   &lt;br /&gt;
        // Update Needles&lt;br /&gt;
   &lt;br /&gt;
        if (speedometer)&lt;br /&gt;
        speedometer.SetValue(train.GetVelocity());&lt;br /&gt;
   &lt;br /&gt;
        if (main_reservoir_needle)&lt;br /&gt;
        main_reservoir_needle.SetValue(GetPressureParam(&amp;quot;main-reservoir-pressure&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
        value = GetPressureParam(&amp;quot;brake-cylinder-pressurev);&lt;br /&gt;
        if (brake_cylinder0_needle)&lt;br /&gt;
        brake_cylinder0_needle.SetValue(value);&lt;br /&gt;
        if (brake_cylinder1_needle)&lt;br /&gt;
        brake_cylinder1_needle.SetValue(value);&lt;br /&gt;
   &lt;br /&gt;
        if (no3_pipe_needle)&lt;br /&gt;
        no3_pipe_needle.SetValue(GetPressureParam(&amp;quot;no3-pipe-pressure&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
        if (brake_pipe_needle)&lt;br /&gt;
        brake_pipe_needle.SetValue(GetPressureParam(&amp;quot;brake-pipe-pressure&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
        if (equaliser_needle)&lt;br /&gt;
        equaliser_needle.SetValue(GetPressureParam(&amp;quot;equaliser-pressure&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
        if (flow_needle)&lt;br /&gt;
        flow_needle.SetValue(GetPressureParam(&amp;quot;flow&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
        value = loco.GetEngineParam(&amp;quot;current-drawn&amp;quot;);&lt;br /&gt;
        if (ampmeter_needle0)&lt;br /&gt;
        ampmeter_needle0.SetValue(value);&lt;br /&gt;
        if (ampmeter_needle1)&lt;br /&gt;
        ampmeter_needle1.SetValue(value);&lt;br /&gt;
        //&lt;br /&gt;
   &lt;br /&gt;
      // Update Levers&lt;br /&gt;
      // This is done in case the game logic has changed any of the settings from what&lt;br /&gt;
      // the user selected.&lt;br /&gt;
      //if (throttle_lever)&lt;br /&gt;
      // throttle_lever.SetValue(loco.GetEngineSetting(&amp;quot;throttle&amp;quot;));// * 8.0);&lt;br /&gt;
   &lt;br /&gt;
      if (reverser_lever)&lt;br /&gt;
      reverser_lever.SetValue(loco.GetEngineSetting(&amp;quot;reverser&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (train_brake_lever)&lt;br /&gt;
      train_brake_lever.SetValue(loco.GetEngineSetting(&amp;quot;train-auto-brake&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (train_lapbrake_lever)&lt;br /&gt;
      train_lapbrake_lever.SetValue(loco.GetEngineSetting(&amp;quot;train-lap-brake&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (loco_brake_lever)&lt;br /&gt;
      loco_brake_lever.SetValue(loco.GetEngineSetting(&amp;quot;loco-auto-brake&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (dynamic_brake_lever)&lt;br /&gt;
      dynamic_brake_lever.SetValue(loco.GetEngineSetting(&amp;quot;dynamic-brake&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (wheelslip_light)&lt;br /&gt;
      wheelslip_light.SetValue(loco.GetEngineParam(&amp;quot;wheelslip&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (horn_rope)&lt;br /&gt;
      horn_rope.SetValue(loco.GetEngineParam(&amp;quot;horn&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (pantograph_lever)&lt;br /&gt;
      pantograph_lever.SetValue(loco.GetEngineSetting(&amp;quot;pantograph&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (light_switch)&lt;br /&gt;
      light_switch.SetValue(loco.GetEngineSetting(&amp;quot;headlight&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (waterGlassLeft_dial)&lt;br /&gt;
      waterGlassLeft_dial.SetValue(loco.GetEngineParam(&amp;quot;steam-boiler-liquid-percent&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      if (waterGlassRight_dial)&lt;br /&gt;
      waterGlassRight_dial.SetValue(loco.GetEngineParam(&amp;quot;steam-boiler-liquid-percent&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
      // update cabin data&lt;br /&gt;
      PB15CabinData cd = cast&amp;lt;PB15CabinData&amp;gt;loco.GetCabinData();&lt;br /&gt;
      if(left_window)&lt;br /&gt;
      cd.left_window_val = left_window.GetValue();&lt;br /&gt;
      if(right_window)&lt;br /&gt;
      cd.right_window_val = right_window.GetValue();&lt;br /&gt;
      if(left_sliding_window)&lt;br /&gt;
      cd.left_sliding_window_val = left_sliding_window.GetValue();&lt;br /&gt;
      if(right_sliding_window)&lt;br /&gt;
      cd.right_sliding_window_val = right_sliding_window.GetValue();&lt;br /&gt;
      if(seat0)&lt;br /&gt;
      cd.seat0_val = seat0.GetValue();&lt;br /&gt;
      if(seat1)&lt;br /&gt;
      cd.seat1_val = seat1.GetValue();&lt;br /&gt;
      if(sanding_lever)&lt;br /&gt;
      cd.sanding_lever_val = sanding_lever.GetValue();&lt;br /&gt;
      if(whistle_lever)&lt;br /&gt;
      cd.whistle_lever_val = whistle_lever.GetValue();&lt;br /&gt;
      if(regulator_lever)&lt;br /&gt;
      cd.regulator_lever_val = regulator_lever.GetValue();&lt;br /&gt;
      if(fire_plates)&lt;br /&gt;
      cd.fire_plates_val = fire_plates.GetValue();&lt;br /&gt;
      if(blowdown_lever)&lt;br /&gt;
      cd.blowdown_lever_val = blowdown_lever.GetValue();&lt;br /&gt;
      cd.fireboxDoorOpen = fire_plates.GetValue() &amp;gt; 0.9;&lt;br /&gt;
   &lt;br /&gt;
      if (firebox)&lt;br /&gt;
      {&lt;br /&gt;
        firebox.SetNamedValue(&amp;quot;amount-burning-coal&amp;quot;, 0.5);&lt;br /&gt;
        if(fire_plates)&lt;br /&gt;
        {&lt;br /&gt;
           firebox.SetNamedValue(“door-open”,fire_plates.GetValue() ); &lt;br /&gt;
   &lt;br /&gt;
            }&lt;br /&gt;
            firebox.SetNamedValue(&amp;quot;fire-life&amp;quot;, loco.GetEngineParam(&amp;quot;fire-temperature&amp;quot;) / 1600.0);&lt;br /&gt;
            firebox.SetNamedValue(&amp;quot;steam-piston-cycle&amp;quot;, loco.GetEngineParam(&amp;quot;steam-piston-cycle&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
   &lt;br /&gt;
        if (boiler_needle)&lt;br /&gt;
        {&lt;br /&gt;
          boiler_needle.SetValue(GetPressureParam(&amp;quot;steam-boiler-pressure&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
   &lt;br /&gt;
        if (waterInjector0)&lt;br /&gt;
        waterInjector0.SetValue(loco.GetEngineSetting(&amp;quot;injector&amp;quot;));&lt;br /&gt;
   &lt;br /&gt;
        if (waterInjector1)&lt;br /&gt;
        waterInjector1.SetValue(loco.GetEngineSetting(&amp;quot;injector&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    void UserSetControl(CabinControl p_control, float p_value)&lt;br /&gt;
    {&lt;br /&gt;
      Interface.Log(&amp;quot;control: &amp;quot; + p_control.GetName() + &amp;quot; value: &amp;quot; + p_value);&lt;br /&gt;
   &lt;br /&gt;
        if (p_control == reverser_lever)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;reverser&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        // else if (p_control == throttle_lever)&lt;br /&gt;
        // loco.SetEngineSetting(&amp;quot;throttle&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == train_brake_lever)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;train-auto-brake&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == train_lapbrake_lever)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;train-lap-brake&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == loco_brake_lever)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;loco-auto-brake&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == dynamic_brake_lever)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;dynamic-brake&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == horn_rope)&lt;br /&gt;
        ; // todo&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == pantograph_lever)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;pantograph&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == light_switch)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;headlight&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == regulator_lever)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;regulator&amp;quot;, p_value);&lt;br /&gt;
   &lt;br /&gt;
        else if (p_control == waterInjector0 or p_control == waterInjector1)&lt;br /&gt;
        loco.SetEngineSetting(&amp;quot;injectorv, p_value);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    void UserPressKey(string s)&lt;br /&gt;
    {&lt;br /&gt;
      if(s == &amp;quot;shovel-coal&amp;quot;)&lt;br /&gt;
      {&lt;br /&gt;
        PB15CabinData cd = cast&amp;lt;PB15CabinData&amp;gt;loco.GetCabinData();&lt;br /&gt;
        // if(cd.fireboxDoorOpen)&lt;br /&gt;
        {&lt;br /&gt;
          if(FireAddCoal())&lt;br /&gt;
          {&lt;br /&gt;
            if(!shovellingCoal)&lt;br /&gt;
            {&lt;br /&gt;
              if(!waving)&lt;br /&gt;
              {&lt;br /&gt;
                if(fire_plates)&lt;br /&gt;
                            fire_plates.SetValue(1.0f);&lt;br /&gt;
                            shovellingCoal = true;&lt;br /&gt;
                            SetFXAnimationState(&amp;quot;idle1&amp;quot;, false);&lt;br /&gt;
                            SetFXAnimationState(&amp;quot;idle2&amp;quot;, false);&lt;br /&gt;
                            SetFXAnimationState(&amp;quot;loop2shovel&amp;quot;, false);&lt;br /&gt;
                            SetFXAnimationState(vloop2shovel&amp;quot;, true);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if(s == &amp;quot;wave&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
          if(!shovellingCoal)&lt;br /&gt;
          {&lt;br /&gt;
            if(!waving)&lt;br /&gt;
            {&lt;br /&gt;
              waving = true;&lt;br /&gt;
              SetFXAnimationState(&amp;quot;wave&amp;quot;, false);&lt;br /&gt;
              SetFXAnimationState(&amp;quot;wave&amp;quot;, true);&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    thread void RunAnimation(void)&lt;br /&gt;
    {&lt;br /&gt;
      SetFXAnimationState(&amp;quot;idle1&amp;quot;, true);&lt;br /&gt;
   &lt;br /&gt;
        wait()&lt;br /&gt;
        {&lt;br /&gt;
          on &amp;quot;Animation-Event&amp;quot;, &amp;quot;Coalman_loop1_end&amp;quot;:&lt;br /&gt;
          SetFXAnimationState(&amp;quot;idle1&amp;quot;, false);&lt;br /&gt;
          SetFXAnimationState(&amp;quot;idle2&amp;quot;, true);&lt;br /&gt;
          continue;&lt;br /&gt;
   &lt;br /&gt;
            on &amp;quot;Animation-Event&amp;quot;, &amp;quot;Coalman_loop2_end&amp;quot;:&lt;br /&gt;
            SetFXAnimationState(&amp;quot;idle2&amp;quot;, false);&lt;br /&gt;
            SetFXAnimationState(&amp;quot;idle1&amp;quot;, true);&lt;br /&gt;
            continue;&lt;br /&gt;
   &lt;br /&gt;
            on &amp;quot;Animation-Event&amp;quot;, &amp;quot;Coalman_loop2shovel_end&amp;quot;:&lt;br /&gt;
            SetFXAnimationState(&amp;quot;loop2shovel&amp;quot;, false);&lt;br /&gt;
            SetFXAnimationState(&amp;quot;shovel&amp;quot;, true);&lt;br /&gt;
            continue;&lt;br /&gt;
   &lt;br /&gt;
            on &amp;quot;Animation-Event&amp;quot;, &amp;quot;Coalman_shovel_end&amp;quot;:&lt;br /&gt;
            SetFXAnimationState(&amp;quot;shovel&amp;quot;, false);&lt;br /&gt;
            SetFXAnimationState(&amp;quot;wipebrow&amp;quot;, true);&lt;br /&gt;
            continue;&lt;br /&gt;
   &lt;br /&gt;
            on &amp;quot;Animation-Event&amp;quot;, &amp;quot;Coalman_wipebrow_end&amp;quot;:&lt;br /&gt;
            SetFXAnimationState(&amp;quot;wipebrow&amp;quot;, false);&lt;br /&gt;
            SetFXAnimationState(&amp;quot;shovel2loop&amp;quot;, true);&lt;br /&gt;
            continue;&lt;br /&gt;
   &lt;br /&gt;
            on &amp;quot;Animation-Event&amp;quot;, &amp;quot;Coalman_shovel2loop_end&amp;quot;:&lt;br /&gt;
            SetFXAnimationState(&amp;quot;shovel2loop&amp;quot;, false);&lt;br /&gt;
            SetFXAnimationState(&amp;quot;idle1&amp;quot;, true);&lt;br /&gt;
            shovellingCoal = false;&lt;br /&gt;
            continue;&lt;br /&gt;
   &lt;br /&gt;
            on &amp;quot;Animation-Event&amp;quot;, &amp;quot;Coalman_wave_end&amp;quot;:&lt;br /&gt;
            SetFXAnimationState(&amp;quot;wave&amp;quot;, false);&lt;br /&gt;
            SetFXAnimationState(&amp;quot;idle1&amp;quot;, true);&lt;br /&gt;
            waving = false;&lt;br /&gt;
            continue;&lt;br /&gt;
   &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[CCG/Kind:_Interior Steam Cab|Steam Cab Config.txt]]&lt;br /&gt;
&lt;br /&gt;
[[CCG/Kind:_Interior#DD40_Cab_Interior|Diesel Cab]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Return to CCG Index==&lt;br /&gt;
[[Content Creator&amp;#039;s Guide]]&lt;/div&gt;</summary>
		<author><name>Pev</name></author>
	</entry>
</feed>