Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // xte10m_locomotive.gs
- // 2(3)TE10M script
- //
- // author: agentmike, agentmike@rambler.ru
- //
- include "x_airdistributor.gs"
- include "defaultlocomotivecabin.gs"
- include "xt10m_systemdata.gs"
- include "xt10m_cabin.gs"
- include "xt10m_coordinate.gs"
- class LocomotiveSystemData
- {
- public float[] RPM = new float[15];
- public float[] G = new float[15];
- public float rpm = 0.0;
- public float g = 0.0;
- public float Td = 0.0,Tw1 = 0.0,Tw2 = 0.0,To = 0.0,Tto = 0.0;
- public float gBase;
- public float gPower;
- public ProductQueue fuelQueue,sandQueue;
- public float fuelConsumed;
- public float sandConsumed;
- public int posSet;
- public int enginePosSet;
- public int tractivePosSet;
- public int tractivePos;
- public int enginePos;
- public float engineStress;
- public bool engineRunning;
- public bool engineServ;
- public bool posChange;
- public int fuelPumpCircuit;//0 - off, 1 - on
- public int oilPumpCircuit;//3 - ready to init 2 - init
- public bool pcSet;
- public int fieldDivertState;
- public bool sideWaterShuttersOpened,sideOilShuttersOpened,topShuttersOpened,fanRunning;
- public bool compressorRunning;
- public float fanRpm;
- public bool braking;
- public bool bpPressureRelay;
- public bool overheat;
- public bool emergencyBraking;
- public bool sanding;
- public bool shuntMode;
- public bool typhoon;
- public bool whistle;
- public float maxTE = 0.0;
- public float sandingTM = 1.0;
- public float wheelslipTM = 1.0;
- public float sandingEfficiency = 1.0;
- };//class LocomotiveSystemData
- class XT10MLocomotive isclass TVRController_Locomotive
- {
- void L(string s){ /*Interface.Log(s);*/ }
- void P(string s){ /*Interface.Print(s);*/ }
- Asset A,SA,SA3_coupled,SA3_decoupled;
- StringTable ST;
- Soup MD;
- Soup wavdb;
- public XT10MSystemData sd;
- LocomotiveSystemData lsd;
- public SectionCoordInfo sci;
- Bogey[] bogeys;
- bool fail;
- //User sound volume coefficients
- float uvk_compressor,uvk_fan,uvk_engine,uvk_brakes,uvk_horn;
- define int SANDPFX_INDEX = 0;
- thread void Main(void);
- thread void Brakes(void);
- thread void Compressor(void);
- thread void PhysicsScheme(void);
- thread void Subsystems(void);
- thread void Fan(void);
- thread void SandExhaust(void);
- thread void Typhoon(void);
- thread void Whistle(void);
- public void Init(Asset p_asset);
- public void Update(void);
- public void SetMyData(void);
- public bool LocoControl(void);
- public bool IsControl(void);
- public bool IsIdle(void);
- void SetShuttersState(string shutters,bool state);
- public void Sanding(void);
- public void Horn(void);
- public XT10MCabinData CD(void);
- public XT10MCabinData CD2(void);
- void InitSystemData(void);
- public float GetPressureParam(string param);
- public float GetPressureParam(float val);
- public float GetPressureParam(Vehicle vh,string param);
- public int GetMyPosition(void);
- void SetCouplerAttach(int pos, bool type);
- void SetCoupler(int pos, bool direction);
- thread void SendMessage(GameObject dst,string major,string minor,float delay);
- final float PlaySoundAndSleep(Asset srcAsset,
- string soundFile,
- float volume,
- float minDistance,
- float maxDistance,
- GameObject srcObject,
- string att)
- {
- World.PlaySound(srcAsset, soundFile, volume, minDistance, maxDistance, srcObject, att);
- float duration = wavdb.GetNamedTagAsFloat(soundFile, 10.0) - 0.05;
- Sleep(duration);
- return duration;
- }
- final float GetSoundDuration(string soundFile)
- {
- return wavdb.GetNamedTagAsFloat(soundFile, 10.0);
- }
- thread void Subsystems(void)
- {
- Message msg;
- int i;
- Soup sp = A.GetConfigSoup().GetNamedSoup("extensions").GetNamedSoup("engine-setup-298469");
- string[] srpm = Str.Tokens(sp.GetNamedTag("rpm"),",");
- string[] sg = Str.Tokens(sp.GetNamedTag("g"),",");
- for(i=0;i<srpm.size();i++)
- {
- lsd.RPM[i] = Str.ToFloat(srpm[i]);
- L("RPM["+i+"] = "+lsd.RPM[i]);
- lsd.G[i] = Str.ToFloat(sg[i]) / 60.0;
- L("G["+i+"] = "+lsd.G[i]);
- }//for
- float fan_t0,fan_dt,fan_delay = 0.2,fan_v,fan_vmax = 0.2,fan_rpm0;
- float rpmEndTime;
- float rpmPosSet = 0.0,gPosSet = 0.0;
- int enginePosSet = 0;
- bool stressInit = true;
- float stressNormalise = 0.1;
- float stressClc_t0;
- float pcUp = 2.0,pcDown = 0.3;
- PostMessage(me,"T10MSubsystems-298469","FanMain",0.5);
- wait()
- {
- on "T10MSubsystems-298469","TractivePosChange":
- {
- ClearMessages("T10MSubsystems-298469","TractivePosChange");
- if(lsd.tractivePos != lsd.tractivePosSet)
- {
- lsd.posChange = true;
- }//if
- else
- {
- lsd.posChange = false;
- continue;
- }//else
- if( (lsd.tractivePosSet > lsd.tractivePos))
- {
- lsd.tractivePos++;
- PostMessage(me,"T10MSubsystems-298469","TractivePosChange",pcUp);
- continue;
- }//if
- else
- {
- lsd.tractivePos = lsd.tractivePosSet;
- PostMessage(me,"T10MSubsystems-298469","TractivePosChange",0.0);
- continue;
- }//else
- continue;
- }//on
- on "T10MSubsystems-298469","ChangeRpm":
- {
- ClearMessages("T10MSubsystems-298469","ChangeRpm");
- float t0 = World.GetSeconds();
- if(rpmEndTime-t0 <= 0.0)
- {
- lsd.rpm = rpmPosSet;
- lsd.enginePos = enginePosSet;
- continue;
- }//if
- float rdt = Math.Fmin(rpmEndTime-t0,0.2);
- lsd.rpm = (rpmPosSet - lsd.rpm)/(rpmEndTime - t0)*rdt + lsd.rpm;
- lsd.gBase = (gPosSet - lsd.gBase)/(rpmEndTime - t0)*rdt + lsd.gBase;
- sd.l.mainShaft = lsd.rpm/850.0;
- PostMessage(me,"T10MSubsystems-298469","ChangeRpm",rdt);
- continue;
- }//on
- on "T10MSubsystemsPosition-298469","",msg:
- {
- ClearMessages("T10MSubsystems-298469","ChangeRpm");
- string minor = msg.minor,mode;
- int n_pos;
- float currSeconds = World.GetSeconds();
- mode = Str.UnpackString(minor);
- float timePre = 0.2;
- if(mode == "S")
- {
- string submode = Str.UnpackString(minor);
- if(submode == "start")
- {
- rpmEndTime = currSeconds + 7.0;
- enginePosSet = 0;
- rpmPosSet = lsd.RPM[0];
- gPosSet = lsd.G[0];
- PostMessage(me,"T10MSubsystems-298469","ChangeRpm",2.0);
- }//if
- else if(submode == "stop")
- {
- rpmEndTime = currSeconds + 5.0;
- enginePosSet = 0;
- rpmPosSet = 0.0;
- gPosSet = 0.0;
- PostMessage(me,"T10MSubsystems-298469","ChangeRpm",1.0);
- }//else if
- }//if
- else if(mode == "R")
- {
- Str.UnpackInt(minor);//prev pos is unneeded
- enginePosSet = Str.UnpackInt(minor);
- rpmPosSet = lsd.RPM[enginePosSet];
- gPosSet = lsd.G[enginePosSet];
- rpmEndTime = currSeconds + Str.UnpackFloat(minor) - timePre;
- PostMessage(me,"T10MSubsystems-298469","ChangeRpm",timePre);
- }//else if
- continue;
- }//on
- on "T10MSubsystems-298469","FanMain":
- {
- if(fan_v>0.1) fan_delay=0.3;
- else fan_delay = 0.7;
- PostMessage(me,"T10MSubsystems-298469","FanUpdate",0.0);
- ClearMessages("T10MSubsystems-298469","FanMain");
- PostMessage(me,"T10MSubsystems-298469","FanMain",fan_delay);
- continue;
- }//on
- on "T10MSubsystems-298469","FanUpdate":
- {
- fan_dt = World.GetSeconds() - fan_t0;
- fan_t0 = fan_t0 + fan_dt;
- float fan_rpm = Math.Sqrt(8.0*lsd.fanRpm);
- fan_v = (fan_rpm-fan_rpm0)/fan_dt;
- fan_v = Math.Fmax(-fan_vmax,Math.Fmin(fan_vmax,fan_v));
- fan_rpm0 = fan_rpm0+(fan_v*fan_dt);
- if(fan_rpm0 > 0.0)
- {
- StartMeshAnimationLoop("fan");
- SetMeshAnimationSpeed("fan",fan_rpm0);
- }//if
- else
- {
- StopMeshAnimation("fan");
- fan_rpm0 = 0.0;
- }//else
- continue;
- }//on
- on "TE10-298469","Reset":
- {
- return;
- }//on
- }//wait
- }//Subsystems
- thread void Engine(void)
- {
- float dt;
- bool sendSyncMsg,sync,depMode,engineStop,engineIdle,engineIdling;
- int newPos,currentPos,oldPos,i;
- Message msg;
- XT10MLocomotive[] sects;
- bool turbine;
- float timeDelay = 0.05;
- float vol = 1.0,minDist = 50.0,maxDist = 600.0;
- string att = "a.engine";
- wait()
- {
- on "T10MEngine-298469","OilPumpStart":
- {
- if(lsd.oilPumpCircuit != 1 and lsd.oilPumpCircuit != 2) continue;
- dt = 1.095;
- World.PlaySound(SA,"engine/starter_oilpump_start.wav",vol,minDist,maxDist,me,att);
- SendMessage(me,"T10MEngine-298469","OilPump",dt-timeDelay);
- continue;
- }//on
- on "T10MEngine-298469","OilPump":
- {
- dt = 3.142;
- World.PlaySound(SA,"engine/starter_oilpump_loop.wav",vol,minDist,maxDist,me,att);
- if(lsd.oilPumpCircuit != 2)
- {
- if(lsd.oilPumpCircuit == 1)
- {
- SendMessage(me,"T10MEngine-298469","EngineStart",dt-timeDelay);
- continue;
- }//if
- else
- {
- SendMessage(me,"T10MEngine-298469","OilPumpStop",dt-timeDelay);
- continue;
- }//else
- }//if
- SendMessage(me,"T10MEngine-298469","OilPump",dt-timeDelay);
- continue;
- }//on
- on "T10MEngine-298469","OilPumpStop":
- {
- World.PlaySound(SA,"engine/starter_oilpump_stop.wav",vol,minDist,maxDist,me,att);
- continue;
- }//on
- on "T10MEngine-298469","EngineStart":
- {
- dt = 13.067;
- World.PlaySound(SA,"engine/starter_starting.wav",vol,minDist,maxDist,me,att);
- SendMessage(me,"T10MEngine-298469","EngineStarted",dt-2.0-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","S start "+dt,0.0);
- continue;
- }//on
- on "T10MEngine-298469","EngineStarted":
- {
- SendMessage(me,"T10MEngine-298469","EngineRun",2.0-timeDelay);
- PostMessage(me,"T10MAutomates-298469","EngineStarted",0.0);
- continue;
- }//on
- on "T10MEngine-298469","EngineStop":
- {
- engineStop = true;
- sync = false;
- continue;
- }//on
- on "T10MEngine-298469","EngineStopped":
- {
- engineStop = false;
- PostMessage(me,"T10MAutomates-298469","EngineStopped",0.0);
- if(fail) return;
- continue;
- }//on
- on "T10MEngine-298469","EngineRun":
- {
- l_eng_er_start:
- depMode = sync and !sci.IsIndependent() and !sci.IsMaster();
- //if(!sd.l.runCircuit) engineIdle = true;
- //if(IsIdle()) engineIdle = true;
- if(sd.l.powerDrop) engineIdle = true;
- if(!engineIdle and IsIdle()) engineIdling = true;
- sendSyncMsg = sci.IsMaster() and (sci.GetActiveSections().size() > 1);
- if(!turbine and currentPos >= 5)
- {
- PostMessage(me,"T10MEngine-298469","Turbine",0.0);
- }//if
- if(engineStop)
- {
- if(currentPos > 0)
- {
- oldPos = currentPos--;
- string sound = "engine/"+oldPos+"-"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- SendMessage(me,"T10MEngine-298469","EngineRun",dt-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","R "+oldPos+" "+currentPos+" "+dt,0.0);
- continue;
- }//if
- PostMessage(me,"T10MAutomates-298469","EngineStopping",0.0);
- dt = 18.708;
- World.PlaySound(SA,"engine/stop.wav",vol,minDist,maxDist,me,att);
- SendMessage(me,"T10MEngine-298469","EngineStopped",dt-1.0-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","S stop "+dt,0.0);
- continue;
- }//if
- else if(engineIdle)
- {
- if(!sd.l.powerDrop)
- {
- engineIdle = false;
- goto l_eng_er_start;
- }//if
- if(currentPos > 0)
- {
- oldPos = currentPos--;
- string sound = "engine/"+oldPos+"-"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- SendMessage(me,"T10MEngine-298469","EngineRun",dt-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","R "+oldPos+" "+currentPos+" "+dt,0.0);
- continue;
- }//if
- dt = 4.558;
- World.PlaySound(SA,"engine/0.wav",vol,minDist,maxDist,me,att);
- SendMessage(me,"T10MEngine-298469","EngineRun",dt-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","R 0 0 "+dt,0.0);
- continue;
- }//else if
- else if(engineIdling)
- {
- if(!IsIdle())
- {
- engineIdling = false;
- goto l_eng_er_start;
- }//if
- if(currentPos > 8)
- {
- oldPos = currentPos--;
- string sound = "engine/"+oldPos+"-"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- SendMessage(me,"T10MEngine-298469","EngineRun",dt-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","R "+oldPos+" "+currentPos+" "+dt,0.0);
- continue;
- }//if
- if(currentPos < 8)
- {
- oldPos = currentPos++;
- string sound = "engine/"+oldPos+"-"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- SendMessage(me,"T10MEngine-298469","EngineRun",dt-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","R "+oldPos+" "+currentPos+" "+dt,0.0);
- continue;
- }//if
- dt = 4.558;
- World.PlaySound(SA,"engine/0.wav",vol,minDist,maxDist,me,att);
- SendMessage(me,"T10MEngine-298469","EngineRun",dt-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","R 0 0 "+dt,0.0);
- continue;
- }//else if
- else if(depMode)
- {
- if(newPos != currentPos)
- {
- if(newPos < currentPos)
- {
- oldPos = currentPos--;
- }//if
- else if(newPos > currentPos)
- {
- oldPos = currentPos++;
- }//else if
- //dt = World.PlaySound(SA,"engine/"+oldPos+"-"+currentPos+".wav",vol,minDist,maxDist,me,att);
- string sound = "engine/"+oldPos+"-"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- }//if
- else
- {
- oldPos = currentPos;
- //dt = World.PlaySound(SA,"engine/"+currentPos+".wav",vol,minDist,maxDist,me,att);
- string sound = "engine/"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- }//if
- PostMessage(me,"T10MSubsystemsPosition-298469","R "+oldPos+" "+currentPos+" "+dt,0.0);
- continue;
- }//else if
- else
- {
- newPos = lsd.enginePosSet;
- if(newPos != currentPos)
- {
- if(newPos < currentPos)
- {
- oldPos = currentPos--;
- }//if
- else if(newPos > currentPos)
- {
- oldPos = currentPos++;
- }//else if
- //dt = World.PlaySound(SA,"engine/"+oldPos+"-"+currentPos+".wav",vol,minDist,maxDist,me,att);
- string sound = "engine/"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- }//if
- else
- {
- oldPos = currentPos;
- //dt = World.PlaySound(SA,"engine/"+currentPos+".wav",vol,minDist,maxDist,me,att);
- string sound = "engine/"+currentPos+".wav";
- dt = GetSoundDuration(sound);
- World.PlaySound(SA ,sound, vol, minDist, maxDist, me, att);
- }//if
- if(sendSyncMsg)
- {
- sects = sci.GetActiveSections();
- for(i=0;i<sects.size();i++)
- {
- if(sects[i] == me or sects[i].sci.IsIndependent()) continue;
- else SendMessage(sects[i],"T10MEngineSync-298469",currentPos);
- }//for
- }//if
- SendMessage(me,"T10MEngine-298469","EngineRun",dt-timeDelay);
- PostMessage(me,"T10MSubsystemsPosition-298469","R "+oldPos+" "+currentPos+" "+dt,0.0);
- }//else
- continue;
- }//on
- on "T10MEngineSync-298469","",msg:
- {
- if(!lsd.engineRunning) continue;
- if(sci.IsIndependent() or sci.IsMaster()) continue;
- int n_newPos = Str.ToInt(msg.minor);
- if(((currentPos-1)<=n_newPos) and (n_newPos<=(currentPos+1)))
- {
- sync = true;
- newPos = n_newPos;
- SendMessage(me,"T10MEngine-298469","EngineRun",0.0);
- }//if
- else
- {
- if(sync) SendMessage(me,"T10MEngine-298469","EngineRun",0.0);
- sync = false;
- }//else
- continue;
- }//on
- on "T10MEngine-298469","SyncReset":
- {
- if(sync and depMode and (sci.IsIndependent() or sci.IsMaster()))
- {
- SendMessage(me,"T10MEngine-298469","EngineRun",0.0);
- continue;
- }//if
- continue;
- }//on
- on "T10MEngine-298469", "Turbine":
- {
- float gP = sd.l.generatorCurrent * sd.l.generatorVoltage;
- float tv_mp = 0.000000286 * gP + 0.486;
- float tv_ms = 0.006 * Math.Fmax(10.0, Math.Fmin(80.0, lsd.engineStress)) + 0.54;
- float tv = uvk_engine * tv_mp * tv_ms;
- string ts = (string)(int)Math.Fmin(15.0, Math.Fmax(0.0, currentPos - 5));
- string tm = "x", tp = "engine/";
- float tdt;
- if(currentPos < 5 or !lsd.engineRunning)
- {
- if(turbine)
- World.PlaySound(SA, tp + "turbo_stop.wav", tv, 40.0, 400.0, me, "a.engine");
- turbine = false;
- continue;
- }//if
- else if(!turbine)
- {
- string sound = tp + "turbo_start.wav";
- tdt = GetSoundDuration(sound);
- World.PlaySound(SA, sound, tv, 40.0, 400.0, me, "a.engine");
- }
- else
- {
- string sound = tp + "turbo" + ts + tm + ".wav";
- tdt = GetSoundDuration(sound);
- World.PlaySound(SA, sound, tv, 40.0, 400.0, me, "a.engine");
- }
- turbine = true;
- SendMessage(me, "T10MEngine-298469", "Turbine", tdt-timeDelay);
- continue;
- }//on
- }//wait
- }//Engine
- thread void Automates(void)
- {
- float dt = 1.2;
- float fpcResetTime = 120.0,opcSetTime = 10.0,opcResetTime = 30.0;
- bool aSideWaterShutters,aSideOilShutters,aTopShutters,aFan;//auto
- bool mSideWaterShutters,mSideOilShutters,mTopShutters,mFan;//manual
- Sleep(1.0);
- wait()
- {
- on "T10MAutomates-298469","FuelPumpCircuit":
- {
- ClearMessages("T10MAutomates-298469","FuelPumpCircuit");
- bool fpc = CD().mainPlusAtm and CD().mainMinusAtm and CD().dieselRunAtm and CD().fuelPumpAtm and (CD().fuelPump or
- (CD2().mainPlusAtm and CD2().mainMinusAtm and CD2().dieselRunAtm and CD2().fuelPumpAtm and CD2().fuelPump2));
- if(fpc and (lsd.fuelPumpCircuit > 0)) continue;
- ClearMessages("T10MAutomates-298469","FuelPumpCircuitInit");
- ClearMessages("T10MAutomates-298469","FuelPumpCircuitSet");
- ClearMessages("T10MAutomates-298469","FuelPumpCircuitReset");
- if(!fpc)
- {
- lsd.fuelPumpCircuit = 0;
- lsd.oilPumpCircuit = 0;
- continue;
- }//if
- if(lsd.engineRunning or lsd.engineServ) continue;
- lsd.fuelPumpCircuit = 1;
- PostMessage(me,"T10MAutomates-298469","FuelPumpCircuitReset",fpcResetTime);
- PostMessage(me,"T10MAutomates-298469","OilPumpCircuit",0.0);
- continue;
- }//on
- on "T10MAutomates-298469","FuelPumpCircuitReset":
- {
- ClearMessages("T10MAutomates-298469","FuelPumpCircuitReset");
- lsd.fuelPumpCircuit = 0;
- lsd.oilPumpCircuit = 0;
- continue;
- }//on
- on "T10MAutomates-298469","OilPumpCircuit":
- {
- ClearMessages("T10MAutomates-298469","OilPumpCircuit");
- bool opc = lsd.fuelPumpCircuit == 1 and CD().mainPlusAtm and CD().mainMinusAtm and (
- (CD().controlAtm and !CD().brakeBlock and (CD().reverser == 1 or CD().reverser == -1) and CD().throttle == 0) or
- (CD2().mainPlusAtm and CD2().mainMinusAtm and CD2().controlAtm and !CD2().brakeBlock and (CD2().reverser == 1 or CD2().reverser == -1) and CD2().throttle == 0));
- if(opc and (lsd.oilPumpCircuit > 0)) continue;
- ClearMessages("T10MAutomates-298469","OilPumpCircuitInit");
- ClearMessages("T10MAutomates-298469","OilPumpCircuitSet");
- ClearMessages("T10MAutomates-298469","OilPumpCircuitReset");
- if(!opc)
- {
- lsd.oilPumpCircuit = 0;
- continue;
- }//if
- if(lsd.engineRunning or lsd.engineServ) continue;
- lsd.oilPumpCircuit = 3;
- continue;
- }//on
- on "T10MAutomates-298469","OilPumpCircuitStart":
- {
- ClearMessages("T10MAutomates-298469","OilPumpCircuitStart");
- if(lsd.engineRunning or lsd.engineServ) continue;
- if(lsd.fuelPumpCircuit != 1 or lsd.oilPumpCircuit != 3) continue;
- lsd.oilPumpCircuit = 2;
- ClearMessages("T10MAutomates-298469","FuelPumpCircuitReset");
- PostMessage(me,"T10MEngine-298469","OilPumpStart",0.0);
- PostMessage(me,"T10MAutomates-298469","OilPumpCircuitSet",opcSetTime);
- continue;
- }//on
- on "T10MAutomates-298469","OilPumpCircuitSet":
- {
- ClearMessages("T10MAutomates-298469","OilPumpCircuitSet");
- if(lsd.oilPumpCircuit != 2)
- continue;
- lsd.oilPumpCircuit = 1;
- PostMessage(me,"T10MAutomates-298469","OilPumpCircuitReset",opcResetTime);
- continue;
- }//on
- on "T10MAutomates-298469","OilPumpCircuitReset":
- {
- ClearMessages("T10MAutomates-298469","OilPumpCircuitReset");
- lsd.oilPumpCircuit = 0;
- continue;
- }//on
- on "T10MAutomates-298469","EngineStart":
- {
- int i;
- XT10MLocomotive[] scts = sci.GetActiveSections();
- for (i = 0; i < scts.size(); i++)
- if (scts[i].lsd.engineServ)
- continue;
- ClearMessages("T10MAutomates-298469","FuelPumpCircuitReset");
- ClearMessages("T10MAutomates-298469","OilPumpCircuitReset");
- lsd.engineServ = true;
- continue;
- }//on
- on "T10MAutomates-298469","EngineStarted":
- {
- lsd.engineRunning = true;
- sd.l.engineRunning = true;
- lsd.engineServ = false;
- lsd.oilPumpCircuit = 0;
- PostMessage(me,"T10MAutomates-298469","ATRS",0.0);
- PostMessage(me,"T10MAutomates-298469","Frw 2 ATRS",0.0);
- PostMessage(me,"T10MAutomates-298469","RunCircuit",0.0);
- PostMessage(me,"T10MAutomates-298469","EngineRun",0.0);
- continue;
- }//on
- on "T10MAutomates-298469","EngineStop":
- {
- if(!lsd.engineRunning or lsd.engineServ) continue;
- lsd.engineServ = true;
- ClearMessages("T10MAutomates-298469","EngineRun");
- PostMessage(me,"T10MAutomates-298469","RunCircuit",0.0);
- PostMessage(me,"T10MEngine-298469","EngineStop",0.0);
- continue;
- }//on
- on "T10MAutomates-298469","EngineStopping":
- {
- if(!lsd.engineRunning or !lsd.engineServ) continue;
- lsd.engineRunning = false;
- sd.l.engineRunning = false;
- PostMessage(me,"T10MAutomates-298469","RunCircuit",0.0);
- PostMessage(me,"T10MAutomates-298469","ATRS",0.0);
- PostMessage(me,"T10MAutomates-298469","Frw 2 ATRS",0.0);
- continue;
- }//on
- on "T10MAutomates-298469","EngineStopped":
- {
- if(lsd.engineRunning or !lsd.engineServ) continue;
- lsd.engineServ = false;
- PostMessage(me,"T10MAutomates-298469","RunCircuit",0.0);
- continue;
- }//on
- on "T10MAutomates-298469","PowerContactors":
- {
- ClearMessages("T10MAutomates-298469","PowerContactors");
- ClearMessages("T10MAutomates-298469","PowerContactorsChange");
- if(lsd.pcSet == sd.l.powerContactors) continue;
- float changeTime;
- if(lsd.pcSet)
- {
- changeTime = 0.821;
- World.PlaySound(SA,"electrics/pc_set.wav",1.0,1.0,5.0,me,"b.pk_sound") - 0.4;
- }//if
- else
- {
- World.PlaySound(SA,"electrics/pc_reset.wav",1.0,1.0,5.0,me,"b.pk_sound");
- changeTime = 0.3;
- }//else
- PostMessage(me,"T10MAutomates-298469","PowerContactorsChange",changeTime);
- continue;
- }//on
- on "T10MAutomates-298469","PowerContactorsChange":
- {
- ClearMessages("T10MAutomates-298469","PowerContactorsChange");
- sd.l.powerContactors = lsd.pcSet;
- continue;
- }//on
- on "T10MAutomates-298469","EngineRun":
- {
- ClearMessages("T10MAutomates-298469","EngineRun");
- if(!lsd.engineRunning) continue;
- if((lsd.fuelPumpCircuit != 1) or (lsd.fuelQueue.GetQueueCount() < 1))
- {
- PostMessage(me,"T10MAutomates-298469","EngineStop",0.0);
- continue;
- }//if
- PostMessage(me,"T10MAutomates-298469","ATRS",0.0);
- PostMessage(me,"T10MAutomates-298469","EngineRun",dt);
- continue;
- }//on
- on "T10MAutomates-298469","ATRS":
- {
- bool shuttersOn = CD().shuttersAtm and CD().mainPlusAtm and CD().mainMinusAtm;
- int controlSectCode = 0;
- XT10MCabinData sectionCd;
- int i = 0;
- for (; i < 4; i++ )
- {
- sectionCd = sci.GetSystemData(i).c;
- if (sectionCd.mainPlusAtm and sectionCd.mainMinusAtm and sectionCd.controlAtm
- and sectionCd.atrsManualMode and (sectionCd.reverser == 1 or sectionCd.reverser == -1))
- {
- if (controlSectCode == 0)
- controlSectCode = i;
- else
- controlSectCode = -1;
- }
- }
- bool atrsControl = shuttersOn and controlSectCode <= 0;
- bool manualControl = shuttersOn and controlSectCode >= 1;
- if (atrsControl)
- {
- if (sd.l.Tw_sensor > 72.0) aSideWaterShutters = true;
- else if (sd.l.Tw_sensor < 66.0) aSideWaterShutters = false;
- if (sd.l.To_sensor > 72.0) aSideOilShutters = true;
- else if (sd.l.To_sensor < 66.0) aSideOilShutters = false;
- if (sd.l.Tw_sensor > 74.0 or sd.l.To_sensor > 74.0) aFan = true;
- else if (sd.l.Tw_sensor < 72.0 or sd.l.To_sensor < 72.0) aFan = false;
- aTopShutters = aSideWaterShutters or aSideOilShutters;
- }
- if (manualControl)
- {
- sectionCd = sci.GetSystemData(controlSectCode).c;
- mSideWaterShutters = sectionCd.sideWaterShutters;
- mSideOilShutters = sectionCd.sideOilShutters;
- mTopShutters = sectionCd.topShutters or mSideWaterShutters or mSideOilShutters;
- mFan = sectionCd.fan;
- }
- bool topShutters = atrsControl and aTopShutters or manualControl and mTopShutters;
- bool sideWaterShutters = atrsControl and aSideWaterShutters or manualControl and mSideWaterShutters;
- bool sideOilShutters = atrsControl and aSideOilShutters or manualControl and mSideOilShutters;
- bool fan = lsd.engineRunning and (atrsControl and aFan or manualControl and mFan);
- if(topShutters != lsd.topShuttersOpened)
- {
- lsd.topShuttersOpened = topShutters;
- SetShuttersState("top_shutters",topShutters);
- }
- if(sideWaterShutters != lsd.sideWaterShuttersOpened)
- {
- lsd.sideWaterShuttersOpened = sideWaterShutters;
- SetShuttersState("side_water_shutters",sideWaterShutters);
- }
- if(sideOilShutters != lsd.sideOilShuttersOpened)
- {
- lsd.sideOilShuttersOpened = sideOilShutters;
- SetShuttersState("side_oil_shutters",sideOilShutters);
- }
- if(fan != lsd.fanRunning)
- {
- lsd.fanRunning = fan;
- if(fan)
- Fan();
- }
- continue;
- }
- }//wait
- }//Automates
- void SetShuttersState(string shutters,bool state)
- {
- SetMeshAnimationState(shutters,state);
- World.PlaySound(SA,"equipment/shutters_toggle.wav",1.0,3.0,50.0,me,"a.shutters");
- }//SetShuttersState
- thread void Fan(void)
- {
- if(!lsd.fanRunning) return;
- PlaySoundAndSleep(SA,"equipment/fan_start.wav",uvk_fan*0.8,10.0,200.0,me,"a.fan");
- while(lsd.fanRunning)
- {
- PlaySoundAndSleep(SA,"equipment/fan_loop.wav",uvk_fan*0.8,10.0,200.0,me,"a.fan");
- }//while
- World.PlaySound(SA,"equipment/fan_stop.wav",uvk_fan*0.8,10.0,200.0,me,"a.fan");
- }//Fan
- public void QUpdate(void)
- {
- if(sci.IsControlsTraction())
- SetEngineSetting("throttle",lsd.tractivePos);
- else if(!sd.l2.tractionCircuit)
- SetEngineSetting("throttle",0.0);
- switch(CD().reverser)
- {
- case 1: SetEngineSetting("reverser",Train.TRACTION_FORWARD);break;
- case -1: SetEngineSetting("reverser",Train.TRACTION_REVERSE);break;
- default: break;
- }//switch
- if(CD().reverser==0 and CD2().reverser==0)
- SetEngineSetting("reverser",Train.TRACTION_NEUTRAL);
- if(!CD().brakeBlock)
- {
- SetEngineSetting("train-auto-brake",sd.c.trainBrakeValue);
- SetEngineSetting("loco-auto-brake",sd.c.locomotiveBrakeValue);
- if(sd.c.trainBrake == 6 and !lsd.sanding)
- Sanding();
- if(sd.c.releaseBrakes)
- {
- GetMyTrain().SetBail();
- }//if
- if(GetBrakePipePressure()>GetAuxReservoirPressure())
- {
- sd.c.releaseBrakes = false;
- }//if
- }//if
- else if(CD2().brakeBlock)
- {
- SetEngineSetting("train-auto-brake",3.0);
- SetEngineSetting("loco-auto-brake",sd.c.locomotiveBrakeValue);
- sd.c.releaseBrakes = false;
- }//else if
- bool traction = sd.l.tractionCircuit;//sd.l.runCircuit and LocoControl();
- if(traction)SetWheelslipTractionMultiplier(lsd.wheelslipTM);
- else SetWheelslipTractionMultiplier(1.0);
- SetMaximumTractiveEffort(lsd.maxTE * (float)traction);
- SetSandingTractionMultiplier(lsd.sandingTM*(float)lsd.sanding + 1.0);
- if(lsd.sanding)
- SetEngineSetting("sanding",1.0);
- }//Update
- public void Update(void)
- {
- QUpdate();
- if(sci.s2 != null) sci.s2.QUpdate();
- }//Update
- thread void Main(void)
- {
- float timeInterval,bp,er,bc,vel;
- float brkst,brksttime = 1.6;
- int i;
- bogeys = GetBogeyList();
- //Initial setup
- SetCompressorEfficiency(0.0);
- SetCoupler(GetMyPosition(),GetDirectionRelativeToTrain());
- SetSandingTractionMultiplier(1.0);
- for(i=0;i<8;i++)
- SendMessage(me,"pfx","-"+(SANDPFX_INDEX+i));
- Sleep(2.0);
- sci.ReCoordinate();
- Sleep(1.0);
- P(sci.Info());
- InitSystemData();
- PhysicsScheme();
- Automates();
- Engine();
- Subsystems();
- Sleep(1.0);
- lsd.wheelslipTM = 0.2;
- lsd.sandingTM = 0.0;
- float dmaxTE = GetDefaultMaximumTractiveEffort();
- lsd.maxTE = dmaxTE;
- while(!fail)
- {
- timeInterval = 0.2;
- switch(World.GetWeatherType())
- {
- case World.WEATHER_TYPE_CLEAR: lsd.maxTE = dmaxTE;lsd.sandingEfficiency = 0.8;lsd.wheelslipTM = 0.2;break;
- case World.WEATHER_TYPE_CLOUDY: lsd.maxTE = dmaxTE;lsd.sandingEfficiency = 0.8;lsd.wheelslipTM = 0.2;break;
- case World.WEATHER_TYPE_DRIZZLE: lsd.maxTE = 0.85*dmaxTE;lsd.sandingEfficiency = 0.7;lsd.wheelslipTM = 0.16;break;
- case World.WEATHER_TYPE_RAIN: lsd.maxTE = 0.6*dmaxTE;lsd.sandingEfficiency = 0.6;lsd.wheelslipTM = 0.12;break;
- case World.WEATHER_TYPE_STORMY: lsd.maxTE = 0.4*dmaxTE;lsd.sandingEfficiency = 0.5;lsd.wheelslipTM = 0.04;break;
- case World.WEATHER_TYPE_LIGHT_SNOW: lsd.maxTE = 0.9*dmaxTE;lsd.sandingEfficiency = 0.6;lsd.wheelslipTM = 0.18;break;
- case World.WEATHER_TYPE_MEDIUM_SNOW: lsd.maxTE = 0.8*dmaxTE;lsd.sandingEfficiency = 0.5;lsd.wheelslipTM = 0.14;break;
- case World.WEATHER_TYPE_HEAVY_SNOW: lsd.maxTE = 0.65*dmaxTE;lsd.sandingEfficiency = 0.4;lsd.wheelslipTM = 0.1;break;
- default: lsd.maxTE = dmaxTE;lsd.sandingEfficiency = 0.8;lsd.wheelslipTM = 0.2;break;
- }//switch
- while(lsd.fuelConsumed >= 1.0)
- {
- lsd.fuelConsumed = lsd.fuelConsumed - 1.0;
- lsd.fuelQueue.DestroyProductMatching(null,1);
- }//if
- while(lsd.sandConsumed >= 1.0)
- {
- lsd.sandConsumed = lsd.sandConsumed - 1.0;
- lsd.sandQueue.DestroyProductMatching(null,1);
- }//if
- //Compressor//
- if(lsd.engineRunning and !lsd.compressorRunning and (GetPressureParam("main-reservoir-pressure") < 750.0))
- {
- lsd.compressorRunning = true;
- Compressor();
- }//if
- //Braking//
- if(GetPressureParam("brake-cylinder-pressure") >= 20.0)
- {
- if(!lsd.braking)
- {
- lsd.braking = true;
- Brakes();
- }//if
- }//if
- else
- {
- lsd.braking = false;
- }//else
- brkst = Math.Sqrt((Math.Fmax(0.0,Math.Fmin(400.0,GetPressureParam("brake-cylinder-pressure")))*0.01)*4.0)*(6.0/4.0);
- for(i=0;i<bogeys.size();i++)
- {
- bogeys[i].SetMeshAnimationFrame("ts",brkst,Math.Fabs(brkst-bogeys[i].GetMeshAnimationFrame("ts"))*brksttime);
- }//for
- bp = GetPressureParam("brake-pipe-pressure");
- er = GetPressureParam("equaliser-pressure");
- bc = GetPressureParam("brake-cylinder-pressure");
- if(bc > 30.0+Math.Rand(-5.0,5.0)) sd.l.braking = true;
- else if(bc < 20.0+Math.Rand(-5.0,5.0)) sd.l.braking = false;
- if((bp < 480.0+Math.Rand(-10.0,10.0)) and (bc < 40.0+Math.Rand(-5.0,5.0))) sd.l.bpbreak = true;
- else if((bp > 510.0+Math.Rand(-10.0,10.0)) or (bc > 50.0+Math.Rand(-5.0,5.0))) sd.l.bpbreak = false;
- if(bp < 350.0) lsd.bpPressureRelay = true;
- else if(bp > 500.0) lsd.bpPressureRelay = false;
- bool emg = (!CD().brakeBlock and CD().trainBrake == 6) or (!CD2().brakeBlock and CD2().trainBrake == 6);
- lsd.emergencyBraking = emg;
- if(emg and Math.Fabs(GetVelocity()/Train.KPH_TO_MPS)>=10.0)
- {
- lsd.sanding = true;
- //Sanding();
- }//if
- if((sd.l.Tw_sensor>=96.0+Math.Rand(-2.0,2.0)) or (sd.l.To_sensor>=86.0+Math.Rand(-2.0,2.0))) lsd.overheat = true;
- else if((sd.l.Tw_sensor<=92.0+Math.Rand(-2.0,2.0)) and (sd.l.To_sensor<=82.0+Math.Rand(-2.0,2.0))) lsd.overheat = false;
- sd.l.powerDrop = sd.l.bpbreak or lsd.bpPressureRelay or lsd.emergencyBraking or lsd.overheat;
- sd.l.engineIdle = lsd.engineRunning and IsIdle();
- bool rc = lsd.engineRunning and !lsd.engineServ and !sd.l.engineIdle and !sd.l.powerDrop;
- if(sd.l.runCircuit != rc)
- {
- sd.l.runCircuit = rc;
- sci.ReInitMaster();
- }//if
- if(CD().mainPlusAtm and CD().mainMinusAtm and CD().controlAtm)
- {
- lsd.posSet = CD().throttle;
- }//if
- else if(sci.s2 != null and CD2().mainPlusAtm and CD2().mainMinusAtm and CD2().controlAtm)
- {
- lsd.posSet = CD2().throttle;
- }//else if
- else
- {
- lsd.posSet = GetEngineSetting("throttle");
- }//else
- bool tractionCircuit = sd.l.runCircuit and LocoControl();
- lsd.enginePosSet = (int)sd.l.runCircuit * lsd.posSet;
- lsd.tractivePosSet = (int)tractionCircuit * lsd.posSet;
- bool shuntMode = sd.c.shuntMode and tractionCircuit and lsd.tractivePosSet == 0;
- if(shuntMode != lsd.shuntMode)
- {
- lsd.shuntMode = shuntMode;
- if(shuntMode)
- sci.ReResetMaster();
- else
- sci.ReInitMaster();
- }
- if(lsd.shuntMode)
- lsd.tractivePosSet = 1;
- bool pc = lsd.tractivePosSet > 0 and (sd.l.powerContactors or lsd.posSet == 0 or lsd.posSet == 1);
- if(lsd.pcSet != pc)
- {
- lsd.pcSet = pc;
- PostMessage(me,"T10MAutomates-298469","PowerContactors",Math.Rand(0.8,1.1));
- }//if
- if(sd.l.powerContactors != sd.l.tractionCircuit)
- {
- sd.l.tractionCircuit = sd.l.powerContactors;
- sci.ReInitTraction();
- }//if
- if(!lsd.posChange and (lsd.tractivePos != lsd.tractivePosSet))
- {
- PostMessage(me,"T10MSubsystems-298469","TractivePosChange",0.0);
- }//if
- QUpdate();
- Sleep(timeInterval);
- }//while
- }//Main
- thread void PhysicsScheme(void)
- {
- //Overload SetMyData(void) to customize parameters
- //Setting ramdomization
- float rnd_pb = MD.GetNamedTagAsFloat("trm_random_parameters_mod_base"),rnd_pd = MD.GetNamedTagAsFloat("trm_random_parameters_mod_delta");
- float rnd_tb = MD.GetNamedTagAsFloat("trm_random_termometer_mod_base"),rnd_td = MD.GetNamedTagAsFloat("trm_random_termometer_mod_delta");
- //Getting saved params
- float qn = MD.GetNamedTagAsFloat("trm_qn");
- float Temin = MD.GetNamedTagAsFloat("trm_temin"),Temax = MD.GetNamedTagAsFloat("trm_temax");
- float tmin = MD.GetNamedTagAsFloat("trm_tmin"),tmax = MD.GetNamedTagAsFloat("trm_tmax");
- float kd = MD.GetNamedTagAsFloat("trm_kd"),kw1 = MD.GetNamedTagAsFloat("trm_kw1"),kw2 = MD.GetNamedTagAsFloat("trm_kw2"),ko = MD.GetNamedTagAsFloat("trm_ko");
- float kw1c = MD.GetNamedTagAsFloat("trm_kw1c"),kw2c = MD.GetNamedTagAsFloat("trm_kw2c"),koc = MD.GetNamedTagAsFloat("trm_koc");
- float kto = MD.GetNamedTagAsFloat("trm_kto"),kcto = MD.GetNamedTagAsFloat("trm_kcto"),khw = MD.GetNamedTagAsFloat("trm_khw"),kho = MD.GetNamedTagAsFloat("trm_kho");
- float kceVmin = MD.GetNamedTagAsFloat("trm_kcevmin"),kceV = MD.GetNamedTagAsFloat("trm_kcev"),bceV = MD.GetNamedTagAsFloat("trm_bcev");
- float kfeTmin = MD.GetNamedTagAsFloat("trm_kfetmin"),kfeT = MD.GetNamedTagAsFloat("trm_kfet"),bfeT = MD.GetNamedTagAsFloat("trm_bfet"),kfeToff = MD.GetNamedTagAsFloat("trm_kfetoff");
- float kfeNmin = MD.GetNamedTagAsFloat("trm_kfenmin"),kfeN = MD.GetNamedTagAsFloat("trm_kfen"),bfeN = MD.GetNamedTagAsFloat("trm_bfen");
- float kc0 = MD.GetNamedTagAsFloat("trm_kc0"),kc = 0.77*MD.GetNamedTagAsFloat("trm_kc"),kf = MD.GetNamedTagAsFloat("trm_kf");
- float kts = MD.GetNamedTagAsFloat("trm_kts"),ktsf = MD.GetNamedTagAsFloat("trm_ktsf"),kss = MD.GetNamedTagAsFloat("trm_kss");
- kd = kd * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kw1 = kw1 * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kw2 = kw2 * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- ko = ko * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kw1c = kw1c * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kw2c = kw2c * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- koc = koc * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kto = kto * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kcto = kcto * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- khw = khw * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kho = kho * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kc0 = kc0 * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kc = kc * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kf = kf * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kts = kts * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- ktsf = ktsf * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- kss = kss * (rnd_pb + Math.Rand(-rnd_pd,rnd_pd));
- float tw_error = rnd_tb + Math.Rand(-rnd_td,rnd_td);
- float to_error = rnd_tb + Math.Rand(-rnd_td,rnd_td);
- //Calculating enviroment temperature
- float Te,gt;
- float Te_k1 = ((Temax-Temin)/(tmax-tmin)),Te_b1 = Temin-(Te_k1*tmin);
- float Te_k2 = ((Temax-Temin)/(tmax-tmin+1.0)),Te_b2 = Temin-(Te_k2*tmin);
- gt = World.GetGameTime();
- if((tmax<=gt)and(gt<=tmin))
- {
- Te = Te_k1*gt + Te_b1;
- }//if
- else
- {
- if((0.0<=gt)and(gt<tmax)) gt = 1.0 + gt;
- Te = Te_k2*gt + Te_b2;
- }//else
- //Setting up initial temperature needles values, use "Te" value for env. temperature, otherwise use float value
- if(MD.GetNamedTag("trm_start_temperature_d") == "Te") lsd.Td=Te+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_d_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_d_delta"));
- else lsd.Td=MD.GetNamedTagAsFloat("trm_start_temperature_d")+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_d_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_d_delta"));
- if(MD.GetNamedTag("trm_start_temperature_w1") == "Te") lsd.Tw1=Te+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_w1_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_w1_delta"));
- else lsd.Tw1 = MD.GetNamedTagAsFloat("trm_start_temperature_w1")+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_w1_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_w1_delta"));
- if(MD.GetNamedTag("trm_start_temperature_w2") == "Te") lsd.Tw2=Te+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_w2_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_w2_delta"));
- else lsd.Tw2=MD.GetNamedTagAsFloat("trm_start_temperature_w2")+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_w2_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_w2_delta"));
- if(MD.GetNamedTag("trm_start_temperature_o") == "Te") lsd.To=Te+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_o_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_o_delta"));
- else lsd.To=MD.GetNamedTagAsFloat("trm_start_temperature_o")+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_o_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_o_delta"));
- if(MD.GetNamedTag("trm_start_temperature_to") == "Te") lsd.Tto=Te+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_to_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_to_delta"));
- else lsd.Tto=MD.GetNamedTagAsFloat("trm_start_temperature_to")+Math.Rand(-MD.GetNamedTagAsFloat("trm_start_temperature_to_delta"),MD.GetNamedTagAsFloat("trm_start_temperature_to_delta"));
- float dTd,dTw1,dTw2,dTo,dTto;
- float dt = 0.4;
- float Ph,Phw1,Phw2,Pho,Pto,Thw1,Tho,kcV,kfT,kfN,kcs1,kcs2,kcf1,kcf2,Pcw1,Pcw2;
- float Ig,Ug,ek,vel,Fk,UdI;
- float fd1Off = 0.095,fd1On = 0.202,fd2Off = 0.106,fd2On = 0.223;
- bool a;
- while(!fail)
- {
- //Recalculating env. temperatures
- gt = World.GetGameTime();
- if((tmax<=gt)and(gt<=tmin))
- {
- Te = Te_k1*gt + Te_b1;
- }//if
- else
- {
- if((0.0<=gt)and(gt<tmax)) gt = 1.0 + gt;
- Te = Te_k2*gt + Te_b2;
- }//else
- lsd.gPower = Math.Fabs(GetEngineParam("applied-force")) * Math.Fabs(GetVelocity()) / qn;
- lsd.g = lsd.gBase + lsd.gPower;
- lsd.fuelConsumed = lsd.fuelConsumed + lsd.g / 0.83 * dt;
- lsd.engineStress = Math.Fmax(0.0,lsd.engineStress + (lsd.tractivePos - lsd.enginePos - 0.02)*dt);
- Ph = qn * lsd.g;
- L(" TRM @ "+GetName()+" :: g="+lsd.g);
- Phw1 = khw * ((lsd.Td + (kd*Ph*dt)) - lsd.Tw1);
- Pho = kho * ((lsd.Td + (kd*Ph*dt)) - lsd.To);
- dTd = kd * (Ph - Phw1 - Pho) * dt;
- sd.l.Tw_sensor = tw_error + lsd.Tw1 + (kw1c*Phw1);
- sd.l.To_sensor = to_error + lsd.To + (koc*Pho);
- Phw2 = kto * ((lsd.To+(ko*Pho*dt)) - lsd.Tw2);
- Pho = Pho - Phw2;
- dTo = ko * Pho * dt;
- vel = Math.Fabs(GetVelocity()/Train.KPH_TO_MPS);
- kcV = Math.Fmax(kceVmin,Math.Fmin(1.0,kceV*vel + bceV));//k(vel)
- if(!lsd.fanRunning) kfT=kfeToff;
- else if(sd.c.atrsManualMode) kfT=1.0;
- else kfT = Math.Fmax(kfeTmin,Math.Fmin(1.0,(kfeT*Math.Fmax(sd.l.Tw_sensor,sd.l.To_sensor))+bfeT));//k(T)
- kfN = Math.Fmax(kfeNmin,Math.Fmin(1.0,kfeN*lsd.rpm+bfeN));//k(rpm)
- lsd.fanRpm = kfT * kfN;
- if(lsd.topShuttersOpened and lsd.sideWaterShuttersOpened) kcs1 = 1.0;
- else if(lsd.topShuttersOpened) kcs1 = kts;
- else if(lsd.sideWaterShuttersOpened) kcs1 = kss;
- else kcs1 = 0.0;
- if(lsd.topShuttersOpened and lsd.sideWaterShuttersOpened) kcf1 = kf * kfT * kfN;
- else if(lsd.topShuttersOpened) kcf1 = ktsf * kf * kfT * kfN;
- else kcf1 = 0.0;
- if(lsd.topShuttersOpened and lsd.sideOilShuttersOpened) kcs2 = 1.0;
- else if(lsd.topShuttersOpened) kcs2 = kts;
- else if(lsd.sideOilShuttersOpened) kcs2 = kss;
- else kcs2 = 0.0;
- if(lsd.topShuttersOpened and lsd.sideOilShuttersOpened) kcf2 = kf * kfT * kfN;
- else if(lsd.topShuttersOpened) kcf2 = ktsf * kf * kfT * kfN;
- else kcf2 = 0.0;
- Pcw1 = (kc0 + (kcV*(kcs1+kcf1)*kc)) * ((lsd.Tw1+(kw1*Ph*dt)) - Te);
- dTw1 = kw1 * (Phw1 - Pcw1) * dt;
- Pcw2 = (kc0 + (kcV*(kcs2+kcf2)*kc)) * ((lsd.Tw2+(kw2c*Phw2)) - Te);
- dTw2 = kw2 * (Phw2 - Pcw2) * dt;
- lsd.Td = lsd.Td + dTd;
- lsd.Tw1 = lsd.Tw1 + dTw1;
- lsd.Tw2 = lsd.Tw2 + dTw2;
- lsd.To = lsd.To + dTo;
- lsd.Tto = lsd.Tto + dTto;
- switch(lsd.fieldDivertState)
- {
- case 1: ek = -0.042*vel/3.6 + 31.64;break;
- case 2: ek = -0.0036*vel/3.6 + 35.57;break;
- default: ek = -0.11*vel/3.6 + 28.12;break;
- }//switch
- vel = Math.Fabs(GetVelocity());
- Fk = (float)sd.l.powerContactors * Math.Fabs(GetEngineParam("applied-force"));
- float sqrtFk = Math.Sqrt(Fk);
- Ig = ek*sqrtFk*0.32;// Newtons to kgf
- if(Ig != 0.0) Ug = (vel+0.01)*Fk/Ig;
- else Ug = 0.0;
- sd.l.generatorCurrent = Ig;
- sd.l.generatorVoltage = Ug;
- if(Ig != 0.0) UdI = Ug/Ig;
- else UdI = 0.0;
- if(lsd.fieldDivertState == 0 and UdI > fd1On)
- lsd.fieldDivertState = 1;
- if(lsd.fieldDivertState == 1 and UdI > fd2On)
- lsd.fieldDivertState = 2;
- if(lsd.fieldDivertState == 1 and UdI < fd1Off)
- lsd.fieldDivertState = 0;
- if(lsd.fieldDivertState == 2 and UdI < fd2Off)
- lsd.fieldDivertState = 1;
- Sleep(dt);
- }//while
- }//PhysicsScheme
- thread void Compressor(void)
- {
- float vol = uvk_compressor,mindist = 12.0,maxdist = 200.0;
- float e1 = 0.6,e2 = 0.2,emin = 0.1,emax = 0.6;
- float k = (e2-e1)/100.0,b = (17.0*e1-15.0*e2)/2;
- float endPressure = Math.Rand(848.0,856.0);
- SetCompressorEfficiency(Math.Fmax(emin,Math.Fmin(emax,k*GetPressureParam("main-reservoir-pressure") + b)));
- PlaySoundAndSleep(SA,"equipment/compressor_start.wav",vol,mindist,maxdist,me,"a.compressor");
- while(lsd.engineRunning and (GetPressureParam("main-reservoir-pressure") < endPressure))
- {
- SetCompressorEfficiency(Math.Fmax(emin,Math.Fmin(emax,k*GetPressureParam("main-reservoir-pressure") + b)));
- PlaySoundAndSleep(SA,"equipment/compressor_loop.wav",vol,mindist,maxdist,me,"a.compressor");
- }//while
- World.PlaySound(SA,"equipment/compressor_stop.wav",vol,mindist,maxdist,me,"a.compressor");
- SetCompressorEfficiency(0.0);
- lsd.compressorRunning = false;
- }//Compressor
- thread void Brakes(void)
- {
- float vol = uvk_brakes*0.5,mindist = 10.0,maxdist = 120.0;
- bool braking = false,stopping = false;
- float accel,v = Math.Fabs(GetVelocity())/Train.KPH_TO_MPS,v0 = Math.Fabs(GetVelocity())/Train.KPH_TO_MPS,t,t0 = World.GetSeconds(),tts;
- Sleep(0.1);
- while(v>0.6 and lsd.braking)
- {
- v = Math.Fabs(GetVelocity())/Train.KPH_TO_MPS;
- t = World.GetSeconds();
- accel = (v-v0)/(t-t0);
- v0 = v;
- t0 = t;
- if(GetPressureParam("brake-cylinder-pressure") > 40.0)
- {
- if(v>0.1 and v<6.0)
- {
- if(!stopping)
- {
- stopping = true;
- tts = v/accel;
- if(3.0<=tts and tts<4.0)
- {
- World.PlaySound(SA,"outer/brakes_finalstop_3.5.wav",vol,mindist,maxdist,me,"a.bog0");
- World.PlaySound(SA,"outer/brakes_finalstop_3.5.wav",vol,mindist,maxdist,me,"a.bog1");
- }//if
- else if(1.0<tts and tts<1.8)
- {
- World.PlaySound(SA,"outer/brakes_finalstop_1.5.wav",vol,mindist,maxdist,me,"a.bog0");
- World.PlaySound(SA,"outer/brakes_finalstop_1.5.wav",vol,mindist,maxdist,me,"a.bog1");
- }//if
- }//if
- }//if
- else stopping = false;
- if(!braking)
- {
- braking = true;
- World.PlaySound(SA,"outer/brakes_apl_start.wav",vol,mindist,maxdist,me,"a.bog0");
- PlaySoundAndSleep(SA,"outer/brakes_apl_start.wav",vol,mindist,maxdist,me,"a.bog1");
- continue;
- }//if
- World.PlaySound(SA,"outer/brakes_apl_loop.wav",vol,mindist,maxdist,me,"a.bog0");
- PlaySoundAndSleep(SA,"outer/brakes_apl_loop.wav",vol,mindist,maxdist,me,"a.bog1");
- }//if
- else
- {
- if(braking)
- {
- braking = false;
- World.PlaySound(SA,"outer/brakes_apl_stop.wav",vol,mindist,maxdist,me,"a.bog0");
- PlaySoundAndSleep(SA,"outer/brakes_apl_stop.wav",vol,mindist,maxdist,me,"a.bog1");
- continue;
- }//if
- else Sleep(0.4);
- stopping = false;
- }//else
- }//while
- if(braking)
- {
- World.PlaySound(SA,"outer/brakes_apl_stop.wav",vol,mindist,maxdist,me,"a.bog0");
- World.PlaySound(SA,"outer/brakes_apl_stop.wav",vol,mindist,maxdist,me,"a.bog1");
- }//if
- lsd.braking = false;
- }//Brakes
- int GetSandingState(void)//0 - off, 1 - full, 2 - lead axle
- {
- bool sOn = CD().mainPlusAtm and CD().mainMinusAtm;// and lsd.engineRunning;
- if(!sOn) return 0;
- bool c1 = CD().mainPlusAtm and CD().mainMinusAtm and CD().controlAtm and (CD().reverser == 1 or CD().reverser == -1);
- bool c2 = CD2().mainPlusAtm and CD2().mainMinusAtm and CD2().controlAtm and (CD2().reverser == 1 or CD2().reverser == -1);
- bool ctrl = (c1 and !c2) or (!c1 and c2);
- if(!ctrl) return 0;
- bool sandingSpeed = Math.Fabs(GetVelocity()/Train.KPH_TO_MPS) >= 10.0;
- if(c1)
- {
- int c1ss = ((int)(CD().sanding or (lsd.emergencyBraking and sandingSpeed)))*1 + ((int)CD().sanding1axle)*2;
- if(c1ss == 3) return 1;
- else return c1ss;
- }//if
- if(c2) return ((int)(CD2().sanding or (lsd.emergencyBraking and sandingSpeed)))*1;
- return 0;
- }//GetSandingState
- void UnsetSandPfx(void)
- {
- int i;
- for(i=0;i<8;i++)
- SendMessage(me,"pfx","-"+(SANDPFX_INDEX+i));
- }//UnsetSandPfx
- void SetSandPfx(int step)
- {
- UnsetSandPfx();
- bool dir = GetDirectionRelativeToTrain();
- bool rev = (GetEngineSetting("reverser") == Train.TRACTION_FORWARD);
- bool exhDir = (dir and !rev) or (!dir and rev);
- int dirOffset = 0;
- if(exhDir) dirOffset = 2;
- int i;
- for(i=0;i<6;i=i+step)
- PostMessage(me,"pfx","+"+(SANDPFX_INDEX+i+dirOffset)+"+"+(SANDPFX_INDEX+i+dirOffset+1),0.0);
- }//SetSandPfx
- public void Sanding(void)
- {
- if(GetSandingState() == 0) return;
- int i;
- XT10MLocomotive[] scts = sci.GetSections();
- for(i=0;i<scts.size();i++)
- scts[i].SandExhaust();
- }//Sanding
- thread void SandExhaust(void)
- {
- int ss = GetSandingState();
- if(lsd.sanding or ss == 0 or lsd.sandQueue.GetQueueCount() < 1) return;
- lsd.sanding = true;
- float dt,sandG,vol = 1.0,minDist = 10.0,maxDist = 100.0;
- string att = "a.bog0";
- PlaySoundAndSleep(SA,"outer/sanding_vr_start.wav",1.0,2.0,5.0,me,att);
- PlaySoundAndSleep(SA,"outer/sanding_start.wav",vol,minDist,maxDist,me,att);
- while(ss != 0)
- {
- dt = 0.475;
- World.PlaySound(SA,"outer/sanding_loop.wav",vol,minDist,maxDist,me,att)-0.06;
- if(ss == 1)
- {
- SetSandPfx(4);
- lsd.sandingTM = lsd.sandingEfficiency;
- sandG = 0.6;
- }//if
- else if(ss == 2)
- {
- SetSandPfx(8);
- lsd.sandingTM = 0.4 * lsd.sandingEfficiency;
- sandG = 0.3;
- }//else if
- lsd.sandConsumed = lsd.sandConsumed + (sandG*dt);
- Sleep(dt);
- ss = GetSandingState();
- }//while
- World.PlaySound(SA,"outer/sanding_vr_stop.wav",1.0,2.0,5.0,me,att);
- World.PlaySound(SA,"outer/sanding_stop.wav",vol,minDist,maxDist,me,att);
- lsd.sanding = false;
- lsd.sandingTM = 0.0;
- UnsetSandPfx();
- }//SandExhaust
- thread void Typhoon(void)
- {
- if(lsd.typhoon or sd.c.horn != 1)
- return;
- lsd.typhoon = true;
- PlaySoundAndSleep(SA,"outer/typhoon_start.wav",1.0,20.0,900.0,me,"a.horn");
- while(sd.c.horn == 1)
- PlaySoundAndSleep(SA,"outer/typhoon_loop.wav",1.0,20.0,900.0,me,"a.horn");
- lsd.typhoon = false;
- World.PlaySound(SA,"outer/typhoon_stop.wav",1.0,20.0,900.0,me,"a.horn");
- }
- thread void Whistle(void)
- {
- if(lsd.whistle or sd.c.horn != -1)
- return;
- lsd.whistle = true;
- PlaySoundAndSleep(SA,"outer/whistle_start.wav",1.0,20.0,900.0,me,"a.horn");
- while(sd.c.horn == -1)
- PlaySoundAndSleep(SA,"outer/whistle_loop.wav",1.0,20.0,900.0,me,"a.horn");
- lsd.whistle = false;
- World.PlaySound(SA,"outer/whistle_stop.wav",1.0,20.0,900.0,me,"a.horn");
- }
- public void Horn(void)
- {
- if(sd.c.horn == 1 and !lsd.typhoon)
- Typhoon();
- else if(sd.c.horn == -1 and !lsd.whistle)
- Whistle();
- }
- public bool LocoControl(void)
- {
- bool lc1 = IsControl();
- bool lc2 = sci.s2!=null and sci.s2.IsControl();
- bool lc3 = sci.s3!=null and sci.s3.IsControl();
- bool lc4 = sci.s4!=null and sci.s4.IsControl();
- return (lc1 and !lc2 and !lc3 and !lc4)
- or (!lc1 and lc2 and !lc3 and !lc4)
- or (!lc1 and !lc2 and lc3 and !lc4)
- or (!lc1 and !lc2 and !lc3 and lc4);
- }//LocoControl
- public bool IsControl(void)
- {
- return CD().mainPlusAtm and CD().mainMinusAtm and CD().controlAtm and !CD().brakeBlock and CD().locoControl and CD().epvKey;
- }//IsControl
- public bool IsIdle(void)
- {
- XT10MCabinData cd = sci.GetTranslatedCabinData(2);
- bool cdi = cd.mainPlusAtm and cd.mainMinusAtm and cd.controlAtm and cd.locoControl and cd.idle;
- if(cdi) return true;
- return false;
- }//IsIdle
- void InitSystemData(void)
- {
- sd.l = sd.l;
- sd.c = sd.c;
- sd.l2 = new XT10MLocomotiveData();
- if(sci.GetSection(2)!=null) sd.l2 = sci.GetSection(2).sd.l;
- }//InitSystemData
- void ATMMessageForward(Message msg)
- {
- string minor = msg.minor;
- if(Str.UnpackString(minor) != "Frw")
- return;
- int dstCrd = Str.UnpackInt(minor);
- string function = Str.UnpackString(minor);
- XT10MLocomotive dstLoco = sci.GetSection(dstCrd);
- if(dstLoco != null) PostMessage(dstLoco,"T10MAutomates-298469",function,0.0);
- }//ATMMessageForward
- void T10MHandler(Message msg)
- {
- if(msg.minor == "EmergencyStop")
- {
- PostMessage(me,"T10MAutomates-298469","FuelPumpCircuitReset",0.0);
- PostMessage(me,"T10MAutomates-298469","Frw 2 FuelPumpCircuitReset",0.0);
- return;
- }//if
- }//T10MHandler
- void CommonHandler(Message msg)
- {
- if(msg.major == "Vehicle" and (msg.minor == "Coupled" or msg.minor == "Decoupled"))
- {
- sci.ReCoordinate();
- InitSystemData();
- SetCoupler(GetMyPosition(),GetDirectionRelativeToTrain());
- return;
- }//if
- if(msg.major == "Vehicle" and msg.minor == "Derailed")
- {
- fail = true;
- PostMessage(me,"T10M-298469","Failed",0.0);
- }//if
- }//CommonHandler
- public void Init(Asset p_asset)
- {
- A = p_asset;
- inherited(p_asset);
- SA = A.FindAsset("sound-library");
- SA3_coupled = A.FindAsset("SA3-coupled");
- SA3_decoupled = A.FindAsset("SA3-uncoupled");
- //SetCouplerAttach(0,false);
- //SetCouplerAttach(1,false);
- Soup vs = A.GetConfigSoup().GetNamedSoup("extensions").GetNamedSoup("sound-vol-setup-298469");
- uvk_compressor = vs.GetNamedTagAsFloat("compressor");
- uvk_fan = vs.GetNamedTagAsFloat("fan");
- uvk_engine = vs.GetNamedTagAsFloat("engine");
- uvk_brakes = vs.GetNamedTagAsFloat("brakes");
- uvk_horn = vs.GetNamedTagAsFloat("horn");
- P(uvk_compressor);
- lsd = new LocomotiveSystemData();
- sd = new XT10MSystemData();
- sd.Init();
- sci = new SCI_2Sections();
- sci.Init(me);
- lsd.fuelQueue = GetQueue("fuel");
- lsd.sandQueue = GetQueue("sand");
- wavdb = Constructors.NewSoup();
- wavdb.SetNamedTag("engine/starter_oilpump_start.wav", 1.095);
- wavdb.SetNamedTag("engine/starter_oilpump_stop.wav", 1.488);
- wavdb.SetNamedTag("engine/starter_oilpump_loop.wav", 3.142);
- wavdb.SetNamedTag("engine/starter_starting.wav", 13.067);
- wavdb.SetNamedTag("engine/stop.wav", 18.708);
- wavdb.SetNamedTag("engine/turbo_start.wav", 4.068);
- wavdb.SetNamedTag("engine/turbo_stop.wav", 4.068);
- wavdb.SetNamedTag("engine/turbo0x.wav", 4.629);
- wavdb.SetNamedTag("engine/turbo1x.wav", 4.482);
- wavdb.SetNamedTag("engine/turbo2x.wav", 4.290);
- wavdb.SetNamedTag("engine/turbo3x.wav", 4.134);
- wavdb.SetNamedTag("engine/turbo4x.wav", 3.996);
- wavdb.SetNamedTag("engine/turbo5x.wav", 3.799);
- wavdb.SetNamedTag("engine/turbo6x.wav", 3.710);
- wavdb.SetNamedTag("engine/turbo7x.wav", 3.567);
- wavdb.SetNamedTag("engine/turbo8x.wav", 3.415);
- wavdb.SetNamedTag("engine/turbo9x.wav", 3.299);
- wavdb.SetNamedTag("engine/turbo10x.wav", 3.170);
- wavdb.SetNamedTag("engine/0-1.wav", 3.553);
- wavdb.SetNamedTag("engine/0.wav", 4.558);
- wavdb.SetNamedTag("engine/1-0.wav", 3.553);
- wavdb.SetNamedTag("engine/1-2.wav", 4.572);
- wavdb.SetNamedTag("engine/1.wav", 2.975);
- wavdb.SetNamedTag("engine/2-1.wav", 4.572);
- wavdb.SetNamedTag("engine/2-3.wav", 8.802);
- wavdb.SetNamedTag("engine/2.wav", 3.673);
- wavdb.SetNamedTag("engine/3-2.wav", 8.802);
- wavdb.SetNamedTag("engine/3-4.wav", 8.923);
- wavdb.SetNamedTag("engine/3.wav", 5.721);
- wavdb.SetNamedTag("engine/4-3.wav", 8.923);
- wavdb.SetNamedTag("engine/4-5.wav", 3.170);
- wavdb.SetNamedTag("engine/4.wav", 5.672);
- wavdb.SetNamedTag("engine/5-4.wav", 7.199);
- wavdb.SetNamedTag("engine/5-6.wav", 6.080);
- wavdb.SetNamedTag("engine/5.wav", 8.158);
- wavdb.SetNamedTag("engine/6-5.wav", 6.080);
- wavdb.SetNamedTag("engine/6-7.wav", 6.597);
- wavdb.SetNamedTag("engine/6.wav", 5.069);
- wavdb.SetNamedTag("engine/7-6.wav", 6.597);
- wavdb.SetNamedTag("engine/7-8.wav", 7.148);
- wavdb.SetNamedTag("engine/7.wav", 6.868);
- wavdb.SetNamedTag("engine/8-7.wav", 7.148);
- wavdb.SetNamedTag("engine/8-9.wav", 6.125);
- wavdb.SetNamedTag("engine/8.wav", 7.512);
- wavdb.SetNamedTag("engine/9-8.wav", 6.125);
- wavdb.SetNamedTag("engine/9-10.wav", 6.072);
- wavdb.SetNamedTag("engine/9.wav", 6.282);
- wavdb.SetNamedTag("engine/10-9.wav", 6.072);
- wavdb.SetNamedTag("engine/10-11.wav", 6.382);
- wavdb.SetNamedTag("engine/10.wav", 6.364);
- wavdb.SetNamedTag("engine/11-10.wav", 6.382);
- wavdb.SetNamedTag("engine/11-12.wav", 6.086);
- wavdb.SetNamedTag("engine/11.wav", 6.595);
- wavdb.SetNamedTag("engine/12-11.wav", 6.086);
- wavdb.SetNamedTag("engine/12-13.wav", 5.504);
- wavdb.SetNamedTag("engine/12.wav", 2.667);
- wavdb.SetNamedTag("engine/13-12.wav", 5.504);
- wavdb.SetNamedTag("engine/13-14.wav", 4.847);
- wavdb.SetNamedTag("engine/13.wav", 3.980);
- wavdb.SetNamedTag("engine/14-13.wav", 4.847);
- wavdb.SetNamedTag("engine/14-15.wav", 6.006);
- wavdb.SetNamedTag("engine/14.wav", 2.476);
- wavdb.SetNamedTag("engine/15-14.wav", 6.006);
- wavdb.SetNamedTag("engine/15.wav", 3.287);
- wavdb.SetNamedTag("equipment/compressor_start.wav", 0.992);
- wavdb.SetNamedTag("equipment/compressor_stop.wav", 0.627);
- wavdb.SetNamedTag("equipment/compressor_loop.wav", 1.435);
- wavdb.SetNamedTag("equipment/fan_start.wav", 4.373);
- wavdb.SetNamedTag("equipment/fan_loop.wav", 3.866);
- wavdb.SetNamedTag("outer/sanding_vr_start.wav", 0.246);
- wavdb.SetNamedTag("outer/sanding_start.wav", 0.025);
- wavdb.SetNamedTag("outer/typhoon_start.wav", 0.757);
- wavdb.SetNamedTag("outer/typhoon_loop.wav", 1.094);
- wavdb.SetNamedTag("outer/whistle_start.wav", 0.235);
- wavdb.SetNamedTag("outer/whistle_loop.wav", 0.583);
- wavdb.SetNamedTag("outer/brakes_apl_start.wav", 0.287);
- wavdb.SetNamedTag("outer/brakes_apl_loop.wav", 0.730);
- wavdb.SetNamedTag("outer/brakes_apl_loop.wav", 0.264);
- SetMyData();
- Main();
- //Initial setup
- AddHandler(me,"Vehicle","Coupled","CommonHandler");
- AddHandler(me,"Vehicle","Decoupled","CommonHandler");
- AddHandler(me,"T10MAutomates-298469","","ATMMessageForward");
- AddHandler(me,"T10M-298469","","T10MHandler");
- AddHandler(me,"Vehicle","Derailed","CommonHandler");
- AddHandler(me,"MapObject","View-Details","CommonHandler");
- }//Init
- thread void SendMessage(GameObject dst,string major,string minor,float delay)
- {
- Sleep(Math.Fmax(0.0,delay-0.005));
- SendMessage(dst,major,minor);
- }//SendMessage
- public XT10MCabinData CD(void)
- {
- return sd.c;
- }//CD
- public XT10MCabinData CD2(void)
- {
- return sci.GetSystemData(2).c;
- }//CD2
- public void SetMyData(void)
- {
- //if overload, do not forget to call inherited() before all changes (-;
- MD = Constructors.NewSoup();
- //param = param * (base + random(-delta,delta))
- MD.SetNamedTag("trm_random_parameters_mod_base",1.0);
- MD.SetNamedTag("trm_random_parameters_mod_delta",0.1);
- //tempInd = tempFact + (base + random(-delta,delta))
- MD.SetNamedTag("trm_random_termometer_mod_base",0.0);
- MD.SetNamedTag("trm_random_termometer_mod_delta",12.0);
- //temp = Te or temp = t + random(-delta,delta)
- MD.SetNamedTag("trm_start_temperature_d","Te");
- MD.SetNamedTag("trm_start_temperature_w1","Te");
- MD.SetNamedTag("trm_start_temperature_w2","Te");
- MD.SetNamedTag("trm_start_temperature_o","Te");
- MD.SetNamedTag("trm_start_temperature_to","Te");
- MD.SetNamedTag("trm_start_temperature_d_delta",12.0);
- MD.SetNamedTag("trm_start_temperature_w1_delta",12.0);
- MD.SetNamedTag("trm_start_temperature_w2_delta",12.0);
- MD.SetNamedTag("trm_start_temperature_o_delta",12.0);
- MD.SetNamedTag("trm_start_temperature_to_delta",12.0);
- /*engvol {
- ev0 "0.3,0.4,0.3,0.4,0.4,0.7,0.8,0.4,0.6,0.7,0.6,0.7,0.4,0.3,0.4,0.5"
- ev1 "0.3,0.4,0.3,0.4,0.4,0.7,0.8,0.4,0.6,0.7,0.6,0.7,0.4,0.3,0.4,0.5"
- ev2 "0.3,0.4,0.3,0.4,0.4,0.7,0.8,0.4,0.6,0.7,0.6,0.7,0.4,0.3,0.4,0.5"
- }*/
- MD.SetNamedTag("trm_qn",27940000.0);
- MD.SetNamedTag("trm_kd",0.000000103);
- MD.SetNamedTag("trm_kw1",0.00000035);
- MD.SetNamedTag("trm_kw1c",0.00000057);
- MD.SetNamedTag("trm_kw2",0.00000076);
- MD.SetNamedTag("trm_kw2c",0.0000057);
- MD.SetNamedTag("trm_ko",0.0000004);
- MD.SetNamedTag("trm_koc",0.000018);
- MD.SetNamedTag("trm_temin",18);
- MD.SetNamedTag("trm_temax",32);
- MD.SetNamedTag("trm_tmin",0.75);
- MD.SetNamedTag("trm_tmax",0.08);
- MD.SetNamedTag("trm_kto",33460);
- MD.SetNamedTag("trm_kcto",0.00003);
- MD.SetNamedTag("trm_khw",117850);
- MD.SetNamedTag("trm_kho",38000);
- MD.SetNamedTag("trm_kcevmin",0.6);
- MD.SetNamedTag("trm_kcev",-0.005);
- MD.SetNamedTag("trm_bcev",1);
- MD.SetNamedTag("trm_kfetmin",0.4);
- MD.SetNamedTag("trm_kfetoff",0.0085);
- MD.SetNamedTag("trm_kfet",0.075);
- MD.SetNamedTag("trm_bfet",-5.15);
- MD.SetNamedTag("trm_kfenmin",0);
- MD.SetNamedTag("trm_kfen",0.00125);
- MD.SetNamedTag("trm_bfen",-0.0625);
- MD.SetNamedTag("trm_kc0",3500);
- MD.SetNamedTag("trm_kc",40489);
- MD.SetNamedTag("trm_kts",0.2);
- MD.SetNamedTag("trm_kss",0.3);
- MD.SetNamedTag("trm_ktsf",0.3);
- MD.SetNamedTag("trm_kf",0.4);
- }//SetMyData
- public int GetMyPosition(void)
- {
- Vehicle[] vhs;
- vhs = GetMyTrain().GetVehicles();
- //only i
- if (vhs.size() == 1) return 0;
- //i'm first
- else if (me == vhs[0]) return 1;
- //i,m last
- else if (me == vhs[vhs.size()-1]) return 3;
- //i'm somewhere in the consist
- return 2;
- }
- void SetCouplerAttach(int pos, bool type)
- {
- if (pos == 0)
- {
- if (type == true) SetFXAttachment ("front_couple", SA3_coupled);
- else SetFXAttachment ("front_couple", SA3_decoupled);
- }
- else
- {
- if (type == true) SetFXAttachment ("back_couple", SA3_coupled);
- else SetFXAttachment ("back_couple", SA3_decoupled);
- }
- }
- void SetCoupler(int pos, bool direction)
- {
- if (pos == 0)
- {
- SetCouplerAttach(0,false);
- SetCouplerAttach(1,false);
- }
- else if (pos == 1)
- {
- if (direction)
- {
- SetCouplerAttach(0,false);
- SetCouplerAttach(1,true);
- }
- else
- {
- SetCouplerAttach(0,true);
- SetCouplerAttach(1,false);
- }
- }
- else if (pos == 2)
- {
- SetCouplerAttach(0,true);
- SetCouplerAttach(1,true);
- }
- else if (pos == 3)
- {
- if (direction)
- {
- SetCouplerAttach(0,true);
- SetCouplerAttach(1,false);
- }
- else
- {
- SetCouplerAttach(0,false);
- SetCouplerAttach(1,true);
- }
- }
- }
- public float GetPressureParam(string param)
- {
- float pressureMultiplier = 1.0 / (0.145 * 0.0000703);
- float pressureBase = 14.7 * 0.0000703;
- return pressureMultiplier * (GetEngineParam(param) - pressureBase);
- }
- public float GetPressureParam(float val)
- {
- float pressureMultiplier = 1.0 / (0.145 * 0.0000703);
- float pressureBase = 14.7 * 0.0000703;
- return pressureMultiplier * (val - pressureBase);
- }
- public float GetPressureParam(Vehicle vh,string param)
- {
- float pressureMultiplier = 1.0 / (0.145 * 0.0000703);
- float pressureBase = 14.7 * 0.0000703;
- return pressureMultiplier * (vh.GetEngineParam(param) - pressureBase);
- }
- };//class XT10MLocomotive
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement