tag:blogger.com,1999:blog-21986842659151715622024-03-22T05:01:46.134+00:00Train Sim LiveTrain Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-2198684265915171562.post-68257987866629429892016-01-10T23:34:00.000+00:002016-01-10T23:36:14.770+00:00Create your own Rail Fan Scenarios!Creating Rail Fan or Trainspotting scenarios is almost identical to making a standard scenario, so if you've already got the hang of making your own scenarios then this will be easy! If you haven't, this might be an interesting place to start because these are generally a bit easier than scenarios due to the player not actually moving anywhere.<br />
<br />
The first step is to actually get in to the world editor and create a scenario, so from the main screen click the Build menu, then select the Scenario tab.<br />
<br />
Scroll through the list that's presented until you find the route you want to make your Railfan scenario, select it and then click New Scenario.<br />
<br />
On the dialog box that comes up, type in a name for the scenario, select "Standard scenario" as the type and then in the "Set Location" area see if the location you want is roughly there (on all steam DLC routes you should find one location for each station on the route), if not then select Route Origin. Click Create.<br />
<br />
<h2>
Required Assets</h2>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigFp8wKUYdP4F5JQyV1_IYWX69gSv4pBpxrUmpevh2zcUf4vT2AWdiPxeHMn4BqGZf22DoaguYjyrCuBKDI7MJSt0XqXrlu-dpo5thXHcqRuHr-IAhBUJ3fJkLPThdRoMTtn0mSQ7QTig/s1600/objectsetfilter.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigFp8wKUYdP4F5JQyV1_IYWX69gSv4pBpxrUmpevh2zcUf4vT2AWdiPxeHMn4BqGZf22DoaguYjyrCuBKDI7MJSt0XqXrlu-dpo5thXHcqRuHr-IAhBUJ3fJkLPThdRoMTtn0mSQ7QTig/s320/objectsetfilter.png" width="99" /></a>Think about the kinds of trains you're going to want to include and let's get them enabled in the Object Set Filter. Be selective about what you include because every tick box you enable is a piece of DLC that someone must own to run this scenario if you choose to share it on Steam Workshop. Also, keep in mind that the game will load <i>every</i> asset contained in that package even if you just use one wagon out of it, so try not to pick a large package without making as much use of it as possible.<br />
<br />
To enable items, you need to open the Object Set Filter, highlighted on the screen capture.<br />
<br />
Once you click this, a window will be available on the top right hand side (you may need to move your mouse over it to make it fly out and be visible). This will contain a drop-down box containing "providers" and a list of "products" for each one. You will find most Dovetail steam content in either the "RSC" or "DTG" provider. You should generally be able to recognise or guess what's in each of the products based on their name. Tick the MIDDLE checkbox in order to enable it's rail vehicles for your scenario.<br />
<br />
<br />
One important asset you must enable is the Railfan "loco" - this is included in new DTG products and there is a copy in each of the provider/product packages for the routes contained within TS2016. For example, if you find provider DTG and product ExeterKingswear you will enable the Riviera in the 50's assets, which will give you the Railfan "loco". If you don't have one of these products you could just use a regular loco.<br />
<br />
<h2>
The Player</h2>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmJkFuOPWIGmClDAVQVZmuLVz2qqbJZKFumx3E5x7wC5uDpXkQ0zacSHEUh7WcjtdrfT96Hc6s16vIr3WZs10jM5zc0Ymx8On1D-X0DuQSoEiNTgEuTjK77ymETFVnr0J7nGvMyCGdC1A/s1600/railfan-2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmJkFuOPWIGmClDAVQVZmuLVz2qqbJZKFumx3E5x7wC5uDpXkQ0zacSHEUh7WcjtdrfT96Hc6s16vIr3WZs10jM5zc0Ymx8On1D-X0DuQSoEiNTgEuTjK77ymETFVnr0J7nGvMyCGdC1A/s320/railfan-2.png" width="91" /></a>The first thing you're going to want to do is find somewhere to place the invisible "player train". Ideally this should be situated on a siding or a track that isn't going to be used, somewhere in the close vicinity of the station.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFW5ooglhXE2bfzRpLrPv__GTtPCcUqNBDFNQ5CVJFe6eVnmLBh7ypKTh4tYf3ZheTU-hagc6BFHBw467NV6UuhGz-jo3ILmLvNRAbBeD0fVnvCQV6xLXVtHngd1Cb5mmUr8VS_vzi4ew/s1600/Capture.PNG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFW5ooglhXE2bfzRpLrPv__GTtPCcUqNBDFNQ5CVJFe6eVnmLBh7ypKTh4tYf3ZheTU-hagc6BFHBw467NV6UuhGz-jo3ILmLvNRAbBeD0fVnvCQV6xLXVtHngd1Cb5mmUr8VS_vzi4ew/s320/Capture.PNG" width="320" /></a>If you click on the loco selection icon in the middle-left flyout and then scroll through the list you should find the simply named "Railfan" entry as shown on this screen capture.<br />
<br />
Once selected, simply place it somewhere just as you would a normal locomotive. It looks like the cinematic camera icon.<br />
<br />
<br />
As you can see, it's pretty small, and if you try to place it in the same are as a track marker you likely won't be able to see it - so find somewhere clearly visible and it should place fine.<br />
<br />
Next, place a driver icon on it in the usual way.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOeNZ1FdCU7stu3rSVx5Jaa0XFmT7LcEvv_CbNG18L-i2xiN108pncsyuww2Oe3SEPrtRuyajCquNEHgJAQ7Psf-5KFyV90Z-eXd_bKrY3QCjN3QhhL7AISpm6w8xjlvMtVZpuWJKbNqA/s1600/railfan-3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOeNZ1FdCU7stu3rSVx5Jaa0XFmT7LcEvv_CbNG18L-i2xiN108pncsyuww2Oe3SEPrtRuyajCquNEHgJAQ7Psf-5KFyV90Z-eXd_bKrY3QCjN3QhhL7AISpm6w8xjlvMtVZpuWJKbNqA/s400/railfan-3.png" /></a>Click on the timetable icon in the top left flyout and then you can start setting the player side of things up, this is really where the framework for the Rail fan scenario will be created.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjde3f4Es3U4tXTr27x5kDU7m4dxx4HXGC_QE5YsTIm1pzxoOA6ZevrsD0U8vqUtwIKjk-Nlaj1o5JbykPwDuk9HRN6dBGTCjJGeyaTy3NYDcIK82Tp7MKbiNCuEQ11NieK2f3qtIY6PvY/s1600/railfan-4.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjde3f4Es3U4tXTr27x5kDU7m4dxx4HXGC_QE5YsTIm1pzxoOA6ZevrsD0U8vqUtwIKjk-Nlaj1o5JbykPwDuk9HRN6dBGTCjJGeyaTy3NYDcIK82Tp7MKbiNCuEQ11NieK2f3qtIY6PvY/s400/railfan-4.PNG" width="400" /></a>As shown in the image to the left, essentially you want to add three instructions.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
1. Trigger Instruction - this will be used to set up the LUA script that we write shortly. Put "start" in the first smaller text field, you'll find out what it does soon.<br />
<br />
2. Stop At - use this to tell the player train it needs to go somewhere, anywhere that's not near you will do, but it must be somewhere you <i>could</i> get to. The player train won't be moving so it's fine. Also keep it simple, add a new marker if necessary.<br />
<br />
3. Final Destination - it's the player train so it must have a Final Destination instruction, just make it the same as the marker you set for the Stop At instruction.<br />
<h2>
The LUA Script</h2>
Now that the player train is set up we need to set the LUA script up. If you're not a developer or haven't done any LUA scripting at all this might seem daunting, the good news is that it's really mostly a copy-paste task and you can re-use the same basic script over and over with almost no changes at all.<br />
<br />
While still within the timetable window, click on the Script icon on the toolbar at the top of the service instructions:<br />
<br />
<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_tG1YqpJxtl_2w-mRx_vC9Su7DIEprT7mVVi3DkpultfXoagZP1wE8cKi8BfHW-BNDbidcLz00wMmeXxsLMIXFEUzemqyu3epKQN2Kd08go625XStsXF4EWhRyElMrdTZChyphenhyphenVDomNFv0/s1600/railfan-5.png" imageanchor="1"><img border="0" height="30" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_tG1YqpJxtl_2w-mRx_vC9Su7DIEprT7mVVi3DkpultfXoagZP1wE8cKi8BfHW-BNDbidcLz00wMmeXxsLMIXFEUzemqyu3epKQN2Kd08go625XStsXF4EWhRyElMrdTZChyphenhyphenVDomNFv0/s400/railfan-5.png" width="400" /></a><br />
<br />
In the window that pops up, don't worry if it gives an error about not being able to read a file - we haven't created it yet. Click the Open Folder button and a Windows explorer application will open, pointing to the folder where the scenario data files are kept.<br />
<br />
Create a new text file in here called ScenarioScript.lua and open it in your favourite text editor - I use Notepad++ but there are many great editing tools out there that will do the job nicely, even Notepad will do in a pinch :)<br />
<br />
When you create the file, ensure that it does <i>not</i> retain the .txt extension. When you're done, in Explorer it should show up as a file of type "LUA file". If it still shows up as a file of type "Text file" then this is incorrect and means that internally in Windows it still thinks the file is ScenarioScript.lua.txt - even if all you can see is ScenarioScript.lua. Click the View menu and on there ensure "filename extensions" is ticked. If it isn't then when you tick it, you should see the full name of your file revealed and you can then rename it to fix it.<br />
<br />
Next i'm just going to paste the whole file in, and then we can talk about what it is actually doing:<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">-- true/false defn<br />FALSE = 0<br />TRUE = 1<br /><br />-- condition return values<br />CONDITION_NOT_YET_MET = 0<br />CONDITION_SUCCEEDED = 1<br />CONDITION_FAILED = 2<br /><br />-- Message types<br />MT_INFO = 0 -- large centre screen pop up<br />MT_ALERT = 1 -- top right alert message<br /><br />MSG_TOP = 1<br />MSG_VCENTRE = 2<br />MSG_BOTTOM = 4<br />MSG_LEFT = 8<br />MSG_CENTRE = 16<br />MSG_RIGHT = 32<br /><br />MSG_SMALL = 0<br />MSG_REG = 1<br />MSG_LRG = 2<br /><br />function OnEvent(event)<br /> return _G["OnEvent" .. event]();<br />end<br /><br />function TestCondition(condition)<br /> return _G["TestCondition" .. event]();<br />end<br /><br />function OnEventStart()<br /> SysCall("ScenarioManager:LockControls")<br /> SysCall("CameraManager:ActivateCamera", "startcamera", 0)<br /> SysCall("ScenarioManager:TriggerDeferredEvent", "WelcomeMessage", 17)<br />end<br /><br />function OnEventWelcomeMessage()<br /> SysCall("ScenarioManager:UnlockControls")<br /> SysCall("ScenarioManager:ShowInfoMessageExt", "Knebworth Trainspotting", "Wait, we stopped?!", 15, MSG_LEFT+MSG_TOP, MSG_SMALL, TRUE)<br /> SysCall("CameraManager:ActivateCamera", "FreeCamera", 0)<br /> SysCall("ScenarioManager:TriggerDeferredEvent", "End", 300)<br />end<br /><br />function OnEventEnd()<br /> SysCall("ScenarioManager:ShowInfoMessageExt", "Knebworth Trainspotting", "Time to go!", 15, MSG_LEFT+MSG_TOP, MSG_SMALL, TRUE)<br /> SysCall("ScenarioManager:TriggerDeferredEvent", "Complete", 0)<br />end<br /><br />function OnEventComplete()<br /> SysCall("ScenarioManager:TriggerScenarioComplete", "Finished!")<br />end</span></span><br />
<br />
The first block lists a selection of "constants" which are used to make the rest of the code a bit more readable. You shouldn't ever need to edit these constants but if you start getting more complex with your scripting you may wish to add more to them - you'll know it when you want to!<br />
<br />
The first two functions "OnEvent" and "TestCondition" set up a basic system that will make handling events more straight forward, you'll never need to edit these functions.<br />
<br />
After this is when we start to get to the bits that are specific to our Rail fan scenario.<br />
<br />
The function OnEventstart() is called by the game when our scenario starts. You'll recall earlier we set up a trigger instruction and put "start" in the field - this is where that happens. If you put "fred" in that field, then you'd need to rename this function "OnEventfred()" for it to work, whatever you put in that trigger field is what will end up being called in the script. For simplicity, i'd just leave it as "start".<br />
<br />
OnEventstart() locks the controls - you can choose to eliminate this line if you prefer, it just prevents the user from doing anything while you're introducing the scenario. The next thing it does is to activate a cinematic camera called "startcamera" - you can add cinematic cameras later following one of my other tutorials, I won't go in to details and repeat that tutorial again here. finally, it uses "TriggerDeferredEvent" to tell the script when to carry on - you should set this up so that it matches the time for your cinematic camera, if it lasts 25 seconds then put a "25" where there is a "17" in this line, it's that simple. If you get it too short it will simply cut the cinematic camera sequence short. Once this timeout expires it will call the next function - note the event is "WelcomeMessage" and therefore this leads us to the next function:<br />
<br />
OnEventWelcomeMessage() unlocks the controls (if you remove the lock, you can remove the unlock too of course), pops up a message introducing the scenario to the player, activates the "free" camera allowing the player to move freely around the route and then sets up a timer to end the scenario. This number is in seconds, the example above is 300, which is 5 minutes. Once this timeout expires it will fire a further event "End" - bringing us to:<br />
<br />
OnEventEnd() - this pops up a farewell message and then sets up another deferred event which will happen immediately. This is just to return control to the game and let it handle the pop-up box. The event is Complete:<br />
<br />
OnEventComplete() will then finally issue a TriggerScenarioComplete system call which will cause the game to pop up the "Scenario Complete!" message box and end the scenario successfully, giving the user their green tick for completing the scenario.<br />
<br />
Ok, so there's plenty to go through there and i'd recommend just reading through that description a couple more times until you understand it a bit better. Remember that as long as you use the same names in future scenarios for things like "start" and "startcamera" you can literally copy/paste this script in to each Rail fan scenario you use and then make just two changes to make the whole thing work.<br />
<br />
Change #1 - How long is your cinematic sequence? Set the time for that in OnEventstart(), it's set to 17 in the example above.<br />
<br />
Change #2 - How long is your scenario? Set the time for that in OnEventWelcomeMessage(), it's set to 300 (5 minutes) in the example above.<br />
<br />
Once the script is done, save it from your text editor and return to the game. Click the "Reload" and "Compile" buttons and that's all you need to do. If you find you need to make any adjustments just re-edit the file in your text editor, click the Script button on the toolbar in the timetable mode, click Reload and then click Compile.<br />
<h2>
Adding AI trains</h2>
<br />
Add AI trains in the nomal way!<br />
<br />
Well.. nearly. Remember the player train isn't moving, the player is naturally going to be sitting fairly well in the initial environment you set up for them. Start trains close(ish) to the station so that they go through at the speed you want and work your way out away from the station setting up trains to come in one after the other almost like a parade of trains in a simple presentation. The moment trains are out of visual sight aim to get them to disappear in to a portal as quickly as possible so that they're no longer in your way or consuming processing time on the computer. This will also make it easier to set multiple trains to go through as you can just throw them all in to a portal and not have to worry about whether one train is blocking another.<br />
<br />
<h2>
General Tips for a Rail Fan scenario</h2>
<br />
Don't make it too long or it gets boring, remember the absolute entirety of what is keeping the player interested is those AI trains. A 5 minute gap, however realistic it might be, can be interminably long with absolutely nothing else happening in the game. Could you set up something in a nearby yard perhaps with a shunter to keep things moving during quieter times? Perhaps beef up the timetable and make it slightly "hyper real" in order to keep it interesting.<br />
<br />
Find the right place to set your scenario up so that you can acheive the above, you might want to recreate trainspotting at your local station, but if there are really only a couple of trains an hour then it's just not going to hold enough interest for anyone but you. If you're just doing it for you, that's perfectly fine, but if you want to share it then you have to keep it interesting and put that above all else.<br />
<br />
Perhaps use pop-ups to suggest "go to the north end of the platform for a great view" - where should the player actually stand for a good view? Have you any tips on how best they can enjoy this scenario?<br />
<br />
Don't forget to get things like the scenario end functionality working, it's really nice to have a scenario actually tell you it is finished and then say "Scenario Complete" rather than leaving the player to wonder if this is just a quiet bit in the scenario or if it's all done now? The script above does this for you and while LUA script might be daunting I would encourage you to make the effort to get it working for you as it ups the professionalism of your rail fan scenarios considerably.<br />
<br />
Some of the more interesting scenarios i've seen actually end with an AI train coming in and stopping on the platform that the player is notionally supposed to be on, as the doors open the end message comes up saying that it's time to catch your train and leave - that's awesome!<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Cbad6Zsvtu2rckSWCEdRdbX0NAljoicF-cciovhOcwuYw8SLiaARvVUpX3SHZkg45HH6i6YJ90B_Ih_e6107CogBtoB6qm1VH-rTiCHvnsSy2W_Q8t57RtZc8LIR5jLpZp7X31NrGGs/s1600/railfan-6.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Cbad6Zsvtu2rckSWCEdRdbX0NAljoicF-cciovhOcwuYw8SLiaARvVUpX3SHZkg45HH6i6YJ90B_Ih_e6107CogBtoB6qm1VH-rTiCHvnsSy2W_Q8t57RtZc8LIR5jLpZp7X31NrGGs/s200/railfan-6.PNG" width="200" /></a>You can tune where the camera starts at the beginning of the scenario by moving the scenario marker around and placing it in the right place at the right angle. Experiment to understand how this works and get the best effect. Some have started it on the platform next to a soon-to-depart AI train (as if you just got off it), or even by a car in a car park.<br />
<br />
<br />
<br />
<br />
<br />
<br />
That's all you need to know, I look forward to seeing your awesome Rail Fan scenarios on Workshop!<br />
<br />
I hope this tutorial has been useful, I have a YouTube video to be uploaded soon which goes through all of these steps visually. Hopefully this blog entry has expanded on what I discussed in the live stream for those who were watching and will help you get the most out of it.Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com10tag:blogger.com,1999:blog-2198684265915171562.post-25901136507654591452015-11-22T17:01:00.000+00:002017-06-07T16:43:05.630+01:00So you want the TSL In-Game Background music? Here's how.I've had a lot of requests for the in-game background music that I use on TrainSimLive - it's a chilled instrumental version of the main theme tune and I love how it fits with the games menus etc, so i'm really happy to now be sharing the music and helping you install it.<br />
<br />
First note - this tutorial is <i>not</i> a general how-to on how to put your own music in the menus, I have already done all the "hard" work to make this a simple drop-in task so that everyone can do it, if you want to put your own music in then I simply direct you to google for it, I believe there are guides and tutorials put together by others.<br />
<br />
Second note - if you are not completely confident copying and pasting files around using Windows Explorer then this is probably not for you. I've tried to make this as simple as possible but it does involve opening up Windows Explorer doing a rename and pasting a file inside the games core content, if that fills you with chills then I'd suggest you probably should leave the game as is.<br />
<br />
Last note - if anything goes wrong with the game you can just do a verify local file cache to restore it.<br />
<br />
Ok, installation - the first thing you'll need is the file itself, here - click the link to download approx 43mb "DAV" file. DAV files are the audio file format used by Train Simulator and are a properietary variant of the WAV file format.<br />
<br />
<a href="http://trainsimlive.tv/wp-content/uploads/2016/06/UI_FrontEndLoop.zip" target="_blank">TSL In-Game Music Audio</a><br />
<br />
Once you've downloaded that it should be in your download folder somewhere - don't ask me where that is, it's different depending on how your machine is set up, what browser you're using and so forth. For me, they normally just appear in the "downloads" folder that is accessible directly from Windows Explorer. I'm using Chrome on Windows 10.<br />
<br />
Let's find the location the audio file needs to go, fire up Windows Explorer and go to this location if your installation of Train Simulator is in the default location. If it's not in the default location, i'll leave it as an exercise for you to figure out where it is now since I can't predict what you've done :)<br />
<br />
C:\Program Files (x86)\Steam\SteamApps\common\RailWorks\Assets\Kuju\RailSimulatorCore\Audio<br />
<br />
Inside here you should find a file called:<br />
<br />
UI_FrontEndLoop.dav<br />
<br />
Rename this to:<br />
<br />
ORIGINAL_UI_FrontEndLoop.dav<br />
<br />
That way you have a backup and can quickly swap it back if you wish.<br />
<br />
Now copy in the file you downloaded (which, conveniently has the right name already!) in to this folder.<br />
<br />
Start the game, sit back, and chill :)<br />
<br />
Enjoy!<br />
<br />
Full credit for the music goes to Duo Astral Plane who did both the main TrainSimLive theme tune music (with vocals) and this instrumental version for the in-game menus. You can find out more about their work at <a href="http://www.astralplanemusic.com/">http://www.astralplanemusic.com/</a> and I sincerely thank them for their work putting this together!<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com23tag:blogger.com,1999:blog-2198684265915171562.post-34909562084942716182015-04-26T17:25:00.002+01:002015-04-26T17:28:36.255+01:00Creating Consists via Blueprints for Quick Drive and AIThere are no less than three ways of making consists in TS2015!<br />
<br />
The first has been around since the beginning - simply place some vehicles on the track, go to the consist tool and then double click on the grey boxes above the vehicles, you can then give it a name and then re-use it later. It was a good way to short cut the process for a single scenario but didn't persist between routes so it was of limited use.<br />
<br />
Later, Train Simulator added an excellent built-in system for creating your own consists via a user interface in the menu system, which was a big step forwards however these consists still won't appear as AI trains in Quick Drive scenarios.<br />
<br />
So how exactly <i>do</i> you create those?<br />
<br />
The answer is in the third method - via blueprints. It's a bit tricky and certainly not easy, but if you can figure out how to create them you may find it preferable since it has some neat ways of re-using sequences over and over that can be a huge time saver... not to mention that any consist you create here can show up as AI in your Quick Drive scenarios too!<br />
<h2>
Folder Structure</h2>
To get started, let's go in to the railworks home folder via Windows Explorer. On most systems that install to the C: drive by default, that is:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">C:\Program Files (x86)\Steam\SteamApps\common\railworks</span><br />
<br />
Inside here, if you don't already have a "Source" folder, create one.<br />
<br />
Now you're going to need to decide on a "provider" folder name - this can be anything you like, whether its a nickname, organisation name or your name in some form. I've got for "MattPeddlesden".<br />
<br />
Underneath that you need to think of a product name - so i've just gone for "QDStuff" but you might want to take slightly more time and come up with something a bit better :)<br />
<br />
Lastly, we need to add a folder "PreLoad" (note the capital P and the capital L are important!) underneath that.<br />
<br />
When that's all done, you end up with this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgayQGG8nbs4Ai7udsfJa2URO6-Gqau4ua0hedXzb-PR8oIl_6zjVnNh4seJxJqZB9WOXnB89hGe7BxTpnsbD6vfn6L73FC9lpVzc_BnWm5JcVOsePItSXPkytXRX412yfeUwkUIqnj2gs/s1600/folders.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgayQGG8nbs4Ai7udsfJa2URO6-Gqau4ua0hedXzb-PR8oIl_6zjVnNh4seJxJqZB9WOXnB89hGe7BxTpnsbD6vfn6L73FC9lpVzc_BnWm5JcVOsePItSXPkytXRX412yfeUwkUIqnj2gs/s1600/folders.png" height="320" width="140" /></a></div>
Inside the RailWorks folder you'll find an executable application file called "BlueprintEditor2.exe" - double click it to run, and you'll get a screen something like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8UuqpIyL-NHPGrhMrhAENqtq5nB39SODIdmo6bRN809J1HNGGgqcPfeLuCvrbNHbWpPHymkMLxrhcmcsHw9RtvGgDHIA9gcNjRxM5C82iNo2Q44TP5T39Ai2UPfAOQiTpEv9piQLiCWE/s1600/bpe2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8UuqpIyL-NHPGrhMrhAENqtq5nB39SODIdmo6bRN809J1HNGGgqcPfeLuCvrbNHbWpPHymkMLxrhcmcsHw9RtvGgDHIA9gcNjRxM5C82iNo2Q44TP5T39Ai2UPfAOQiTpEv9piQLiCWE/s1600/bpe2.png" height="235" width="400" /></a></div>
On the top left pane, titled "Explorer" you can see the Source folder that you created, expand this a couple of times so that your new PreLoad folder is visible. This is where we'll be doing all our work!<br />
<br />
There are two types of consist blueprint within the game, one is the "Consist Blueprint" and these are the ones that result in new options being available in the game. Ultimately what you do has to end up in new consist blueprints or nothing new will happen. The other type is a "Consist Fragment Blueprint" and these are used to keep re-usable sequences, for example you could have a sequence of 40 wagons or a 12 passenger coaches and then later create a bunch of new Consist Blueprints by simply having a different loco plus the 12 coach fragment - two simple entries and an easy way to rapidly create some great variety.<br />
<br />
We're going to start by creating the Consist Blueprint, get them working and then we'll almost immediately see how Fragment's will be useful - so we'll get one of those created and use it.<br />
<h2>
Consist Blueprints</h2>
Right click on the PreLoad folder and select Add, followed by New Item.<br />
<br />
From the list that pops up, select "Blueprint" from the left side and "Consist Blueprint" from the right hand side.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLof8db2o8_0neaw_kFsfAaSi_EzMQGhoQ9CZ9rLsMB6SKtJwVICk4Z_AYoy9_XKRGcI-B8PsQ7TyppcbqEVmVht1r3EvkRR8bRujFm1Cq9uLvYfoKWQqNg5hj1NfGfHA-5o2qJrZzTqU/s1600/addbp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLof8db2o8_0neaw_kFsfAaSi_EzMQGhoQ9CZ9rLsMB6SKtJwVICk4Z_AYoy9_XKRGcI-B8PsQ7TyppcbqEVmVht1r3EvkRR8bRujFm1Cq9uLvYfoKWQqNg5hj1NfGfHA-5o2qJrZzTqU/s1600/addbp.png" height="320" width="400" /></a></div>
Name it something sensible so that you can easily find it later. The filename isn't used in-game but it is always useful to be able to work out what files contain what. Since i'm planning on just making this a quick test, i've just gone with a simple name, later on we'll delete this once we get the hang of it and start doing it properly!<br />
<br />
Click Ok and the new blueprint will be created.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjxIyJrOdvqb5yOXdhuiTaKMmqByNhmqeDM3U8jU_OMmStvoopkQ5-osOmhAuWzqjwNWasGxultyH47Nc9_mmdD56AZDVgwnMkhwnDnqaeOa7q6Rox-cklmteDo858PL8mH9f97stN9qQ/s1600/consistbp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjxIyJrOdvqb5yOXdhuiTaKMmqByNhmqeDM3U8jU_OMmStvoopkQ5-osOmhAuWzqjwNWasGxultyH47Nc9_mmdD56AZDVgwnMkhwnDnqaeOa7q6Rox-cklmteDo858PL8mH9f97stN9qQ/s1600/consistbp.png" height="298" width="400" /></a></div>
<br />
There are a number of different sections to this file so let's take them one at a time as an overview first, and then we'll drill in to them to get it set up.<br />
<br />
<u><b>Consist Entry</b></u><br />
This defines the actual vehicles that are in the consist. A consist does not have to contain any locomotives, but it must have at least one of something of course! If it has no locomotives, note there is a setting later that must be ticked to say it's not drivable.<br />
<br />
<u><b>Loco Name and Display Name</b></u><br />
In the Quick Drive selection screen you have a list of locomotives, and then when you click on one you have a list of consists. Let's look at a couple of screenshots that i've taken from the game, where I have highlighted the key sections.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2X2lJxDhWGtKuG1tN1p8L4b9FlYb2Dr_JBP1_fVelIt-mK6izDhmpdRDPMGXFR8-OAhozLoFSboklBF5FCs1F1nRRDK9kJi1mKHADB1_jf1X7LnH8k9aR2p48I6YhhjQSs-xYH9ArfmI/s1600/qd-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2X2lJxDhWGtKuG1tN1p8L4b9FlYb2Dr_JBP1_fVelIt-mK6izDhmpdRDPMGXFR8-OAhozLoFSboklBF5FCs1F1nRRDK9kJi1mKHADB1_jf1X7LnH8k9aR2p48I6YhhjQSs-xYH9ArfmI/s1600/qd-1.png" height="210" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiccISabQMlc2AzpKKgwkE5RT9Zm32NHBnpZ0LrRHhIcDTJ-RolMBeyIJod_CWgs4-llCu0G_iimVJqOE_Dc5CgH-O81gzDS5BCeOBpuk6T9QGdQgwQP-LtHkBwFeLdzXvGE_oMKcbw2fk/s1600/qd-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiccISabQMlc2AzpKKgwkE5RT9Zm32NHBnpZ0LrRHhIcDTJ-RolMBeyIJod_CWgs4-llCu0G_iimVJqOE_Dc5CgH-O81gzDS5BCeOBpuk6T9QGdQgwQP-LtHkBwFeLdzXvGE_oMKcbw2fk/s1600/qd-2.png" height="197" width="400" /></a></div>
<br />
Where i've highlighted in GREEN, this is the "Loco name" field. Where I have highlighted in RED, this is the "Display Name" field.<br />
<br />
If I create a new consist where the Loco Name is "A loco" then it will create a new entry in the grid in the first screenshot called "A loco". If I call it the same as something else, e.g. "GE U36 SBD" then my consist will end up being one of the selections inside that. What it means is that if you simply want more consist variety for a particular loco you can do so <i>without </i>polluting this already quite busy list with a lot of duplication.<br />
<br />
The Display Name field should be used to describe the specific consist (e.g. "2+1+1 with 150 car manifest" or "12 Coach Mark 3 Passenger Blue Greys". When someone clicks on the loco entry in the grid of the first shot, they get the list of consist display names that were found using that "loco name" (which again could be from lots of different places, it very handily merges them all in to one list). You may choose to duplicate the "loco name" component for clarity, or you may choose not to - personally I don't duplicate it. Once selected, the "display name" is shown in the right hand half of the current selected consist - top of the list of three boxes.<br />
<br />
It's a little confusing at first, but once you get the hang of the naming system you'll find it does exactly what it needs to.<br />
<br />
<u><b>Engine Type</b></u><br />
Straight forward - if this is a driveable consist what kind of lead loco is it? This is used for filtering.<br />
If it's not driveable, it doesn't matter what you set this to as it won't be offered in a filterable lists.<br />
<br />
<u><b>Era Start Year and Era End Year</b></u><br />
Note: There is currently a limitation in the game whereby if this doesn't include 2014 it won't be used, so for the time being I'd recommend leaving this at the defaults.<br />
The intention of these options is to say what rough years this consist would have operated in. When you define a Quick Drive scenario template, you can specify what year the template is relevant for and this will then influence which consists appear. This means you can set up a 1950's Quick Drive that only features era-appropriate stock for instance.<br />
<br />
<u><b>Driving Engine Index</b></u><br />
Where in the consist is the driving engine that the player will be sat in? Normally this is 0 - the lead locomotive. But if you have something like a Cab Forward or Big Boy then it might be further in the train. 0 is the front, 1 is the next rail vehicle in and so forth.<br />
<br />
<u><b>Valid Build and Drive Routes</b></u><br />
This lists all of the valid routes that this consist can appear on, it's a list of route GUID's, and this is the way that the sim prevents SD70M's from appearing on ECML London to Peterborough, for example. This does <i>not</i> affect the choice the player has, you might say this US freight consist is only good for a set of US routes but as a player, I can still choose to drive it on ECML London Peterborough if I wish - but I won't see it as AI.<br />
<br />
<u><b>Drivable Consist</b></u><br />
Tick this box if it is something the player can drive, untick it if it is simply a list of wagons. Consists that are just a variety of wagons and lengths of consists etc are great to have because they'll appear as "static consists" which will fill up your yards in Quick Drive's.<br />
<br />
<u><b>Consist Type</b></u><br />
This one is crucial, it defines what kind of consist this is and is what will make it available to appear as an AI train. Set this to something appropriate for the consist from the list. You could choose also to make use of the additional "custom" types, these allow you to specify additional types of consists that have not been catered for already. When someone sets up a Quick Drive scenario template they define the various AI start points and what the chances of a particular type of consist appearing, this is where you link particular types of consists to specific consists, locomotives and rolling stock.<br />
<br />
<u><b>Has Pantograph, 3rd Rail, 4th Rail</b></u><br />
These ones are used as an additional AI filter. When an AI spawner is set up in a Quick Drive template scenario, it has some tick boxes saying whether this spawner is suitable for rail vehicles that have pantographs, or 3rd/4th rail pickups. Simply tick these boxes to reflect the real requirements of this consist and the system will ensure you don't get overhead electric trains driving on 3rd rail electric routes (as long as it's all set up correctly of course :) ).<br />
<br />
<h2>
Setting Our First Consist Up</h2>
Now that we've looked at the options, let's get the first consist set up. For this consist i'm just going to drop in a CSX SD40-2 followed by two wagons, just to keep it simple and show a couple of extra steps off. We're also going to set it up so that it can appear as an AI train in Quick Drive scenarios.<br />
<br />
First we need to add the vehicles.<br />
<br />
Expand the "Consist Entry" section and click Add Element.<br />
<br />
Expand the new entries that appear so that you can see it completely, it looks like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFSzdXMecFACFOwNSgVrVKwggk53Ya7k40I-u718lCr06R6tiL0uh0diAY2IZcoqnGqZojBzjYwqZN3Q2iGVLtJnL2nD2YoiU8oK9gsV5favJpX2NEArdB7Yw4suNXR8QuDwJduUWO70/s1600/consist-entry.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFSzdXMecFACFOwNSgVrVKwggk53Ya7k40I-u718lCr06R6tiL0uh0diAY2IZcoqnGqZojBzjYwqZN3Q2iGVLtJnL2nD2YoiU8oK9gsV5favJpX2NEArdB7Yw4suNXR8QuDwJduUWO70/s1600/consist-entry.png" height="137" width="400" /></a></div>
The CSX SD40-2 is part of the New York New Haven route, so the Provider should be set to "RSC" and the Product to "NewYorkNewHaven". These are the same names as you would tick when adding the item to make it available in a regular scenario, and are the same as the folders under the Assets folder - take some time to have a browse and get familiar so that it will be easier to find what you're looking for.<br />
<br />
<b>This next step is where it gets a little hairy if you're not familiar with how locomotives are structured on your hard drive!</b><br />
<b><br /></b>
Assets, AP files and Other Complexities...<b><br /></b><br />
Before going any further I wanted to just outline how files are stored a little bit, just to give you a head start. Assuming the install for your TS2015 is here:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">C:\Program Files (x86)\Steam\SteamApps\common\railworks</span><br />
<br />
Then all the rail vehicles and other assets are stored here in the assets folder.<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">C:\Program Files (x86)\Steam\SteamApps\common\railworks\Assets </span><br />
<br />
Beneath that is the provider folder, then the product folder. So if what we're looking for is RSC and NewYorkNewHaven, then our path for its assets is:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">C:\Program Files (x86)\Steam\SteamApps\common\railworks\Assets\RSC\NewYorkNewHaven</span><br />
<br />
If you go there however you'll find just an AP file (and possibly a PAK file, but ignore that!). An AP file is basically the same as a ZIP file and can be opened in something like 7-zip. Opening it, you will find a further series of files and folders. If it's a route AP file (as this is) then you'll find quite a lot in there, if it's just a loco pack then there are fewer folders.<br />
<br />
Rail Vehicles are in the "RailVehicles" folder and from there the separation is usually fairly intuitive.<br />
<br />
<i><b>Continuing where we left off...</b></i><br />
<br />
The Blueprint ID is the pathname and filename of the blueprint for the rail vehicle we want to add. In this case the files are in an AP file - so open this with 7-zip (or your favourite ZIP explorer) and we find that the diesel locomotive we want can be found here inside the AP file:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">RailVehicles\Diesel\SD40-2\Default\Engine\</span><br />
<br />
Tip: a .ap file is just a renamed .zip file, so it should load fine in any ZIP tool. Personally I use 7-zip as it's fast and free - you can download it from www.7-zip.org<br />
<br />
Inside this folder are a bunch of files, the ones we are looking for are .bin files and in this case there are two - the one we want is sd40_2.bin - for the purposes of our consist, we will put "xml" instead of "bin" though.<br />
<br />
This means that the final blueprint ID will be:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">RailVehicles\Diesel\SD40-2\Default\Engine\sd40_2.xml</span><br />
<br />
Even though the file itself is actually a .bin file, the game will look for both the .xml and .bin files, but as the blueprint editor is intended to work with source files, it must have the xml file. If that doesn't make sense, don't worry, just go with it :)<br />
<br />
The last option "Flipped" will flip the vehicle around so that it faces the other way. We'll leave it as it is for now.<br />
<br />
Ok, so this is where we're at now:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfJwvGGm6feGQXDvPuz7q1CZQ6gpeI4ous_exMmE6VO1E8RCcTT6iIA34QfaQRYCZgfG8esFmXZXZVXpGpxiE6Jhz8mAMgl9oRMSlf9U8Txx_LOu1iPnYVMBv8R4x_fnqkWsSuHmbi2z4/s1600/loco.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfJwvGGm6feGQXDvPuz7q1CZQ6gpeI4ous_exMmE6VO1E8RCcTT6iIA34QfaQRYCZgfG8esFmXZXZVXpGpxiE6Jhz8mAMgl9oRMSlf9U8Txx_LOu1iPnYVMBv8R4x_fnqkWsSuHmbi2z4/s1600/loco.png" height="140" width="400" /></a></div>
<br />
At this point it's worth answering a couple of questions you might be thinking about...<br />
<br />
<b>Can I use vehicles from lots of different provider/product's?</b><br />
Yes, as many as you want, you can mix a "Marias Pass" loco with a "Miami West Palm Beach" wagon and a "New York New Haven" wagon if you want! Just remember that the more you add, the more the game will have to load, since it loads the entirety of a provider/product when it accesses any part of one.<br />
<br />
<b>Do I need to unpack the AP file?</b><br />
No, leave it exactly as it is.<br />
<br />
That's the first entry on the consist done. Let's add a couple of wagons - click the Add Element button again.<br />
<br />
We'll add a wagon from the same route just to make things easy, set up the same Provider and Product as before. Navigate back in to the AP file for New York New Haven and we can see that there are a number of wagon types, i'm going to go with the box car, so our blueprint folder is:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">RailVehicles\Freight\BoxCar\Default\Wagon\</span><br />
<br />
Inside here, there are a number of bin files, but two of them are the bogie definitions, leaving one which refers to the wagon itself. Don't forget to change "bin" to "xml" for the blueprint ID, meaning our Blueprint ID is therefore:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">RailVehicles\Freight\BoxCar\Default\Wagon\box_car.xml</span><br />
<br />
Let's see how our consist is looking now:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq79UgGBpiwyvad3lfUzho75Y_LRX9-xPbg-N9pEdwq1_uu1rDwM-rZwEVmM3YhCVBQLZkVElvhcCSpAvicGdAD6hgGiuLVAeGFOzZWkIzhWaaXQYJ7WC3RoWKvEQ8_QitWCkXy_lYlCA/s1600/consist-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq79UgGBpiwyvad3lfUzho75Y_LRX9-xPbg-N9pEdwq1_uu1rDwM-rZwEVmM3YhCVBQLZkVElvhcCSpAvicGdAD6hgGiuLVAeGFOzZWkIzhWaaXQYJ7WC3RoWKvEQ8_QitWCkXy_lYlCA/s1600/consist-2.png" height="253" width="400" /></a></div>
With everything you've just done, you can imagine setting up a 120 wagon consist is going to start getting hard work! Assuming you're repeating items however, there is a short cut to make it a bit easier so the second wagon we add is going to just be the same as the first.<br />
<br />
Click the Add Element button and expand everything out again, as if we were going to do it the same way we did the first one.<br />
<br />
Now right click on the "Consist Entry" header of the FIRST wagon we added and select Copy. Now right click on the "Consist Entry" header of the NEW entry we just added (the one that is currently blank) and select Paste. That's the second wagon done, much easier.<br />
<br />
Now that the rail vehicles themselves are done, let's go through the rest of the blueprint.<br />
<br />
<b>Loco name </b>- let's make it the same as the existing Sd40-2 so that it simply adds to the list, which means it needs to have a Loco Name of "EMD SD40-2" - it is again essential that capitalisation matches.<br />
<br />
<b>Display Name</b> - our consist is simply a couple of box cars so let's call it "2 Box cars".<br />
<br />
<b>Engine Type</b> - Diesel.<br />
<br />
I'll leave the era start and end years as they are.<br />
<br />
Driving Engine Index we will leave as 0.<br />
<br />
<u><b>Valid Build and Drive Routes</b></u><br />
For this, click the Add Element button and it will add a "Consist Valid Route" entry with a "Route GUID" entry. What you need to know now is what the GUID's are for the routes you want to add it to. I found an excellent post on the Steam Forums which lists all the routes (and many freeware routes) and their GUID's, you can find it here:<br />
<br />
<a href="http://forums.steampowered.com/forums/showthread.php?t=3257269">http://forums.steampowered.com/forums/showthread.php?t=3257269</a><br />
<br />
Simply paste one Route GUID in to the entry box to enable this consist to appear as AI on that route. Let's add New York New Haven.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkTtQKbwVFLDCY7-RHzj_IOvXvWH6OuH6P5thWKRB2z_VYRjKgi2Cx8Jg_6X1lLJV4rA4RzM_P8YWzwK5oM2qrN_ErxwMTd4MdZ2iUU2CFjhaXkKWy3hx_O66jRTWnOOvS_sIYm18Yf_k/s1600/valid-route-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkTtQKbwVFLDCY7-RHzj_IOvXvWH6OuH6P5thWKRB2z_VYRjKgi2Cx8Jg_6X1lLJV4rA4RzM_P8YWzwK5oM2qrN_ErxwMTd4MdZ2iUU2CFjhaXkKWy3hx_O66jRTWnOOvS_sIYm18Yf_k/s1600/valid-route-1.png" height="42" width="400" /></a></div>
And then click Add Element again, and add the GUID for Miami West Palm Beach, so we now end up with:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDGWxf2Bf-Fnzv1LZ4xilcbeOofp7Vsd0T7ZjyWVATfUvyf40vMdzPKtzlD-XORaycdoqLQtOKTLrBSbtivT31bBecM6t0ckPA6hCruZXiaHyCeOU5rlfYD0xI5A5IdPT2nKfGGby1T8w/s1600/valid-route-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDGWxf2Bf-Fnzv1LZ4xilcbeOofp7Vsd0T7ZjyWVATfUvyf40vMdzPKtzlD-XORaycdoqLQtOKTLrBSbtivT31bBecM6t0ckPA6hCruZXiaHyCeOU5rlfYD0xI5A5IdPT2nKfGGby1T8w/s1600/valid-route-2.png" height="95" width="400" /></a></div>
<br />
This means that our consist can now randomly appear as an AI consist on quick drives that happen on these two routes, but it won't appear on any others.<br />
<br />
<b>Drivable Consist</b> - this is drivable, so tick the box.<br />
<br />
<b>Consist Type</b> - there really isn't an ideal type in this box so i'm going to set it to Freight - Container. As I mentioned earlier, this relates to how the quick drives themselves are set up. You pick anything - this could be a "freight livestock" if you want, and then if you give "freight livestock" a chance of showing in the quick drive it will all simply work. Choosing a reasonably appropriate one just helps you create QD's that make sense and try to have the right trains in the right places. If you find there aren't any appropriate options then you can use one of the "custom" options but again, these are no good unless the QD itself offers a chance of the same ones appearing. If you're creating the consists AND the quick drives then that's ideal and you can create something really nice.<br />
<br />
I would recommend that if you create a quick drive, you should document the types of consists you've used and their chances of appearing, that'll help anyone making new consists to ensure that they use the right types.<br />
<br />
The last three settings relate to electric trains, if this was an ACS-64 then I would tick the "has pantograph" button but as it's a diesel, I will leave them all unticked.<br />
<br />
That's it - our first consist has been created.<br />
<br />
Press CTRL-S to save it (or go to the file menu and click Save).<br />
<br />
It's important to double check all of the entries you've typed in, the process of exporting will <i>not</i> check to make sure you have put the right paths in because to do that you need the full asset source.<br />
<br />
In the "Explorer" section where your new blueprint consist file is, right click on the file and select "Export" followed by "Export This Only". It's important to choose "Export This Only" because this option will not try to export anything else - and since we don't have the source for the locomotive and wagons that's a good thing! If you <i>do</i> have all the source because you're actually making the stock yourself then just export as normal and it will error check everything properly as it goes.<br />
<br />
Now let's go in to the game and test it!<br />
<br />
Once in the Quick Drive section, find the EMD SD40-2 entry and then see if your consist is present. If it is that's the first win. Select it and enter the quick drive. If it loads and then errors right at the end, it means one or more of the entries you've added for the blueprint id's or provider / products is incorrect - check it. You might get some help by enabling logging (detailed in an earlier blog post).<br />
<br />
Once all is working you should now be in the game driving the consist you just made!<br />
<br />
That's all you need to get started, you can now make any consist you like - but making a consist that has the same 120 wagons but one of 5 different loco's at the front would currently either mean duplicating that 120 wagons five times. Nightmare! This is where Consist Fragments come to the rescue in a big way!<br />
<br />
In the same way we created a Consist Blueprint, you can create a Consist Fragment blueprint. I would strongly suggest a naming convention on the filenames so that fragments are easily identifyable, you could also put them in a sub-folder. I would suggest a prefix like "F-" or "Fragment-" just to be clear.<br />
<br />
Inside the fragment blueprint is <i>just</i> the section of consist entries, so all those blueprint id's, providers, products etc and nothing else. You could make up a set of say 20 container wagons here or a 5 car passenger train (just the coaches).<br />
<br />
Having saved and exported the fragment you can now use it in the main Consist Blueprint - set the provider and product to <i>your</i> provider and product (e.g. MattPeddlesden and QDStuff for my test example here) and then the blueprint ID simply points to the fragment. There is, however, a nice easy way to do this!<br />
<br />
Open the Consist Blueprint you want to use the fragment in and add an element where the next wagon should be placed.<br />
<br />
Right click on the Fragment filename in the Explorer pane, select Copy.<br />
<br />
Now expand the blank consist entry and right click where it says "blueprint name" - and click Paste.<br />
<br />
The Blueprint editor is clever enough to know how to interpret the location of the blueprint you copied and fill in all the blanks for this consist entry! That's the fragment added.<br />
<br />
So if you defined say 10 coal cars, 10 auto racks, 15 low gons etc you could then add half a dozen different fragments and end up with a 100 car manifest train and still have a bunch of fragments you can chop and change around and re-use in other consists.<br />
<br />
The other really nice thing about this reusability is that if, later, you find a better coal car, you can simply open each fragment that uses it and swap in the new car - and all of the consists which use those fragments will automatically reflect the changes.<br />
<br />
It's been a long journey but we got to the end at last :)<br />
<br />
<h2>
In summary...</h2>
<h2>
</h2>
<ul>
<li>You need to create a consist using the Blueprint Editor.</li>
<li>You should create Consist Fragments for the commonly re-used portions.</li>
<li>You should create Consist Blueprints to actually define the final consists.</li>
<li>You can mix and match fragments and actual items of stock as much as you want.</li>
<li>You can pull in stock from lots of different provider/products if you want.</li>
<li>Set the consist type and valid routes to enable the consist to be seen in Quick Drive's as AI traffic.</li>
<li>Set the Loco Name of the consist to chose what loco name it shows up as when a player is picking from the list, and I'd recommend you try and add your consists to existing loco name entries so that the list does not get bloated.</li>
<li>Set the Display Name to represent what is unique about this consist, what actually is it.</li>
<li>You can set up consists with only freight cars / wagons / coaches if you want, make sure not to check the Drivable box for these, but make sure you do set the valid routes and consist type and then they should show up as static items placed in yards and so forth.</li>
<li>Do keep your own consist definitions in your own provider/product, it makes it easier for someone to update, remove etc than if you splat yours all over the main ones.</li>
</ul>
<br />
I look forward to seeing what you all do with this exciting feature :)<br />
<br />
If you missed my video on creating quick drive scenarios then you can find it here on YouTube:<br />
<br />
<a href="https://www.youtube.com/watch?v=uTSwEuWPZH8">https://www.youtube.com/watch?v=uTSwEuWPZH8</a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com7tag:blogger.com,1999:blog-2198684265915171562.post-36972608195566008842015-04-25T18:53:00.000+01:002015-04-25T18:53:03.649+01:00New Post Coming SoonJust a short entry to say that this blog has not been forgotten :)<br />
<br />
I recently did a tutorial on how to define your own Quick Drive scenario templates and there are a couple of topics that came out of it which are best served by a tutorial on here covering them in more detail.<br />
<br />
Once i've got something written i'll get it posted up - hopefully in the next couple of days.<br />
<br />
If there are topics you'd like to see covered then please do leave a comment and let me know, i'm struggling for things to say in the blog to be honest!<br />
Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com0tag:blogger.com,1999:blog-2198684265915171562.post-57003607526052280532015-02-22T21:10:00.001+00:002015-02-22T21:12:43.764+00:00TS2015 - Scenario Scripting in LUA Part 13 - Example ScriptI've had a couple of requests to put the entire script from the YouTube video tutorial up so that it can be reviewed and understood in its entirety - so without further delay, here it is!<br />
<br />
Note that I didn't use some of the techniques discussed here such as the _G[]() idea because the goal was to be quick and simple, but using this and the learnings in previous blog posts you should be able to use this in an effective way.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: #808030;">--</span> <span style="color: #0f4d75;">true</span><span style="color: #808030;">/</span><span style="color: #0f4d75;">false</span> defn
FALSE <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
TRUE <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
<span style="color: #808030;">--</span> condition <span style="color: maroon; font-weight: bold;">return</span> values
CONDITION_NOT_YET_MET <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
CONDITION_SUCCEEDED <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
CONDITION_FAILED <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span>
<span style="color: #808030;">--</span> Message types
MT_INFO <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
MT_ALERT <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
MSG_TOP <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
MSG_VCENTRE <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span>
MSG_BOTTOM <span style="color: #808030;">=</span> <span style="color: #008c00;">4</span>
MSG_LEFT <span style="color: #808030;">=</span> <span style="color: #008c00;">8</span>
MSG_CENTRE <span style="color: #808030;">=</span> <span style="color: #008c00;">16</span>
MSG_RIGHT <span style="color: #808030;">=</span> <span style="color: #008c00;">32</span>
MSG_SMALL <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
MSG_REG <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
MSG_LRG <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span>
<span style="color: maroon; font-weight: bold;">function</span> DisplayRecordedMessage<span style="color: #808030;">(</span> messageName <span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">RegisterRecordedMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">StartDisplay</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> messageName<span style="color: #808030;">,</span> <span style="color: maroon;"> </span></pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon;"> "</span><span style="color: #0000e6;">StopDisplay</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> messageName<span style="color: #808030;">,</span> <span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StartDisplayIntroText<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Title of the box</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;"> </span></pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon;"> "</span><span style="color: #0000e6;">intromessage.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> MSG_VCENTRE <span style="color: #808030;">+</span> MSG_CENTRE<span style="color: #808030;">,</span> MSG_REG<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StopDisplayIntroText<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StartDisplayMoving<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">You're off!</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> </pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon;"> "</span><span style="color: #0000e6;">moving.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> MSG_VCENTRE <span style="color: #808030;">+</span> MSG_CENTRE<span style="color: #808030;">,</span> MSG_REG<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StopDisplayMoving<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StartDisplayOverspeed1<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Too fast!</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> </pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon;"> "</span><span style="color: #0000e6;">overspeed1.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> MSG_VCENTRE <span style="color: #808030;">+</span> MSG_CENTRE<span style="color: #808030;">,</span> MSG_REG<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StopDisplayOverspeed1<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StartDisplayOverspeed2<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Final warning!</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> </pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon;"> "</span><span style="color: #0000e6;">overspeed2.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> MSG_VCENTRE <span style="color: #808030;">+</span> MSG_CENTRE<span style="color: #808030;">,</span> MSG_REG<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StopDisplayOverspeed2<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">introtext</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">IntroText</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">cinematic</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">CameraManager:ActivateCamera</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">introcinematic</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">cabcamera</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">CameraManager:ActivateCamera</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">CabCamera</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">startmovingcheck</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">StartMovingCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">startoverspeedcheck</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspeedCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck2</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspeedCondition2</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck3</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">StopCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspeedCondition3</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span>
end
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">StartMovingCondition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
speed <span style="color: #808030;">=</span> SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: green;">0.89</span><span style="color: #808030;">)</span> then
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Moving</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspeedCondition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: green;">8.904</span><span style="color: #808030;">)</span> then
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Overspeed1</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerDeferredEvent</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck2</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">5</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspeedCondition2</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: green;">8.904</span><span style="color: #808030;">)</span> then
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Overspeed2</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TrainBrakeController</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">VirtualThrottle</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">VirtualBrake</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:LockControls</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerDeferredEvent</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck3</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">5</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">StopCondition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;"><</span> <span style="color: green;">0.1</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:UnlockControls</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspeedCondition3</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: green;">8.904</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerScenarioFailure</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> </pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon;"> "</span><span style="color: #0000e6;">I give up, you're out of here! Too much fast driving! - DarknezzMonster</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end
end</pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"> </pre>
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com1tag:blogger.com,1999:blog-2198684265915171562.post-57040091563729154792015-02-21T21:50:00.003+00:002015-02-21T21:50:51.499+00:00TS2015 - Scenario Scripting in LUA Part 12 - VideoApologies for the long time between articles!<br />
<br />
In this article i'm going to show you how to incorporate videos in to your scenarios, done correctly they can really elevate your scenarios to a completely different level.<br />
<br />
The overall API for playing videos is almost identical to the API for playing sounds - so if you haven't yet read the previous blog post on the subject then now would be a great time to do that.<br />
<br />
At the top of your LUA script file you're going to want to drop in some definitions, just to make the rest of the script a bit easier to read:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">FULLSCREEN <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
FRONT_AND_CENTER <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
CALL <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span>
FALSE <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
TRUE <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
NO_CONTROLS <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
PLAYPAUSE <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
STOP <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span>
SEEK <span style="color: #808030;">=</span> <span style="color: #008c00;">4</span></pre>
<br />
Note: You may already have FALSE and TRUE defined, in which case there's no need to duplicate them here.<br />
<br />
The calls to handle videos are as follows:<br />
<br />
<b>Start a video playing:</b><br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:PlayVideoMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> FRONT_AND_CENTER<span style="color: #808030;">,</span> FALSE<span style="color: #808030;">,</span> NO_CONTROLS<span style="color: #808030;">,</span><span style="color: #008c00;">0</span><span style="color: #808030;">)</span></pre>
<br />
<b>Check to see if a video is playing:</b><br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:IsVideoMessagePlaying</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span></pre>
<br />
<b>Stop a video from playing:</b><br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:StopVideoMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span></pre>
<br />
Let's put it in a small example to provide some context:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventStart<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:PlayVideoMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> FULLSCREEN<span style="color: #808030;">,</span> FALSE<span style="color: #808030;">,</span> NO_CONTROLS<span style="color: #808030;">,</span><span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
end
</pre>
<br class="Apple-interchange-newline" />Here, i'm defining a trigger event "Start" (which should be initiated from a Trigger instruction in the scenario definition) and this will play a video, full screen.<br />
<br />
Just as with audio, the call to play a video will return immediately and let the video carry on playing in the background, that's the main reason for the "IsVideoMessagePlaying" and "StopVideoMessage" calls. I'll show them in action in a moment.<br />
<br />
<h2>
Parameters</h2>
There are a number of parameters to the PlayVideoMessage function that are interesting.<br />
<br />
After the Filename, the next one tells the game how and where you want the video displayed. The options are Fullscreen (0), Front and Center (1), and Video Call (2). I've defined some constants above so that it's easier to see what it is doing rather than passing plain numbers in (never do that, trust me!).<br />
<br />
Full Screen puts the video full screen, just as it says it will. It will also include an X in the top right that allows the player to abort playback of the video if they wish. In the screenshot below you can see it has completely filled the game screen.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkD7edMKjYFmmofY8f85lmkLZEFvSiyW53JBc0HgogUsjl2gufqeA-8L_gnvs2HbS8jahuSJ4WJDhYBftGidWvmSm7vbtnspU45agL91sXcPHT1jLxeu1bHmfX3tU1AZF6TM4zYx85KhU/s1600/vid1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkD7edMKjYFmmofY8f85lmkLZEFvSiyW53JBc0HgogUsjl2gufqeA-8L_gnvs2HbS8jahuSJ4WJDhYBftGidWvmSm7vbtnspU45agL91sXcPHT1jLxeu1bHmfX3tU1AZF6TM4zYx85KhU/s1600/vid1.png" height="237" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Full Screen Playback</td></tr>
</tbody></table>
Front and Center gives you a video playback which does not fill the screen and therefore allows some context from within the game to still be seen, but it is meant to still command the users attention fully and is of sufficient size it can still contain some detail.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJsvmxRjpCix6sj563xs_-zlHmlp0ZTWufv9bZYu2VwWdPI9uXbJETKTAPwcHmY-LrHKLeLXp_gcO6RUym-36yS0sVM5DeOdBMZ4ffo9DhZfhRVZ2Qh6N2IZR050m9ZwihQs5hFAJiyI/s1600/vid2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJsvmxRjpCix6sj563xs_-zlHmlp0ZTWufv9bZYu2VwWdPI9uXbJETKTAPwcHmY-LrHKLeLXp_gcO6RUym-36yS0sVM5DeOdBMZ4ffo9DhZfhRVZ2Qh6N2IZR050m9ZwihQs5hFAJiyI/s1600/vid2.png" height="236" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Front and Center Playback</td></tr>
</tbody></table>
Finally, Video Call is intended to show in the top left corner somewhat like if you had a video call going on with someone. You could use this for giving brief snippets of information, perhaps a news bulletin about something that's just happened (based on the players action) or something similar.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSp7n3SVBf16YpTA4bkx3Ew2ZIJ62wwPqnhOCyQxBPbgbm-SHvTbHPTaqlRZzw5an9M04Q4HfMqpZoerC_G_rlc-uG9DARhu_mwpbDnKA-dq-LUbHOHeoHAQOqjBmlFcUr8rkWJbToI3Q/s1600/vid3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSp7n3SVBf16YpTA4bkx3Ew2ZIJ62wwPqnhOCyQxBPbgbm-SHvTbHPTaqlRZzw5an9M04Q4HfMqpZoerC_G_rlc-uG9DARhu_mwpbDnKA-dq-LUbHOHeoHAQOqjBmlFcUr8rkWJbToI3Q/s1600/vid3.png" height="233" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Video Call Playback</td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<br />The next option is either TRUE (1) or FALSE (0) and this tells the game whether to pause in-game action or leave it running. If you're going to get in the way of the user such as a full screen video then I'd suggest pausing the game is a good idea. If it's a video call, then you probably don't want to pause it so that it feels more like something that is happening as part of the game play.<br />
<br />
The next option tells the game what kinds of controls to put on the video, do you want them to be able to pause it? skip to a particular bit? or stop it? There are four constants defined for this in my example. NO_CONTROLS (0) means show nothing, and is used in all the above three screenshot examples. PLAYPAUSE (1), STOP (2) and SEEK (4) add the relevant controls that you would expect. If you want to add more than one control, simply add them together like this:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:PlayVideoMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> FRONT_AND_CENTER<span style="color: #808030;">,</span> FALSE<span style="color: #808030;">,</span> <span style="color: #808030;">(</span>PLAYPAUSE<span style="color: #808030;">+</span>STOP<span style="color: #808030;">+</span>SEEK<span style="color: #808030;">)</span><span style="color: #808030;">,</span><span style="color: #008c00;">0</span><span style="color: #808030;">)</span></pre>
<br />
This would give you something like this::<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr3PN1dUP_ynn7zX7PyKIPGaOO8SBDk72-UeWGKuxhIF74QQSr9GHnYZ26KF7dz_v_qqrDjFwyAEfsRJBVfF1y6BAzw9CRNgLwneHNL3lVMa2mzY3semYE6mQqqxWbmKRT1tryTzOq9Ug/s1600/vid4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr3PN1dUP_ynn7zX7PyKIPGaOO8SBDk72-UeWGKuxhIF74QQSr9GHnYZ26KF7dz_v_qqrDjFwyAEfsRJBVfF1y6BAzw9CRNgLwneHNL3lVMa2mzY3semYE6mQqqxWbmKRT1tryTzOq9Ug/s1600/vid4.png" height="238" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Front and Center with all controls enabled along the bottom of the video</td></tr>
</tbody></table>
The final parameter is always a zero.<br />
<br />
<h2>
Format</h2>
The format of the video is an Ogg Vorbis ".ogv" video. You will need to create your video and export it in some format using your preferred editing tool and then if it won't export to Ogv then you'll need to use an additional step to convert it. As a reference example, the 2013_startup.ogv used as part of the start-up sequence of the game is in the correct format. You can use this to confirm you're calling the video correctly and it is working, and then drop your own video in afterwards. You can find this video in the data\videos folder.<br />
<br />
I use FFMpeg2Theora to do my conversions, available <a href="http://v2v.cc/~j/ffmpeg2theora/download.html" target="_blank">here</a>, once installed you can run it with this command line to get the right format:<br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<div style="background-color: white; color: #222222; font-size: 12.8px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
<div>
<span style="font-family: "Courier New",Courier,monospace;">ffmpeg2theora-0.29.exe myvideo.mp4 -vcodec libtheora -acodec libvorbis -v 10</span></div>
</div>
<br class="Apple-interchange-newline" />Here i've used an mp4 video because that's what I exported from my video editing suite, the result will go out as myvideo.ogv .<br />
<br />
The number at the end is the quality level, 10 is the maximum and reducing it can make a huge difference to the file size - as well as a huge difference to the quality. You will likely find that you can drop it down one or two settings before you even notice a difference and then it will drop off quickly. Find that right setting for your video that means you can get the file size down as far as possible while still remaining good quality.<br />
<br />
Place the videos in the localised language folder, the same as the audio files. So this would be in the "en" folder for English users, for example.<br />
<br />
<h2>
<span style="font-family: inherit;">Bigger Example</span></h2>
So here's a bigger example showing how you can use conditions to work out when to continue with the scenario.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventStart<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
videoPlaying <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:IsVideoMessagePlaying</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>videoPlaying <span style="color: #808030;">==</span> TRUE<span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:StopVideoMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:PlayVideoMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> FULLSCREEN<span style="color: #808030;">,</span> FALSE<span style="color: #808030;">,</span> NO_CONTROLS<span style="color: #808030;">,</span><span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">HasItStoppedYet</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventNextStep<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Get moving</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">moving.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">10</span><span style="color: #808030;">,</span> MSG_TOP <span style="color: #808030;">+</span> MSG_TOP<span style="color: #808030;">,</span> MSG_SMALL<span style="color: #808030;">,</span> TRUE<span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestConditionHasItStoppedYet<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
videoPlaying <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:IsVideoMessagePlaying</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">2013_startup.ogv</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>videoPlaying <span style="color: #808030;">==</span> FALSE<span style="color: #808030;">)</span> then
OnEventNextStep<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
end</pre>
<br />
This example is somewhat contrived to try and fit a few different things in to a small space but it should give you the "snippets" to do what you want to do.<br />
<br />
In the scenario instructions we're triggering "Start", which ultimately calls OnEventStart().<br />
In OnEventStart() we find out if the video is currently playing and if so, we stop it. It's highly unlikely that would be the case here, but normally you might find a place where there's a chance a video is already playing and now as a result of a more gameplay based event you need to play a video so the first thing you do is make sure that nothing else is playing first.<br />
We then kick off playing our video, and then finally start a condition check called HasItStoppedYet.<br />
<br />
The game will now play the video, and while the user is enjoying this video the game will now be calling TestConditionHasItStoppedYet over and over again, each time it will find out if the video is currently playing. At some point this is going to return FALSE because our video finally finished playing and when this happens we manually trigger another event NextStep.<br />
<br />
When OnEventNextStep runs, it displays a message to the user, presumably saying "right, now get moving". Had you just tried to put the message box up, it would have appeared over or simply interrupted the video. In this way, you remain fully in control of when things are presented to the user.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com4tag:blogger.com,1999:blog-2198684265915171562.post-15891036145646445632015-02-17T00:13:00.004+00:002015-02-17T19:44:09.426+00:00TS2015 - Scenario Scripting in LUA Part 11 - AudioAudio is a really great way to kick your scenarios up a notch, you could use it to play some instructions for the user or to have scenario specific audio playing such as station announcements or other such things. It's up to you to record the audio though of course!<br />
<br />
In LUA, managing Audio is done through three commands:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:PlayDialogueSound</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">test.wav</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:StopDialogSound</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">test.wav</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:IsDialogSoundPlaying</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">test.wav</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span></pre>
<br />
PlayDialogSound will begin playing the audio, it returns immediately so your script can continue doing things while the audio is playing.<br />
<br />
This is great because it means you can get on and do other things, let the player carry on driving and so forth however if you want to play something straight afterwards, or if you want to play something new then it's good to know if something is already still playing.<br />
<br />
IsDialogSoundPlaying will return "TRUE" if the audio is playing, and then you can issue a StopDialogSound to stop it playing.<br />
<br />
You must always stop an audio file playing before you start another one, or the new one is simply ignored.<br />
<br />
You can use this in a number of ways - when you arrive at a station perhaps an audio file plays something that has had suitable echo applied which sounds like a station announcement. You could even work out how late the player is and play "sorry for the late arrival of this train" if late, or "the on-time service on platform 2..." if they're reasonably on time.<br />
<br />
Using the functions you can even chain things together to be a little more dynamic, for example, let's say that you want to read out the current speed at some point - you would work out what files you're going to play, e.g. "fifty.wav" and "six.wav", then you would play the first one, use a condition to wait for it to finish (ie. the condition would keep calling IsDialogSoundPlaying(fifty.wav) ) - and then kick off "six.wav" afterwards. That way you can end up with some that says "you went through the checkpoint at... fifty...six...miles per hour". This is basically the same way that telephone systems read out things like "you have...fifty...six... new voice mails".<br />
<br />
<b>So, where do you place the files?</b><br />
<br />
Remember back when I covered where you place HTML files? It's exactly the same. They go in a localised folder name, so english sound files go in an "En" folder, that way the right sounds will be played depending on the preferred language of the person playing the scenario!<br />
<br />
It's simple, it's easy to use, and you can use it to great effect in your scenarios!<br />
<br />
<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com3tag:blogger.com,1999:blog-2198684265915171562.post-51238704464799064932015-02-15T17:09:00.000+00:002015-02-15T17:09:45.088+00:00TS2015 - Scenario Scripting in LUA Part 10 - Dynamic WeatherI'm going to split this topic in to two bits, first i'm going to cover how you actually make use of extended weather blueprints and then second i'll talk about how to actually make those blueprints. That initially might sound like the wrong way around, however since there are extended weather blueprints already provided in some route packages you could use those in scenarios without having to think about making new weather blueprints at all, easier but less flexible.<br />
<h2>
Using Extended Weather Blueprints</h2>
<br />
I'm going to refer to the Extended Weather Blueprint that is supplied with Pacific Surfliner in this example, so if you have that route then enable its assets for the scenario (the same way you would if you wanted to use a loco from that pack). If you don't have Pacific Surfliner then you will likely have to skip to the next section about creating your own Extended Weather Blueprint.<br />
<br />
In order to use this Extended Weather Blueprint, having enabled it, we must then tell the scenario specifically to use it. You can only point a scenario to one single Extended Weather Blueprint.<br />
<br />
When you first edit a scenario you can see the scenario properties (such as title, time of day, season etc) on the top right fly-out. At the top of this, you will see a picture which looks like some gears, this is the option that takes you to more advanced settings, click it. <br />
<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
This shows the next "tab" - to return to the normal one, click the orange train icon.<br />
<br />
From this tab you can use the drop-down box to select from the available Extended Weather Blueprints - in this case, I'm seeing the two that Pacific Surfliner contains.<br />
<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
Within an Extended Weather Blueprint there are defined a number of "Chains" which define a sequence of weather patterns to apply, each Chain has a name, and it is this chain that the LUA script must activate.<br />
<br />
There are three weather chains defined in the Pacific Surfliner weather pattern: <br />
<ul>
<li>FirstChain</li>
<li>SecondChain</li>
<li>FinalStorm</li>
</ul>
<br />
Within our LUA script we simply need to tell the game to start one of these sequences, as follows:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">WeatherController:SetCurrentWeatherEventChain</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">FirstChain</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span></pre>
<br />
This will cause the weather sequence defined by this chain to immediately start executing, this could cause fog to change, the sky colour to change, rain to start or change intensity, flashes in the sky, it can even place textures in the world to act as lightning bolts or rainbows.<br />
<h2>
Creating Extended Weather Blueprints</h2>
<br />
To create these blueprints you will need to set up a source folder for your assets if you do not already have one. Within the Train Simulator 2015 home directory, you need to create a Source folder along with another folder for the "Provider" name and another for the "Product" name. For example, Provider might be your name or some handle you go by online. Product could just be "ScenarioAssets". Beneath there, create a Weather folder, and inside <i>that</i> create an Audio folder.<br />
<br />
When you're done, it should look like this:<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
Note I've used "MattPeddlesden" as my "Provider" and "ScenarioSupport" as my "Product". If you're building this as part of a bigger pre-existing route or loco pack then you can of course just drop these assets right in there rather than creating something new.<br />
<br />
From the RailWorks home directory, run BlueprintEditor2.exe and you will see something similar to this:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=2198684265915171562" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" height="400" src="data:image/png;base64,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" style="cursor: move;" width="400" /></a></div>
<br />
<br />
From here, we can start creating the blueprint.<br />
<br />
Right click on the "Weather" folder, select "Add" and then "New Item".<br />
<br />
From the dialog that pops up:<br />
<br />
<img alt="" src="data:image/png;base64,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5adS+an0qkvZNVccP3nquX37R7d86cSp06+/9e7YFbfd/f1HFxb/8uVvPZzbegsx/sjmG7ObbvjN7/9w+Mifhzde/977H75+cC47Nb3zu39fLBbPnD2fWX81u+aKYydO3r/7R4ncusTo2kRuXWp841U3ffX8hU8f/C9PjGy+6Wu7fryw+Jdb79k9uuVLo5cWjp88/frBd7JT08Mbrz9+8vRzv9ifnbr+N79/s1gsPveL/cMbt7/3pw+KxeJrb749uObKJ//1uYWFxetu3hEZyIUSg/5I3OMP9Xv97n6P293vcrub/WsDzaSy2e3OktljQ6GhCWZs0+orb/njB0fJouGPHxxdfeUtzNim0NCEJ8aZ3e6saHb5TASzOwGgcblcLrfL3e/2+DyBsC+SCCUz0aF8YsWG+T++/9of/iM7NT2y+abf/P4PHxz9eHTLl0YuLRx6/8jrB98Z3XLz6NZbcpd9+bevv/XB0f+74vKv/PTfXjxz9tzoli9lN904PDV91/0/XFhcvPGOb6WI2cc3pvKb2MnLj5849dy+/SOXFr72wD8sLP7ly9/+4d1/+4/kwoorbjtx6sy/vfhSbusto1tu/uId950+c+6Wb/ztUz/b98HRj0e33PzUcy/Mvff+6TPnvvT17935N7vPnD2Xyk8lcusTuXXx0XWp8Y2lNft/eWJk801ff+AfFhb/cus3/2506y3k8i33PESewlM/23f46MfZTTeSg0d20w3DU9P/vPffFxYXv/S1+wfXfeHKm756/sKF+77/wwi7Ihgf9IXjHn/I7fG53P0ul9vpcjX71waaiQazMxli9tFN15PVOlm5j266vmR2JlO92eUzEczuAIDG6XQ6XU6X2+3x9ftD3nA8mBiKDI5vve4WPlfhefAffjJyaeH4ydPPvfDr0S035y67dXTrrcTso1tv/e1rBz84+vHIpYXsphuHN15/570PLywu3nDHN5P5qcSKDYkVG5Jjn0+t3Hz8xKmf/fuvhjden91806HDRz84+n9La/Zv//CLd+668OmCfKdk9X3LPbsPHT76/UeePPT+kef27X/p1Td+/8ZbyfxUIreeGVkTH12bWLHh8unbz1/4dNff7xmemt75vR8tLP7l1m/uHt1y80+fe0FS9vTZc7zZh6emhzdef9d9Pzh95tzQ+qvZNVdeceOO8xcu3PvgD8Kc2fv9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" /><br />
<br />
Select "Blueprint" then "Weather pattern extension blueprint" and enter a sensible name for the file, it must end with ".xml". Click OK.<br />
<br />
It will now load the blank blueprint in ready for you to edit it.<br />
<br />
The blueprint is split in to a number of sections. Before we go any further, enter something in to the "Display Name" field. I've entered "MyCustomWeatherPattern".<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
As with any design process, the first place to start is with a pencil and paper. What do we want this to do? We can set up weather chains that do multiple things one after the other, or we can split them out in to their own chains and call them up as we want. For this tutorial, let's make it four separate chains that each do one thing. I'll leave it to you to get creative!<br />
<br />
Chain 1 "<b>Rain</b>" - Light rain<br />
Chain 2 "<b>Foggy Rain</b>" - Step 2: Light rain + Close fog<br />
Chain 3 "<b>Foggy Downpour</b>" - Step 3: Heavy rain + Close fog<br />
<br />
If you want things to happen in specific locations (e.g. start raining just at the time when you have the heaviest load on the steepest track perhaps!) then set up chains that you can start at specific locations via triggered events. If you want sequences that happen over a period of fixed time, you can set up chains to do multiple things in sequence and then simply trigger it at an appropriate point in the script, so you really do have a lot of flexibility.<br />
<br />
We need to attack this problem by breaking it down in to component parts defined by the blueprint, which means we need to define the clouds and the precipitation separately, then tie them together in a "weather type" (which adds more options on top) and then assemble chains that the LUA script can call.<br />
<br />
<h3>
Clouds</h3>
<img alt="" src="data:image/png;base64,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" /><br />
<br />
Set the name to something appropriate, we're going to just call this one "thick clouds".<br />
<br />
When a route is set up, the route designer will set up four different sky dome textures and using the values in "Cloud Description" you can choose which ones will be shown by setting them to 1 or 0.<br />
<br />
The Colour Darkening Intensity allows you to make noticeable changes to the ambient lighting, particularly useful during a heavy storm where you might want to set it to 1.5 or even 2, at this point headlights become more visible and can provide a much more noticeable environmental change.<br />
<br />
My example weather blueprint i've set up three cloud types:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQsb33VmgpnVX6RKccdLJil8C9gkhPaEr2XSrxMAZuHS16LD2SHWbRUyoFGppNGsIKcE7NSxh4dbhqe8P3LOfVRbkOAhcLV1k1NK8EnPt0VR-7YEubPp84H_wYRMSWS9zSkgoy0h3cpFw/s1600/Untitled+picture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQsb33VmgpnVX6RKccdLJil8C9gkhPaEr2XSrxMAZuHS16LD2SHWbRUyoFGppNGsIKcE7NSxh4dbhqe8P3LOfVRbkOAhcLV1k1NK8EnPt0VR-7YEubPp84H_wYRMSWS9zSkgoy0h3cpFw/s1600/Untitled+picture.png" height="316" width="320" /></a></div>
<br />
<br />
<br />
<br />
"Thick Clouds" will be our normal sky, we'll then change to "Storm Clouds" for when it's raining, which will also dark the world, and then "Dark Storm Clouds" for when the rain really kicks in to high gear.<br />
<br />
<h3>
Precipitation</h3>
Precipitation will let you set up a number of different things including the textures for the rain drops, snow flakes, or whatever else you want to fall from the sky. It is only an ALPHA texture however so I think you'll have problems trying to make cats and dogs actually fall from the sky!<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSSYjptILXdHtB7Nan0tM_ByklhgdzcxiL4jS1RS629fRizwrClnhk-gdNpJ-Imdtxm3vFo5DyLOnR9ssV-4cM4pmrRd2dYZrRkxBePJxNp02LIQvQVruvj0ogGizlw4_XFnMR6-PbB48/s1600/split_raindrop_black.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSSYjptILXdHtB7Nan0tM_ByklhgdzcxiL4jS1RS629fRizwrClnhk-gdNpJ-Imdtxm3vFo5DyLOnR9ssV-4cM4pmrRd2dYZrRkxBePJxNp02LIQvQVruvj0ogGizlw4_XFnMR6-PbB48/s1600/split_raindrop_black.png" /></a><span style="background-color: black;"></span>You will need to create a small texture for the rain drop using your favouroute paint application (I use Paint.NET) , 64x64 pixels in size. The "split raindrop" used in many weather patterns, looks something like this - the link to download the file is <a href="http://www.uktrainsim.com/tsl-blog/split_raindrop.png" target="_blank">here </a>and then use a tool like "RWAceTool" (available from many sites online including UKTrainSim here - <a href="http://members.uktrainsim.com/filelib-info.php?form_fileid=21636" target="_blank">RWAceTool on UKTS</a><span style="background-color: black;"></span>. Note that i've made the texture show up here with a black background since with only alpha transparency, it would otherwise be rather hard to see.<br />
<br />
This texture must be an ACE file and it must be placed in the Weather folder. From here, we can start using it.<br />
<br />
Here's an example of one set-up of the precipitation, you can tweak values such as "alpha top", "alpha bottom" and "particle stream multiplier" to affect how the rain looks - generally, bigger numbers mean "more".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrwX1sp-ECanxhyNng48s55KZIHwxMcmt2ehV5iIRzP7d4Scv8q72ydL4C390bKFL1LnnBu01iB3BVH5ivFCRvWnlfH0WtmSvZn-WKv8bFrznZmbumb2IaAkP-GwI_S6HI_OzYIV8Jg7o/s1600/precipitation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrwX1sp-ECanxhyNng48s55KZIHwxMcmt2ehV5iIRzP7d4Scv8q72ydL4C390bKFL1LnnBu01iB3BVH5ivFCRvWnlfH0WtmSvZn-WKv8bFrznZmbumb2IaAkP-GwI_S6HI_OzYIV8Jg7o/s1600/precipitation.png" height="263" width="320" /></a></div>
I defined one called "intenserain" and one called "lightrain" - the only difference with "lightrain" is that the particle streak multiplier is 3, and the alpha bottom is 40. <br />
<br />
You can also see above where (and how) the raindrop texture is shown.<br />
<br />
<h3>
Weather Type</h3>
<br />
Now that we have our clouds and precipitation, we need to set up some weather types. There are essentially three different weather types that i'm going to define in this example (of course you can do however many you wish!) - but in order to make it work the way I want, I actually need to double some of them up, i'll explain why as we go.<br />
<br />
Whether you need to double up on your weather types depends on whether you want to have weather changes script-controlled, or if you just want to kick off a timed sequence from the script. If it's fully script controlled, you need to essentially have "Start" and "Continue" weather types with a couple of small changes, if it's all done within a single chain then you can keep things simpler.<br />
<br />
I'm going to be showing the more complex case, where it's entirely script controlled, so simply note that you can cut some steps out if you put all your weather changes in one chain.<br />
<br />
In our weather types, the three main types we want to define are:<br />
<ul>
<li>Rain</li>
<li>FoggyRain</li>
<li>FoggyDownpour</li>
</ul>
Add an element to the Weather section. Below is how I set up my "Rain" weather type.<br />
<br />
<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
So what is this defining?<br />
<br />
You can set up wind direction and speed, which will affect smoke particle effects. You will refer to the precipitation entries you set up previously, and then say how much rain (0.1 is light, 1.0 is heavy), and how fast the rain is travelling. The Glass Weather Boost we'll see in a moment, but basically this says whether there's more rain hitting the windscreen to create a much more intense effect.<br />
<br />
You can also set up fog - we'll do that next too.<br />
<br />
Blend times i'll cover in a moment as there are numerous blend times to consider in order to set things up correctly.<br />
<br />
This is also where you set up the reference the cloud types you configured earlier.<br />
<br />
The last parameter "audio" we'll look at in a future tutorial, but essentially if you want lightning cracks and thunder (Or indeed any other audio) then this is where you tell the weather blueprint how to access the audio blueprint that has the sound set-up in it.<br />
<br />
So that's a simple example which hs no fog and sets up some light rain. Let's look at the next one, which adds fog:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9h9QzYQk1IRuR9SPNPhtgFduyTE2ZMX1NqB-I9H_pLkGTFVb0Uu61M0Mjhk4_UsU5j1MZMBu6HJHYMqYHy7ydmUr2acnYMqwkbG3yxYfggOBzaYmd_6kB9uHGPCbot-Xh4_LiKGasC4I/s1600/foggyrain.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9h9QzYQk1IRuR9SPNPhtgFduyTE2ZMX1NqB-I9H_pLkGTFVb0Uu61M0Mjhk4_UsU5j1MZMBu6HJHYMqYHy7ydmUr2acnYMqwkbG3yxYfggOBzaYmd_6kB9uHGPCbot-Xh4_LiKGasC4I/s1600/foggyrain.png" height="235" width="400" /></a></div>
<br />
This example pushes up the precipitation density a little, basically making it rain a bit harder outside the train. This time we also tick the "fog override" box and set up some settings which control what colour the fog is, how transparent it is, how far away does it start and when does it end. I've also changed the sky dome so that it will use a different cloud formation.<br />
<br />
Lastly, let's make it rain really heavily:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwjN-DEi7XyxczBqp0fhoSwEUnz4s5qMK7xOaK41dZyP_qafgsN-mir06ENh808NAQTb3Blg3Eo8lpRkqxCcmX-YMe3o5_UGtgy9HnxeAyUgWDAGnWHo_fczj-UBQnLABNiyLGujmqCtE/s1600/foggydownpour.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwjN-DEi7XyxczBqp0fhoSwEUnz4s5qMK7xOaK41dZyP_qafgsN-mir06ENh808NAQTb3Blg3Eo8lpRkqxCcmX-YMe3o5_UGtgy9HnxeAyUgWDAGnWHo_fczj-UBQnLABNiyLGujmqCtE/s1600/foggydownpour.png" height="235" width="400" /></a></div>
In this example you can see that the fog is similar, but i've drawn it in closer. I've also set the precipitation density to its maximum value of 1, increase the speed of it, and boosted the glass weather effect. At this point, most wipers will not be able to even remotely keep up with the rain, it's really quite unpleasant!<br />
<br />
So that's the main three weather types.<br />
<br />
The other three weather types i've defined are used for merging between them, they are identical but they have got a "blend in time" of 0 minutes, making them instant. In the next section, where we finally set up the triggered event chains, i'll cover why we need these and how all the blend times work.<br />
<h2>
Triggered Weather Event Chains</h2>
Now that we've set up all the resources for the weather patterns, it's time to link them together.<br />
<br />
In the Triggered Weather Event Chain section, click Add Element.<br />
<br />
I'm going to start the sequence off by just making it light rain, so the first chain will be called "Rain" and will start the "Rain" weather type, as follows:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfLXRL1_Dun2YryU832Vocmp4C9DVMPpTVlynvtWBxq_GXMG_4lEViyRbGT4qVaBNRSZbyD_xnqkyDo6UyH8oSyhyphenhyphenEtIUEGRfu53sxVP8bQNQcA4_A8kInZHdAbkoaWZ-s7uHb3-Vy0-A/s1600/chain-weather.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfLXRL1_Dun2YryU832Vocmp4C9DVMPpTVlynvtWBxq_GXMG_4lEViyRbGT4qVaBNRSZbyD_xnqkyDo6UyH8oSyhyphenhyphenEtIUEGRfu53sxVP8bQNQcA4_A8kInZHdAbkoaWZ-s7uHb3-Vy0-A/s1600/chain-weather.png" height="181" width="400" /></a></div>
<br />
The "Name" is the name that we'll reference in the LUA script. Loop mode is set up to be "Hold end" which should keep it going after the chain finishes - though i've had mixed results with this, which is why the duration of the weather type event is set to 999 minutes. Inside the chain, you then set up a sequence of weather types - in my case i've just put one, but if you wanted to put a longer sequence of timed events together this is where you do it, just keep adding events and noting how long each one should last.<br />
<br />
The blend out time is set to a very small number, let's look at the next chain and then we'll see how you get from chain to the next.<br />
<br />
In the scenario set-up, i've set it such that when you go over a waypoint somewhere down the line it simply causes the next event to occur, this means i've got complete control over the weather happening at the right point in the scenario, so if I take a longer or shorter time to get to that point, it will still always start raining (or whatever) once I go past it. This may or may not be useful - if you want specifically to have just a timed sequence of weather that means that the player is encouraged to get a move on to ensure they're off a hill before a storm starts, then you would just put everything in a single timed chain. If you want to ensure that they always get a storm when they hit a hill, to make climbing the hill more challenging, then you want scripted control.<br />
<br />
So let's take a look at the next sequence:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhduo_nxTM7Qjv3QWeFtB4-rlL740jalyBgDmtlU6NuWXlPIgIx7yPN9U7Cv50qExO5oY4X69_ou9QdGn0ad-KbbbERgpYe5eVXQuPOBA5Nu67tFv-4XDEC2fdvA_g1g4vft4fcFjc3nA4/s1600/foggyrain-type.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhduo_nxTM7Qjv3QWeFtB4-rlL740jalyBgDmtlU6NuWXlPIgIx7yPN9U7Cv50qExO5oY4X69_ou9QdGn0ad-KbbbERgpYe5eVXQuPOBA5Nu67tFv-4XDEC2fdvA_g1g4vft4fcFjc3nA4/s1600/foggyrain-type.png" height="213" width="400" /></a></div>
The main difference here is that we have TWO weather types in this sequence, so now we can talk about how blending works between the sequences.<br />
<br />
When you kick a weather sequence off using a LUA script command, it will "blend in" to the first weather type, and then remain there until that weather types "duration" is expired. At that point, it will "blend in" to the next weather type and so forth. Once it runs out of weather types it will refer to "loop" mode to find out what to do next. It will always blend from the state it's in, to the next one. If it's set to "stop" then it will take "blend out" minutes to then go back to the scenario standard weather pattern.<br />
<br />
If a weather chain is currently running when you tell it to start another one, it will take "blend out" minutes to blend the existing weather chain out before beginning the next one.<br />
<br />
This presents us with a big problem if we are in the middle of a foggy thunderstorm and then we switch to the next weather chain and it wants to then gently take us out of the thunderstorm - because the first thing that happens is the game will blend it out to whatever the default weather is and then blend back in to the new weather. In some cases this might be exactly what you're looking for, but in my case it wasn't - and that's why I had to add some extra weather types.<br />
<br />
So we started the scenario with a nice sunny day, the we started "Rain" and over the course of a minute or so it started raining. Now we've hit the next marker and we want to go from "rain" to "foggyrain" without going back to "sunny". We set the "blend out time" of "rain" to be extremely short - so it will go back to sunny instantly, then the "Rain2" blueprint has a 0 minutes so it will instantly go back to raining again, which will last for about 6 seconds before it then begins a gentle fade over a minute or so towards foggy rain. This isn't ideal, it means that if you're looking, you'll notice a very tiny flash as the weather system goes back to sunny and then back to raining, however this can just as easily look like a lightning flash too - so I leave it to you to creatively decide whether you like that approach or not.<br />
<br />
Let's look at the next chain:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxYSxf0J6FIZIx1CFCUobn9wN4G51YWJTUD6JLGNgCkhaw5kjghbhV3BWPGmt_Q5cHnGSxznXojTCSCCdHGrj5tbtZPM6kG2qq0ItE8Syvy54VkYRSL_3kE5U8ZQvECcv6-G7qd276qbg/s1600/chain-downpour.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxYSxf0J6FIZIx1CFCUobn9wN4G51YWJTUD6JLGNgCkhaw5kjghbhV3BWPGmt_Q5cHnGSxznXojTCSCCdHGrj5tbtZPM6kG2qq0ItE8Syvy54VkYRSL_3kE5U8ZQvECcv6-G7qd276qbg/s1600/chain-downpour.png" height="218" width="400" /></a></div>
In this sequence we follow the same pattern, transitioning from Foggy Rain to Foggy Downpour using the same sequence of two chains.<br />
<br />
The final chain, then, drops us back to Raining and then fades back to the sunny weather:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmbOgEhwdwcr3d3-6h2LvL_9mhycVuKS5CHXqb08Ydbzkz88P8ptUBdnA3-3D1b8GVaYVmK840n3gYWCtJoq0S2sRfkx9Qux-sjmr7cxCbxuX93LS2kl163sYt0vp3fXZa7wXkHHM3ZIA/s1600/chain-finish.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmbOgEhwdwcr3d3-6h2LvL_9mhycVuKS5CHXqb08Ydbzkz88P8ptUBdnA3-3D1b8GVaYVmK840n3gYWCtJoq0S2sRfkx9Qux-sjmr7cxCbxuX93LS2kl163sYt0vp3fXZa7wXkHHM3ZIA/s1600/chain-finish.png" height="221" width="400" /></a></div>
In this chain, the "Rain" sequence means it will actually blend from "foggy downpour" back to "rain", which might confuse you in to thinking it's a "blend out" time - but always think about blending in as going in to a new weather, not necessarily a worse one, and blend out time as returning to "default" weather. The blend-in time for "Rain" is set to 1 minute in the weather type, so it'll take about a minute to lighten the weather, draw back the fog, lighten the world up and reduce the amount of rain. We'll then wait a further minute or so at this level, and then the duration will expire so the chain will begin then to fade back out using the "blend out" time of 3 minutes - this means that over the course of 5 minutes from when this chain starts, the horrific weather will draw back to light rain and then draw back to sunny with clear skies.<br />
<br />
Once you've set it up, right click on the weather blueprint in the left hand pane (the one that looks like an Explorer folder tree) and select Export, followed by Export with References.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhykcrnFbYHmJULdhtsi84X9YuLZaCwKDN99HnR_XKpRLa8kOgdK9VX9hCFBxBe1ey2D2eNQLXuzDw999BK53tsXDZ5IGYUPOTTR1H0KWcimd5Pu_EeUd_xIdjYzuSM8LFsBXqiwyjLuXo/s1600/export.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhykcrnFbYHmJULdhtsi84X9YuLZaCwKDN99HnR_XKpRLa8kOgdK9VX9hCFBxBe1ey2D2eNQLXuzDw999BK53tsXDZ5IGYUPOTTR1H0KWcimd5Pu_EeUd_xIdjYzuSM8LFsBXqiwyjLuXo/s1600/export.png" height="276" width="320" /></a></div>
<br />
You should see some output in the lower pane and it should end by saying "==== Export Succeeded ====" - if it doesn't then go back and check. You should also see any error messages reported in that output window as well. <br />
<h2>
Script</h2>
Let's go back to our scenario script and see how we actually kick all these weather chains off, using the SysCall we talked about right at the start:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventWeather1<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">WeatherController:SetCurrentWeatherEventChain</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Rain</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventWeather2<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">WeatherController:SetCurrentWeatherEventChain</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">FoggyRain</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventWeather3<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">WeatherController:SetCurrentWeatherEventChain</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">FoggyDownpour</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventWeather4<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">WeatherController:SetCurrentWeatherEventChain</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Finish</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end</pre>
<br />
In the scenario i've set up a bunch of "stop at" instructions, each one with a minimum speed of 1mph (which turns them in to go-via instructions, but allows me to put a trigger on them). Here's an example of how I set one of them up:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYVdDTT2r5pm-WA4QdIxfSTMetjTcFv3Db_w_wpLTg-o3NQGEjWCEV4Ni7uldGUzq12QiijPa5t51PSW9UOv9kK9SnkdtJHu8kPL_3_gKMfGeVBZqZ_6wKQL2_wMcBufqlxI5-l6PWdHk/s1600/stop-at.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYVdDTT2r5pm-WA4QdIxfSTMetjTcFv3Db_w_wpLTg-o3NQGEjWCEV4Ni7uldGUzq12QiijPa5t51PSW9UOv9kK9SnkdtJHu8kPL_3_gKMfGeVBZqZ_6wKQL2_wMcBufqlxI5-l6PWdHk/s1600/stop-at.png" height="400" width="263" /></a></div>
The important bit is near the bottom where it says "Weather1" - this is where you can trigger a script event to occur on successful completion of an instruction. The box directly to the right is the event to trigger if the player fails to complete the instruction successfully. So here you can see that in my first waypoint at Haymarket, I trigger "Weather1", this will go to the script and the script above will then execute the "Rain" weather sequence.<br />
<h2>
Concluding Notes</h2>
I've set lots of blend timings quite low here because it allows for a more clear and obvious example, when developing your own I would suggest that you use short blend times to start with to allow you to more clearly see the result of each change. Once you've then got the right weather looking the way you want then you can dial up the blend times to get some splendid smooth transitions.<br />
<br />
I have not covered the "Location" events, this is where you can add lightning bolts in the sky, rainbows, audio for thunder claps and also flash the sky. I think this tutorial is definitely long enough for now, so i'll come back and do Location events in a future tutorial, perhaps once i've had some feedback on how people feel about this one.<br />
<br />
When I set the blog up, it was intended to be only the most basic parts of scripting capable of accessing with the sole goal of enhancing scenarios. This is one of the most complex examples because it involves you going in to the blueprint editor, this is not going to be a problem for anyone familiar with content creation piplines in Train Simulator but for the average user I expect this to be something you go in to with some degree of trepidation. I hope that i've covered it with enough detail to show that it's not too hard and the results are clearly very well worth the effort.<br />
<h2>
What does it look like?</h2>
I'll leave you with some screenshots from my example scenario showing what it actually looks like in-game.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqnTs1-hLz7i06zLmVBYcImv7b6681mDhbxMrRFQb7MEP-IRaeRC5CL4U0ijlBQWEqe497OEq-X_FaUUE8QTTmCk3alos3smK1b6IsS7NXTUvE9dlbWma5kVyvKBKYdFQZFzg5Uld3Bbs/s1600/2015-02-15_00001.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqnTs1-hLz7i06zLmVBYcImv7b6681mDhbxMrRFQb7MEP-IRaeRC5CL4U0ijlBQWEqe497OEq-X_FaUUE8QTTmCk3alos3smK1b6IsS7NXTUvE9dlbWma5kVyvKBKYdFQZFzg5Uld3Bbs/s1600/2015-02-15_00001.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Departing Edinburgh on a lovely sunny day, clear skies</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI0gRi_S-Z2ecVeJGwqreoZe5yP9M6jcFFfDsJIFjmBxigouR_cCHPgg1hL3cpqjAGt_Wyb-eII8u1vfX2UlioZluRLkd46zNObpL0OLOTDB5oXeq22sR4nwIhX0_5l3EYRKDPND-LdJk/s1600/2015-02-15_00011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI0gRi_S-Z2ecVeJGwqreoZe5yP9M6jcFFfDsJIFjmBxigouR_cCHPgg1hL3cpqjAGt_Wyb-eII8u1vfX2UlioZluRLkd46zNObpL0OLOTDB5oXeq22sR4nwIhX0_5l3EYRKDPND-LdJk/s1600/2015-02-15_00011.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">As we went through Haymarket, rain started to appear</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Qb4fYPL1dEqOZvCPPvtE2hh6S38joqpIteWQlCKPxZeiMlzrBHKIMVMS_f253ChmAfA8EG6X2dZH9Ll-7Ews7Omdh2SATBSxPK94ZitgcbsQrwBmAp6tgccIQ1a9sp7kgndW-kWdK7I/s1600/2015-02-15_00010.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Qb4fYPL1dEqOZvCPPvtE2hh6S38joqpIteWQlCKPxZeiMlzrBHKIMVMS_f253ChmAfA8EG6X2dZH9Ll-7Ews7Omdh2SATBSxPK94ZitgcbsQrwBmAp6tgccIQ1a9sp7kgndW-kWdK7I/s1600/2015-02-15_00010.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The clouds seem to have taken a turn too, looks like we're in for a storm.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJq_627qbUNwlMqADMKxli58BUl4dhIBTgN2P-nijnSK_eRzZcaGXhjDhgx8YKeHZbd_8VHIhuDdOVQKlziGbHgrLjJb9jQUZR5kXfypUpl2nL69beLWLF9yJpZQBNMTl_xNbtKNevQWY/s1600/2015-02-15_00004.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJq_627qbUNwlMqADMKxli58BUl4dhIBTgN2P-nijnSK_eRzZcaGXhjDhgx8YKeHZbd_8VHIhuDdOVQKlziGbHgrLjJb9jQUZR5kXfypUpl2nL69beLWLF9yJpZQBNMTl_xNbtKNevQWY/s1600/2015-02-15_00004.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Passing Edinburgh Park, the skies darken and the fog starts to draw in.</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLfAnu-KvKP2UWW30rNZ3_ufUyQulXZh2J741mQjFo6tENWe9iLeHTin-8mQl2I0Lw6CS1FvpOcem_yCvEwqIj_uMnz0UH81scEYXXla3IXzcNIaVVSZuf3isA00uOY1UFbBXO-RZeDWQ/s1600/2015-02-15_00007.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLfAnu-KvKP2UWW30rNZ3_ufUyQulXZh2J741mQjFo6tENWe9iLeHTin-8mQl2I0Lw6CS1FvpOcem_yCvEwqIj_uMnz0UH81scEYXXla3IXzcNIaVVSZuf3isA00uOY1UFbBXO-RZeDWQ/s1600/2015-02-15_00007.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The fog really seems to be closing in now after we pass Bathgate Junction and the rain is getting really itense, even with wipers on I can't keep up with the rain!</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2LeFP4DhICem3gSHefqrzOLA2eQDvlkdgjHK5Isi0kHlKQNcWrTLANLV2izTFRkEOadeHSL5T51dG-S_LD7FZYXdoS_n_Z83kb0KjjKFA6cnMCbWzIroCl844Mz2GFsmWYnpiVIpFrtk/s1600/2015-02-15_00008.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2LeFP4DhICem3gSHefqrzOLA2eQDvlkdgjHK5Isi0kHlKQNcWrTLANLV2izTFRkEOadeHSL5T51dG-S_LD7FZYXdoS_n_Z83kb0KjjKFA6cnMCbWzIroCl844Mz2GFsmWYnpiVIpFrtk/s1600/2015-02-15_00008.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Passing Winchburg the fog has lifted and the skies are lightening up, maybe we're through the storm.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3Xt13YvhmFeUk8pbZsDfOZk7P6RoOA-Q_oCWR_C2hB6PAeYCIO8GEptG9gdcZOO-enAaCr1YjI5E_ZXGySRiL5cetBOpimqdZzQmgFVMFlFEo5WC72DRqOfzMbks0yxWw-_6jWCqu4E/s1600/2015-02-15_00003.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3Xt13YvhmFeUk8pbZsDfOZk7P6RoOA-Q_oCWR_C2hB6PAeYCIO8GEptG9gdcZOO-enAaCr1YjI5E_ZXGySRiL5cetBOpimqdZzQmgFVMFlFEo5WC72DRqOfzMbks0yxWw-_6jWCqu4E/s1600/2015-02-15_00003.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Heading towards our end point everything is brighter now and the rain is easing off.</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiik1op2GmQ6msSVQy4SVH8_wUZDZRmArMns00JZHQNCJn2cFzU8Ko4U_tjlapLRNcgoHUmEEe4pH617FnZGEheHdH_JxU51EHAb8nCsA1xbHFf36cEkPO9ar9eDGJChAvphnEhL3DwPrE/s1600/2015-02-15_00011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiik1op2GmQ6msSVQy4SVH8_wUZDZRmArMns00JZHQNCJn2cFzU8Ko4U_tjlapLRNcgoHUmEEe4pH617FnZGEheHdH_JxU51EHAb8nCsA1xbHFf36cEkPO9ar9eDGJChAvphnEhL3DwPrE/s1600/2015-02-15_00011.jpg" height="225" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Finally, the skies are back to clear and there's just an odd spot or two appearing on the window!</td></tr>
</tbody></table>
<br />
<br />
<br />
<br /><br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com17tag:blogger.com,1999:blog-2198684265915171562.post-73831016230760893672015-02-15T11:29:00.002+00:002015-02-15T11:29:20.773+00:00Apologies for the DelayArticle 10 (Dynamic Weather) is in progress - however Blogger just corrupted all the images in it and I need to finish up and test some bits to make sure it's all right, it's just taking longer than the other articles because there's a lot more to it :)<br />
<br />
Hopefully early this week I'll get it finished and I can then carry on - audio and video are significantly shorter topics :)<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com0tag:blogger.com,1999:blog-2198684265915171562.post-59426720564030902902015-02-11T09:14:00.004+00:002015-02-11T09:14:50.637+00:00TS2015 - Scenario Scripting in LUA Part 9 - Ending the Scenario EarlySometimes when a scenario is being played you want to be able to reflect sufficiently bad playing by ending the scenario early. The game can already do this in some circumstances, for example leaving the firebox door open when you go in to a tunnel or running out of water in the boiler can both terminate the scenario early.<br />
<br />
Wouldn't it be great if you could build some of this gameplay in to your scenarios, coming up with unique situations that fit what is going on?<br />
<br />
Let's take a previous example - where you're driving along with wagons that have a lower speed limit than the maximum line speed, so you've scripted something that will watch the speed and then stop the train if you do it too much. It works by first warning you, then by stopping the train - but what's the next level of escalation? In reality you would be relieved of your duties pending a review and disciplinary action, and the closest thing to that in the game is just simply to end the scenario early and essentially make the player start again and pay more attention next time.<br />
<br />
You can end a scenario as a failure<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerScenarioFailure</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Scenario failed! Please try again.</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span></pre>
<br />
Or you can end it as a success:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerScenarioComplete</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Scenario completed!</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span></pre>
<br />
It's easy to come up with reasons to end a scenario with a failure, though I would certainly caution against using this too much, use it where you really do think the player has done so badly that it is inappropriate to allow them to finish the scenario. Think of it as an "ultimate penalty" and you absolutely should have a multi-level approach to this including warnings, don't just bang them out, that makes for a frustrating experience and they're unlikely to come back for another go.<br />
<br />
However, ending a scenario early as a success? What on earth is going on there!<br />
<br />
There are fewer uses for it, but there certainly are some potential uses. One example is that you could set up a career scenario which has you run along a line and you mark out 5 stops each worth 200 points. During the initial journey for these first four stops, you have some background script checking the performance of the player, perhaps you track how many seconds are spent overspeeding, or if they over-drive the engines by pushing the ammeter in to the red and track how many seconds they do that. When the player then arrives at the fourth stop, you then make a decision. Has the player done well? If they have not, then end the scenario early with a success. They have now technically finished the scenario but they cannot possibly access a gold medal. If they <i>have</i> done well, then don't end it, let them complete the journey to the final stop and receive the additional points. In this way, you're actually limiting the possible score (and medal) that the player can earn based on wider driving attributes and skills than simply their ability to not speed and not be late, but they're still actually able to get a medal/tick even if they're not doing very well.<br />
<br />
Those are some simple ideas, I leave it to you to come up with some more interesting gameplay concepts and i'm looking forward to seeing what you can come up with!<br />
<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com0tag:blogger.com,1999:blog-2198684265915171562.post-19454519127782975982015-02-10T08:54:00.002+00:002015-02-10T08:54:39.719+00:00TS2015 - Scenario Scripting in LUA Part 8 - Locking and Unlocking ControlsWe've covered some interesting examples in previous articles where you can take control of the player train, perhaps to bring it to stop if the player breaks some speed limit too much.<br />
<br />
One of the weaknesses in those examples is that currently they are one-shot, once the script has changed the controls to stop the train, it sits back and relaxes, so the player can just as easily jump in and reset them to keep going again if they want to.<br />
<br />
Some times we want to be a little more insistant. There are a couple of ways of doing it and some are more appropriate for different situations than others.<br />
<br />
You could use all that you've learned so far to simply keep continually resetting a control to some stored value, that way no matter what the player does with it, it will be forced back to the same place again. This has the effect of preventing its movement, but doesn't look great in the UI because the control appears to move and then keep springing back.<br />
<br />
Another approach is to ask the game to lock out the controls, the LUA script command to do this is:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:LockControls</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span></pre>
<br />
You can (and must, at some point!) then unlock them using this control:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:UnlockControls</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span></pre>
<br />
When you issue the "LockControls" command it will remove any HUD and prevent all keyboard inputs, it will be impossible to move any controls at all!<br />
<br />
There is a downside to this... once you have locked out the controls, the player cannot pause the game <i>or</i> exit it. So if you use it, then please make sure you use it sparingly and appropriately, and always remember to unlock it again!<br />
<br />
A short post today, more tomorrow!<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com0tag:blogger.com,1999:blog-2198684265915171562.post-15530505073982014282015-02-09T16:15:00.002+00:002015-02-09T16:15:10.516+00:00TS2015 - Scenario Scripting in LUA Part 7 - Interfacing with Loco ControllersIn this article I wanted to give you the tools to really make the scenario script interface much more with the player. You can cause them problems, provide assistance, or simply make decisions based on what is happening.<br />
<h2>
What are controllers?</h2>
<br />
Before we look at how to get and set controllers, it's probably worth reviewing exactly what it is that they are.<br />
<br />
Within the definition of a locomotive there are a set of controllers that represent values values managed by that locomotive. Most values reported within the cab such as speed, ammeter and so forth are available as controllers, as are most inputs such as the position of the regulator, the state of the headlights and so forth.<br />
<br />
Each locomotive is likely to have different controllers, though there are some common sets that you can predict between types of locomotives. For example, just about everything has a "Regulator" control and a "Reverser" control. Steam engines will have boiler pressure, where as diesel electrics will have the ammeter.<br />
<br />
One way to quickly see what controllers are on a specific locomotive is to run the game with a special command line parameter<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">-ShowControlStateDialog</span><br />
<br />
(see Part 2 - Logging - to see how to add these if you're not already familiar with command line parameters)<br />
<br />
You will also need to be in Windowed mode to be able to see this box, so change to windowed mode if you are not already.<br />
<br />
With this enabled, fire up a scenario or quick drive using the locomotive you'll have in your scenario and a new box will appear that shows every controller and its current value, changing in real time. This can give fantastic insight in to what is happening in the locomotive as you drive it. Operate some controls and watch how various values change as you start driving.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVS0kOt5dvX7syETKD0_uuJYqJmE-NN4NlRhd0knBDUmhHOmKAzAtmrHDTIByZ9hql7zerJQHy7hzjeJ5f6c6rIKZrPx103yXnfE9x-Sh7xOtVxWk2yl2WuB_28NCJ0jQJjskh-FSJn8/s1600/controlstatedialog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVS0kOt5dvX7syETKD0_uuJYqJmE-NN4NlRhd0knBDUmhHOmKAzAtmrHDTIByZ9hql7zerJQHy7hzjeJ5f6c6rIKZrPx103yXnfE9x-Sh7xOtVxWk2yl2WuB_28NCJ0jQJjskh-FSJn8/s1600/controlstatedialog.png" height="640" width="284" /></a></div>
<br />
Reviewing the controllers in the locomotive featured in your scenario as the player loco will tell you what you can and can't do with that loco. Many controllers can be read and written to, some such as the speed, boiler pressure etc can only be read from.<br />
<br />
<h3>
Virtual Controllers</h3>
One slight wrinkle is that there are also Virtual versions of controllers, so you might have a VirtualRegulator in a loco and you'll notice that operating the regulator actually moves this and <i>not</i> the "Regulator" control. <br />
<br />
Virtual Controllers really are just normal controllers in most aspects, the only difference is that the core game will usually act on their presence by making them supercede the controller they are overriding, so VirtualHorn will override the Horn. There are some other variations such as "VirtualBrake" overrides the "TrainBrakeController" but for the most part the pattern works. <br />
<br />
Be aware of Virtual controls and if you see any, check to see which ones are being used and then make sure you work out if these are the ones you should be really interacting with.<br />
<br />
<h2>
How to get values</h2>
<br />
Now that we know what we're interfacing with, we can start to look at retrieving values. I'm not going to look at what you would do with that information yet, that comes in a little while, for now, let's just see a short example of how to retrieve a controller value and what it means:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">regulator <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span></pre>
<br />
This command will retrieve a controller called "Regulator" and store it in a local variable called "regulator". Note that the case of the controller you want to retrieve must match the way it is expressed in the Control State Dialog. The last digit "0" on the end will always be a zero. <br />
<h2>
How to set values</h2>
<br />
Setting control values looks very similar.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">1</span><span style="color: #808030;">)</span></pre>
<br />
In this case note that the "0" is still present and will again always be a "0". In this case, i'm setting the value of the regulator to 1, which sets it to its maximum on most locomotives. You should review the behaviour of the controllers via the Control State Dialog in order to understand what the minimums and maximums are, in order to be able to correctly understand what values you're reading and writing.<br />
<br />
<h2>
Uses</h2>
<br />
Now we come to the "why?". We have the tools to read and write controller values, but what can we actually do with this knowledge?<br />
<br />
I'm going to show four examples, but i'm sure there are more and I'll leave it to you to be innovative and surprise us all!<br />
<h3>
Triggering when a controller reaches a value</h3>
<br />
In this example, let's say I want to trigger some kind of pop-up message when the player moves their regulator above 50%. Let's jump in to some code now and explain afterwards - again, i'll include some of the surrounding contextual code as well so you can see how the example fits in the wider sceheme of things:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventStart<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">CheckRegulator</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestConditionCheckRegulator<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
regulator <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>regulator <span style="color: #808030;">></span> <span style="color: green;">0.5</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator too high!</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">regulatortoohigh.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">10</span><span style="color: #808030;">,</span> MSG_TOP <span style="color: #808030;">+</span> MSG_TOP<span style="color: #808030;">,</span> MSG_SMALL<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
So our first scenario instruction was a trigger that fired "Start" as the event. This causes OnEvent("Start"), we then call OnEventStart() and this begins checking a condition called CheckRegulator.<br />
<br />
The game now starts very regularly running TestCondition("CheckRegulator"), which in turn calls TestConditionCheckRegulator().<br />
<br />
TestConditionCheckRegulator() will retrieve the value of the regulator and if it exceeds 0.5 it will pop up a message. Having returned "condition succeded" this means it will not then perform this check any more, so you only get one message.<br />
<br />
You could use this example perhaps in some form of tutorial where you say "now move the regulator to around 50% to get the train moving", and then once the regulator has been moved, the pop-up message could provide the next set of instructions for the player.<br />
<br />
<h3>
Limiting a controller to a particular range</h3>
<br />
Perhaps you want to make it so that the player can only move a control within a particular range, simulating some mechanical fault for example. You could use a similar technique as above, combined with a "set" instruction:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventRegulatorFault<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ManageRegulatorFault</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventStopRegulatorFault<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:EndConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ManageRegulatorFault</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestConditionManagerRegulatorFault<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
regulator <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>regulator <span style="color: #808030;">></span> <span style="color: green;">0.7</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.7</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET
elseif <span style="color: #808030;">(</span>regulator <span style="color: #808030;"><</span> <span style="color: green;">0.2</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.2</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"> </pre>
This is a slightly more complex example. Essentially i've allowed for an event that can be triggered called "RegulatorFault", and another event called "StopRegulatorFault". So at some point in our scenario instructions we add the trigger to cause "RegulatorFault" and then perhaps later on we have another instruction which causes "StopRegulatorFault".<br />
<br />
When we start the regulator fault, a condition begins being checked and all this will do is get the value of the regulator and if it is above 70% it will force it back to 70%, and if it is below 20% it will force it up to 20%. Now if you try and move the regulator outside of this 20-70% range you'll find you can't!<br />
<br />
Once you get to the "StopRegulatorFault" event, this will use the "EndConditionCheck" to cause the condition to stop being evaluated and the regulator will return to full behaviour again. You could link this with some kind of pop-up perhaps explaining that the fault has now been rectified.<br />
<br />
You could imagine that this kind of fault could cause some degree of stress in the wrong situation, so it's also important to carefully work out where to place this kind of thing. Never put the player in a position that they can fail for reasons outside of their control, it might be realistic, but it's not even remotely fun!<br />
<br />
Note also that in all cases i'm returning "CONDITION_NOT_YET_MET" - this is because I want the condition to continually fire over and over, if I were to return "CONDITION_SUCCEEDED" it would only fire once.<br />
<br />
<h3>
Forcing the train to stop</h3>
<br />
In this small code snippet, we're going to see if the locomotive is exceeding 30mph and if it is, we're going to reset the reverser, the regulator and apply full brakes - basically the same as the emergency brake does.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">MPH <span style="color: #808030;">=</span> <span style="color: green;">2.23693629</span>
<span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventSpeedCheck<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">SpeedCheck</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestConditionSpeedCheck<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
speed <span style="color: #808030;">=</span> math<span style="color: #808030;">.</span><span style="color: maroon; font-weight: bold;">abs</span><span style="color: #808030;">(</span>SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span> <span style="color: #808030;">*</span> MPH<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: #008c00;">30</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Regulator</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TrainBrakeController</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: #008c00;">1</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
In the key part of this code, the TestConditionSpeedCheck function, you can see that we get the speed, convert it to Miles Per Hour (remember that it's in meters per second by default) and then if it's greater than 30 we set the regulator and reverser to 0 and the train brake to 1, which will cause the train to start rapidly slowing down.<br />
<br />
That's great, but it would be good to lock the player out from being able to now make changes until the train has stopped and perhaps been suitably chastised. You could do this by firing another condition that constantly resets these controllers until the speed is back to zero however there is a neater way of doing it that i'll be covering in a future tutorial that involves actually locking the player out from using any controls at all!<br />
<h3>
Driving the train or operating controls for the player</h3>
<br />
For the last example, you could actually operate some controls for the player and either fully drive or part drive the locomotive for them.<br />
<br />
Let's take the example of a steam locomotive and have the script take on the function of operating the reverser / cut-off, so the player will only need to operate the regulator while the script will do the reverser for them. This kind of thing can look very cool to players as they see part of the loco essentially seeming to drive itself and you could apply storyline to it like the fireman is operating some of the controls for you, for example.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">MPH <span style="color: #808030;">=</span> <span style="color: green;">2.23693629</span>
<span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventManageCutoff<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ManageCutoff</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestConditionManageCutoff<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
speed <span style="color: #808030;">=</span> math<span style="color: #808030;">.</span><span style="color: maroon; font-weight: bold;">abs</span><span style="color: #808030;">(</span>SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span> <span style="color: #808030;">*</span> MPH<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: #008c00;">50</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.25</span><span style="color: #808030;">)</span>
elseif <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: #008c00;">40</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.35</span><span style="color: #808030;">)</span>
elseif <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: #008c00;">30</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.45</span><span style="color: #808030;">)</span>
elseif <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: #008c00;">20</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.55</span><span style="color: #808030;">)</span>
elseif <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: #008c00;">10</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.65</span><span style="color: #808030;">)</span>
elseif <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: #008c00;">5</span><span style="color: #808030;">)</span> then
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.70</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">else</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:SetControlValue</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Reverser</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> <span style="color: green;">0.75</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
I'll start out by saying that I've probably not got great values for the reverser here, but the point is still valid. <br />
<br />
So we're going to fire an event off in the scenario instructions, probably at the start, called ManageCutoff. This will result in a condition being checked called ManageCutoff by the event handler OnEventManageCutoff.<br />
<br />
When the condition runs it will check the current speed of the locomotive and then decide what value to set the reverser too, so as I speed the locomotive up, so the reverser will move to a lower and lower value and as I slow the loco down so the reverser will move its way up again. With some tuning for a particular loco this can make it significantly easier to drive for new users.<br />
<br />
<b>There are a couple of interesting points about this script</b><br />
<br />
Notice how the if statements are checking in reverse order. This is because if I had checked for ">5" first, then every speed would have matched that one and the script wouldn't have worked. If you don't get it, work it out on paper or even give it a try and you'll see what I mean.<br />
<br />
It's important to realise that while the functions are called "Conditions" they are useful for far more than simply checking to see if a condition is true, just as in this case, you can use it to run processing in parallel with the actions the player is undertaking.<br />
<h2>
Visual Changes</h2>
<br />
One last example without code, because it's usually highly dependant on specific locomotives, to get you thinking is that on some locomotives you'll notice visual things can be affected by scripts. These can include head boards, destination boards, lamp configuration and so forth. You can of course so all this too via script if they're able to be affected by controller changes. For example, you could have a steam loco set up so that it dynamically and automatically changes its lamp headcode configuration at various points in a scenario.<br />
<h2>
Last Words</h2>
<br />
One last word on the subject of using Conditions since we've used them a lot here - be careful that they are running <i>all</i> the time <i>over and over again</i> until they are stopped, therefore the more you do, the more you have running and the more intensive they are, the more of an impact they are going to have on frame rate. So use them, but use them carefully.<br />
<br />
This has been a fairly long post but I hope it has given a lot more examples about how you can handle reading and writing controllers. I've generally used the regulator a lot in my examples but you could do anything - you could check for current speed and boiler pressure and use that to decide to start loading on coal for example, or simply put up a message saying "your boiler pressure is low, you need to open the damper and start the blower, and make sure you have plenty of coal in the fire!".<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com1tag:blogger.com,1999:blog-2198684265915171562.post-34249563735366463212015-02-08T12:03:00.001+00:002015-02-08T12:03:23.434+00:00TS2015 - Scenario Scripting in LUA Part 6 - Speed CheckingIn addition to providing various visual interactions such as pop-ups and cinematics, you can also use the LUA scripting logic to provide for additional gameplay features as well.<br />
<br />
One such feature you can quickly use to great effect is to use the scripting to monitor the players speed and then react to it in some way.<br />
<br />
There are a couple of uses for this, one is to see whether the player has got the train moving - and if so perhaps congratulate them and give them some next instructions.<br />
<br />
Another is to see if the player has stopped, in which case you might want to remind them how to get moving again. This is particularly useful if you're aiming your scenario at newcomers to the game!<br />
<br />
The final one and perhaps the most useful generally is to check for going too fast according to some additional rules (beyond speed limits and so forth). For example, while the speed limit on a particular stretch of line might be 70mph, if the train you're hauling has wagons with a maximum 40mph speed limit (perhaps they're sensitive or dangerous cargo, or simply old and not suitable for higher speeds for example) then it would be good to be able to factor this additional rule in to the scenario, rather than simply advising the user at the start and then just assuming they adhere to a guideline they probably forgot 10 minutes in to the scenario.<br />
<h2>
How do you get the speed?</h2>
<br />
This is the easy bit, getting the speed can be done with a simple single command:<br />
<br />
<pre style="background: #ffffff; color: black;"><pre>speed <span style="color: #808030;">=</span> math<span style="color: #808030;">.</span><span style="color: maroon; font-weight: bold;">abs</span><span style="color: #808030;">(</span>SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span></pre>
</pre>
<br />
Here, we call a command PlayerEngine:GetSpeed in the game core and then run it by a math function called "abs" - what this will do is ensure that the result is always positive. That way no matter if you're going forwards or backwards, the speed returned is always a positive number. The result is then stored in a variable called "speed".<br />
<br />
Note that the units returned by GetSpeed are in meters per second, NOT, miles or kilometers per hour.<br />
<br />
What I like to do is add some more constants to the section of definitions at the top of the script to help with these calculations:<br />
<br />
<pre style="background: #ffffff; color: black;"><pre><pre>MPH <span style="color: #808030;">=</span> <span style="color: green;">2.23693629</span>
KMH <span style="color: #808030;">=</span> <span style="color: green;">3.6</span>
gSpeedUnits <span style="color: #808030;">=</span> MPH</pre>
<span style="color: green;"></span></pre>
</pre>
I can now adjust the above GetSpeed example as follows:<br />
<br />
<pre style="background: #ffffff; color: black;"><pre>speed <span style="color: #808030;">=</span> math<span style="color: #808030;">.</span><span style="color: maroon; font-weight: bold;">abs</span><span style="color: #808030;">(</span>SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span> <span style="color: #808030;">*</span> gSpeedUnits</pre>
</pre>
<br />
Now "speed" will contain the current speed of the loco in miles per hour. It might at first seem odd to have "gSpeedUnits" - why not just use the constant "MPH" ? You could do that - but if you wanted to re-use components of your script in a future script and that needed to be in KMH then you would need to do a careful search and replace to swap "MPH" to "KMH" - by using "gSpeedUnits" everywhere you can simply change the assignment to gSpeedUnits at the top of the script and the rest will simply fall in to place.<br />
<h2>
Where does it go in the script?</h2>
<br />
You will generally want to check speed as part of a condition so that you can do it regularly. You could check to see if you're at a particular speed as part of a one-off check in an event if you wish but there aren't many cases where you really want to do that.<br />
<br />
Let's set up a small example to check if the player has started moving yet, triggered as part of the first trigger instruction in a scenario:<br />
<br />
<pre style="background: #ffffff; color: black;"><pre><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventStartMovingCheck<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:BeginConditionCheck</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">AreWeMovingYet</span><span style="color: maroon;">"</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestConditionAreWeMovingYet<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
speed <span style="color: #808030;">=</span> math<span style="color: #808030;">.</span><span style="color: maroon; font-weight: bold;">abs</span><span style="color: #808030;">(</span>SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span> <span style="color: #808030;">*</span> gSpeedUnits<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;">></span> <span style="color: green;">1</span><span style="color: #808030;">)</span> then
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">You're moving!</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">moving.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">10</span><span style="color: #808030;">,</span> MSG_TOP <span style="color: #808030;">+</span> MSG_TOP<span style="color: #808030;">,</span> MSG_SMALL<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
</pre>
<br />
Ok, lots to see there, but most of it you've already seen in previous articles, i've just included it to provide context.<br />
<br />
So in our scenario set-up in the timetable view of the game, we've added a trigger instruction that fires an event "StartMovingCheck". This results in a call on OnEvent with event set to "StartMovingCheck". That in turn calls OnEventStartMovingCheck.<br />
<br />
OnEventStartMovingCheck will begin a condition test called "AreWeMovingYet". As of that moment, the game will begin firing calls to TestCondition with "condition" set to "AreWeMovingYet" and it in turn will call TestConditionAreWeMovingYet.<br />
<br />
Ok, so we made it to the actual important bit of this example finally!<br />
<br />
TestConditionAreWeMovingYet, which is being called very regularly now over and over, will obtain the speed of the player. If the speed is more than 1mph then it will open an HTML message box that loads "moving.html" and might give the player some feedback now they're moving and perhaps more instructions. The return of "condition succeeded" means it will now no longer perform this check, so if the player stops and starts moving again it will NOT do this again.<br />
<br />
You can see that it would be easy to modify this example to check if the player is stopped, however in that case I would strongly recommend checking for speed<0.1 rather than speed == 0 simply because of rounding and physics behaviours in the game.<br />
<br />
This has been a simple over view on how to check the speed, you should be able now to see how you can apply it to various different cases and provide some additional gameplay behaviours.<br />
<br />
To give you some examples, there are some scenarios on Western Lines of Scotland where you are hauling tanker wagons and these have reduced speed limits. The storyline of the scenario is that you're riding with a fireman and guard who are very cautious of accidents. Even though the line speed is high, the train is in some cases only rated for 30mph maximum speed. As you drive along, the speed is constantly being checked and if you ever exceed 30mph you get a warning to slow down, after two or three warnings then the brakes will be applied to bring the train to a stop. If you then continue to cause this to happen more times then eventually the scenario is actually terminated early, resulting in a fail. Of course you need to tune how flexible the scripts are - if they bang you out with a scenario failure for one error then that really does qualify as a super hard (possibly super frustrating!) scenario and you should set things up to match the level you're trying to achieve.<br />
<br />
<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com2tag:blogger.com,1999:blog-2198684265915171562.post-55300419865094723592015-02-07T12:36:00.004+00:002015-02-07T12:37:11.812+00:00TS2015 - Scenario Scripting in LUA Part 5 - Cinematic CamerasIn todays article, I'm going to cover one of the most exciting features you can access through LUA scripting in your scenarios, the use of Cinematic Cameras. These cameras allow you to create specific sequences that might commonly be used to set a scene at the start of a scenario, or perhaps even during a scenario they can be used to indicate some thing that's going on in the world around the player.<br />
<br />
In addition to the Cinematic Cameras, I'll also then cover how you can access the other fixed cameras such as forcing cab view or track side view for example.<br />
<br />
If you have not yet watched the YouTube video from the TSL show segment that covered this then I would recommend you do this first because it's always easier to see things visually.<br />
<br />
<a href="https://www.youtube.com/watch?v=1RcO_og8q7M" target="_blank">Click here to watch the episode</a><br />
<br />
There are a couple of steps to using the cinematic cameras:<br />
<br />
1. Place and set up the cameras to create the sequence itself<br />
2. Start the camera sequence from LUA script<br />
<h2>
Setting up the Camera</h2>
<br />
Most of how you place the camera is far better explained visually in the video but here's a route outline of what you need to do.<br />
<br />
<br />
First, you need to place a Cinematic Camera asset, which you can find on
the middle-left flyout under the "miscellaneous" group, which is the
bag in the bottom right of the little group of icons.<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOlIyWayvtC8z4jMM7qSucCi5DTo-Hn5NTH1i2lV3S8GVpLVkwHeQ_hwAqQ31jib1yInnP7XncP_rOB9YnMmoGrTuuu0L44R1oVuEpzgmoKmpsaIoUzBDJrcODRgdQ9ylXznbIieMBrFg/s1600/camera-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOlIyWayvtC8z4jMM7qSucCi5DTo-Hn5NTH1i2lV3S8GVpLVkwHeQ_hwAqQ31jib1yInnP7XncP_rOB9YnMmoGrTuuu0L44R1oVuEpzgmoKmpsaIoUzBDJrcODRgdQ9ylXznbIieMBrFg/s1600/camera-1.png" height="640" width="193" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZS52WQg9herB5VblMmRSxYin5fIL6Ldfd4SKdGq2GisOhPJHZa51fc71ct-kffgw23ISkOfJVdBc03ARfgRBxIVH09ql8AeOKq3V-sGawUKNfVX3D8b670r5oATotHUl0Q9B1XEykKhg/s1600/camera-3.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZS52WQg9herB5VblMmRSxYin5fIL6Ldfd4SKdGq2GisOhPJHZa51fc71ct-kffgw23ISkOfJVdBc03ARfgRBxIVH09ql8AeOKq3V-sGawUKNfVX3D8b670r5oATotHUl0Q9B1XEykKhg/s1600/camera-3.png" height="167" width="200" /></a></div>
First, you need to place a Cinematic Camera asset, which you can find on
the middle-left flyout under the "miscellaneous" group, which is the
bag in the bottom right of the little group of icons.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUx97tz-eWmSPbV2o7l8ikz912l44g4l3DATyDoyTRWSCzI65dcOm5TnXGm_TWyLUCcczpa0THpEI-j4nOkOVyRzzNIFybPnTmuh08hnYs1QA5PFwvanbaDAKvendiQRZUYrKhqiM0F_U/s1600/camera-2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUx97tz-eWmSPbV2o7l8ikz912l44g4l3DATyDoyTRWSCzI65dcOm5TnXGm_TWyLUCcczpa0THpEI-j4nOkOVyRzzNIFybPnTmuh08hnYs1QA5PFwvanbaDAKvendiQRZUYrKhqiM0F_U/s1600/camera-2.png" height="400" width="183" /></a></div>
Double click on the camera asset to get access to its properties on the top right fly-out.<br />
<br />
You can use one of the arrow icons (third one along) to move the camera so that it is pointing to exactly what you are currently looking at, this is by far the easiest way to position the camera.<br />
<br />
You can change the field of view by changing the value in the fifth field down (it defaults to 65) to get a narrower angle by lowering it, or a more wide angle by raising it.<br />
<br />
Click the "+" icon (second icon) to add a new key frame and then use the left/right yellow and white arrows on the top right to move between the key frames. It tells you below the arrows which frame you're on, e.g. 3/4 means third out of four. You can use the "bin" icon (first one) to delete the current key frame.<br />
<br />
Once you've positioned all the cameras, go back and set times using the sixth field down - so for key frame 1, the time means how long to spend on that key frame before advancing to the next.<br />
<br />
Once you've finished setting up all the key frames for your cinematic sequence, you can test it out right away by clicking on the "play" icon at the bottom. This will run through the sequence and you can use the clock on the bottom right of the fly-out to watch as the sequence runs through it's timings to make sure everything works out as you planned it.<br />
<br />
Once you start reviewing the sequence with "play" it is important to make sure that you click "stop" to end it as many of the fields are not accessible while it is playing. You can use the rest of the controls along the bottom such as rewind and pause the same way you would expect to.<br />
<br />
Once you're happy with the sequence, put a name in to the bigger text field (with the cube next to it) - this is the name that we'll use to start the sequence off.<br />
<h2>
Starting the Sequence</h2>
<br />
At this point, we're finished with the cinematic camera editor and can now return to the scenario editor and write a little LUA code to activate it.<br />
<br />
In this example, let's assume it's an opening camera sequence. I named the sequence "coolopening" in the cinematic camera name box described above, and in the scenario i've added a trigger box which triggers an event "Start".<br />
<br />
Let's see the code that now makes the magic happen.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventStart<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">CameraManager:ActivateCamera</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">coolopening</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end</pre>
<br />
So we start out with our standard "OnEvent" function which passes it on to a separate function to handle the specific event - in this case, OnEventStart, because the first event we triggered was called "Start".<br />
<br />
Inside that event, we then call the ActivateCamera function in the game and ask it to run "coolopening"; the name of our cinematic camera sequence.<br />
<br />
That's really all there is to getting it working, but there are some extra bits that are worth knowing.<br />
<h2>
Delaying the next instruction</h2>
<br />
If you want to run a camera sequence and then do something else (which you most likely will!) then make sure that the trigger instruction has a timed offset. This is because the command to run a camera sequence actually finishes immediately and returns control back to the game to run the next instruction in the scenario, while at the same time it runs the camera in parallel. If you don't put a delay on the next instruction it can result in the camera sequence being interrupted.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOzo5l1KlPfUdgjlzbVLKiRU9CLF26QmZWsnumfXj6jyCRTxMOJ8gIZbD9jdIhly84XKnh4mRzyqp8dcVOsGDtEOqWLPge4cXsknhFFN7FhvzPXA4UN1QsUsLzYPpgYu28DoyBzKYMN8A/s1600/trigger.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOzo5l1KlPfUdgjlzbVLKiRU9CLF26QmZWsnumfXj6jyCRTxMOJ8gIZbD9jdIhly84XKnh4mRzyqp8dcVOsGDtEOqWLPge4cXsknhFFN7FhvzPXA4UN1QsUsLzYPpgYu28DoyBzKYMN8A/s1600/trigger.png" height="640" width="443" /></a></div>
<br />
The example above shows that in the first field of the trigger instruction, i've set up a 15 second delay - which means that from the moment this instruction would normally execute, it will hold off for 15 seconds. If our first instruction was to fire a camera sequence that lasted 15 seconds, this would mean that the instruction above waits for 15 seconds and then fires another trigger to continue the script on to the next step. You will simply need to add up the total time of your cinematic sequence (including the time on the last key frame) and then put that in to the delay box.<br />
<h2>
Chaining multiple camera sequences together</h2>
<br />
If you want to chain two camera sequences together, e.g. to do a pass through of a platform and then another pass over the player train then you simply set them up as normal and make sure that the trigger instruction which causes the second has a suitable delay so that it will not trigger before the first one has finished running. <br />
<h2>
Accessing Internal Cameras</h2>
<br />
There are a number of internal cameras defined that you can refer using the ActivateCamera call. Note that these names must be entered precisely, including the correct capitalisation.<br />
<br />
<table border="0">
<tbody>
<tr><td bgcolor="#9EE6FF">CabCamera</td><td>Switches to the cab camera (like pressing 1 normally)</td></tr>
<tr><td bgcolor="#9EE6FF">ExternalCamera</td><td>Switch to view "2"</td></tr>
<tr><td bgcolor="#9EE6FF">TrackSideCamera</td><td>Switch to view "4"</td></tr>
<tr><td bgcolor="#9EE6FF">CarriageCamera</td><td>Switch to view "5"</td></tr>
<tr><td bgcolor="#9EE6FF">CouplingCamera</td><td>Switch to view "6"</td></tr>
<tr><td bgcolor="#9EE6FF">YardCamera</td><td>Switch to view "7"</td></tr>
<tr><td bgcolor="#9EE6FF">HeadOutCamera</td><td>Switch to view "Shift-2"</td></tr>
<tr><td bgcolor="#9EE6FF">FreeCamera</td><td>Switch to view "8"</td></tr>
</tbody></table>
<br />
<h2>
Helper Functions</h2>
All good coders know the importance of keeping your code clean, and one of the important ways of doing this is to spread your code in to different functions that look after different aspects. One key area you can do this, and also greatly simplify reading of your code later, is to create some short helper functions that wrap the SysCall's, something like this:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> ShowCamera<span style="color: #808030;">(</span>camera<span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">CameraManager:ActivateCamera</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">coolopening</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span> <span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> ShowCabCamera<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
ShowCamera<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">CabCamera</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> ShowTracksideCamera<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
ShowCamera<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TrackSideCamera</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end</pre>
<br />
It might seem redundant to have "ShowCabCamera" simply call ShowCamera when it could simply call the SysCall itself, this is a style choice you can make. Personally I like to keep duplication to a minimum and the cost of a function call in these situations is minimal, so the code remains nicely readable and there's only one place that actually calls the game.<br />
<br />
Having built yourself a nice library of helper functions (and this is a process you can apply to everything we talk about in these posts) your actual main code becomes quite a bit more readable:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEventStart<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
ShowCamera<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">coolopening</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end</pre>
<h2>
Recorded Messages and Cinematic Cameras</h2>
<br />
It is perfectly possible, and some times quite desirable, to link playing a cinematic camera with a recorded message. It's important to remember to reset the camera back to the cab when you do this, as shown in the following example where I want to have a cinematic highlight a road traffic accident that the player is driving past. I would have set up the scene using scenario-specific assets, then put the camera on it to fly around it a bit. I could then call it like this:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> StartDisplayRTA<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
ShowCamera<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">RTACamera</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StopDisplayRTA<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
ShowCabCamera<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventShowRTA<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
DisplayRecordedmessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">RTA</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end</pre>
<br />
Here you can see i'm continuing to use the new library of functions i've built up previously and the code is immediately far more readable than a bunch of SysCall's all over the place. In this case the cinematic will play as normal and when it finishes it will return to the cab. If the player then clicks on the "previous message" button on the HUD then it will simply re-play the cinematic and when finished go back to the cab.<br />
<br />
As mentioned in an earlier article, you really can use the Recorded Message function for all kinds of things, not just messages. <br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com1tag:blogger.com,1999:blog-2198684265915171562.post-83807294933207848002015-02-06T09:12:00.000+00:002015-02-06T09:12:00.812+00:00TS2015 - Scenario Scripting in LUA Part 3 - HTML Pop-Up MessagesContinuing this series of articles about how to make use of LUA scripting in scenarios, this time we're going to take a look at how you can pop up a message box that contains HTML, including images and formatting.<br />
<br />
If you haven't read the previous two articles or seen the YouTube video recording from the live Twitch session then I would strongly recommend doing so first. The aim of these articles is really to dig a bit deeper and be a bit more detailed, so it might miss out some steps (all of which should be covered in the video).<br />
<br />
You can find the video here: <a href="https://www.youtube.com/watch?v=1RcO_og8q7M">https://www.youtube.com/watch?v=1RcO_og8q7M</a><br />
<h2>
Where are HTML files placed?</h2>
You cannot place the HTML files directly in the Scenario folder, it is important to note that they are localised (meaning you can display different files for different languages, such as having a German HTML file shown to a German user, or an English one to an English user).<br />
<br />
If your scenario is located in:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">c:\program files (x86)\steam\SteamApps\common\RailWorks\Content\Routes\6700a000-afeb-4129-8b36-3a88d83ed073\Scenarios\502f3106-14cc-4626-8421-700ee44610a7</span><br />
<br />
Then your English HTML files must be in an "En" folder beneath that, i.e.<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">c:\program files (x86)\steam\SteamApps\common\RailWorks\Content\Routes\6700a000-afeb-4129-8b36-3a88d83ed073\Scenarios\502f3106-14cc-4626-8421-700ee44610a7\En</span><br />
<br />
Your German scenario files will be in a "De" folder beneath that, i.e.:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">c:\program files (x86)\steam\SteamApps\common\RailWorks\Content\Routes\6700a000-afeb-4129-8b36-3a88d83ed073\Scenarios\502f3106-14cc-4626-8421-700ee44610a7\De</span><br />
<br />
and so forth.<br />
<br />
If you want to include any images then they should be in the base scenario folder (i.e. one folder above where the HTML files are).<br />
<br />
For most cases, images should be 128x128 in size, if you want something bigger then note that they need to be multiples of 128, e.g. 256x256 or 128x256. If you go above 128x128 then you must always pop up LARGE message boxes (more on that in a moment).<br />
<br />
It's important to note that the HTML files shown in in-game message boxes cannot be very complex and only a minimal amount of HTML is supported.<br />
<br />
Here's an example, simple, HTML file to get us started:<br />
<br />
<pre class="html prettyprint" id="htmlOutput" style="-ms-word-wrap: break-word; -webkit-text-stroke-width: 0px; background-color: #fefbf3; border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.2); box-shadow: 0px 1px 2px rgba(0,0,0,0.098039); color: #404040; display: block; font-size-adjust: none; font-stretch: normal; font: 12px/18px Monaco, "Andale Mono", "Courier New", monospace; height: 333px; letter-spacing: normal; margin: 0px 0px 18px; overflow: scroll; padding: 9px; text-indent: 0px; text-transform: none; white-space: pre-wrap; width: 648px; word-spacing: 0px;"><span class="tag" style="color: #000088;"><html></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><body</span><span class="pln" style="color: black;"> </span><span class="atn" style="color: #660066;">bgcolor</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"#ff0000"</span><span class="tag" style="color: #000088;">></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><font</span><span class="pln" style="color: black;"> </span><span class="atn" style="color: #660066;">color</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"#ffff00"</span><span class="pln" style="color: black;"> </span><span class="atn" style="color: #660066;">face</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"Arial"</span><span class="pln" style="color: black;"> </span><span class="atn" style="color: #660066;">size</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"3"</span><span class="tag" style="color: #000088;">></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><table></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><tr></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><td><img</span><span class="pln" style="color: black;"> </span><span class="atn" style="color: #660066;">src</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"../professor.png"</span><span class="pln" style="color: black;"> </span><span class="atn" style="color: #660066;">width</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"128"</span><span class="pln" style="color: black;"> </span><span class="atn" style="color: #660066;">height</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"128"</span><span class="tag" style="color: #000088;">></td></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><td></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><p><b></span><span class="pln" style="color: black;">Welcome to this scenario</span><span class="tag" style="color: #000088;"></b></p></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"><p></span><span class="pln" style="color: black;">Can you </span><span class="tag" style="color: #000088;"><i></span><span class="pln" style="color: black;">finish</span><span class="tag" style="color: #000088;"></i></span><span class="pln" style="color: black;"> it in one piece??</span><span class="tag" style="color: #000088;"></p></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"></td></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"></tr></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"></table></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"></font></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"></body></span><span class="pln" style="color: black;">
</span><span class="tag" style="color: #000088;"></html></span></pre>
In this file, we've used a table to create two columns, in the left hand column is an image (which must be placed in the main scenario folder) and the right hand column has some example text with basic formatting options.<br />
<br />
Save that file as "introtext.html" in the En folder.<br />
<h2>
Scripting</h2>
The next step is to update the script so that it will call up our HTML message box.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> OnEventIntroduction<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Title of the box</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">introtext.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> MSG_VCENTRE <span style="color: #808030;">+</span> MSG_CENTRE<span style="color: #808030;">,</span> MSG_REG<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end</pre>
<br />
I've included a copy of the "OnEvent" function just to remind you how we get to the "OnEventIntroduction" function.<br />
<br />
So you can see that to open a message box, we use ScenarioManager:ShowInfoMessageExt and pass in a bunch of parameters.<br />
<br />
Let's just dig in to each one of those, starting from after the name of the function.<br />
<br />
The title of the message box<br />
The HTML file that you want to display (the En or De etc bit will be added automatically)<br />
MSG_VCENTER means center it vertically, this could also be MSG_TOP or MSG_BOTTOM.<br />
MSG_CENTER means center it horizontally, this could also be MSG_LEFT or MSG_RIGHT.<br />
MSG_REG means make a middle-sized regular box, this could also be MSG_SMALL or MSG_LRG.<br />
Finally, the "TRUE" at the end means that while this message box is displayed, the game should be paused. If this is FALSE then the game will continue even though the message box is still displayed.<br />
<br />
If you want to use an image of greater size then 128x128 then you will need to use a MSG_LRG if you want to avoid an unsightly scrollbar appearing.<br />
<br />
That's really all there is to it, in the next article, i'll talk about how to make it so that these pop-up messages can be recalled by the player any time they want to re-read through the instructions you're giving them as they go.<br />
<br />
Don't forget to follow the blog so that you are kept immediately up to date with new posts and if you have any feedback I'd love to hear it in the comments section!<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com0tag:blogger.com,1999:blog-2198684265915171562.post-80618806166098325612015-02-06T09:11:00.001+00:002015-02-06T09:11:30.002+00:00TS2015 - Scenario Scripting in LUA Part 4 - Recorded MessagesFollowing on from the series begun earlier, this post talks about how you can allow your users to recall pop-up messages easily.<br />
<br />
If you're providing any kind of instruction to the player then you should definitely use the Recorded Message capability of the scripting system to handle that pop-up message box so that the player can bring it back on-screen to remind themselves what they need to do.<br />
<br />
Let's write a quick function to simplify showing these messages, this will allow us to use a more simple command later when we want to actually show them, as well as enforce a degree of consistency on our code later on.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> DisplayRecordedMessage<span style="color: #808030;">(</span> messageName <span style="color: #808030;">)</span>
SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">RegisterRecordedMessage</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">StartDisplay</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> messageName<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">StopDisplay</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> messageName<span style="color: #808030;">,</span> <span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end</pre>
<br />
The way that the Recorded Message capability works is that you tell it a function name to execute when it shows message and another function to execute when it hides the message. In the case of simply showing a simple or HTML message you generally won't have anything in the "stop" function. Where things get potentially complex and powerful is when you realise you can put any code in those functions, so you can trigger cameras, audio playback and so forth. As an example, if you use the "Start" function to trigger a cinematic camera then the "Stop" function probably should put it back to the cab view.<br />
<br />
Let's define those two functions now for a simple HTML pop-up:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> StartDisplayIntroText<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:ShowInfoMessageExt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Title of the box</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">introtext.html</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> MSG_VCENTRE <span style="color: #808030;">+</span> MSG_CENTRE<span style="color: #808030;">,</span> MSG_REG<span style="color: #808030;">,</span> TRUE <span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> StopDisplayIntroText<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
end</pre>
<br />
<br />
So, why did we call the functions "StartDisplayIntroText" and "StopDisplayIntroText" ? Let's actually write some code to call "DisplayRecordedMessage" and that will complete the picture.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEventStart<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">IntroText</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end</pre>
<br />
Again, this is done using our previously described mechanism of having each event in its own function.<br />
<br />
You can see that when we call DisplayRecordedMessage we are passing in the parameter "IntroText", the DisplayRecordedMessage function will then find the two functions that begin "StartDisplay" and "StopDisplay" that have this in them - so StartDisplayIntroText and StopDisplayIntroText, and register them with the game to show a recorded message.<br />
<br />
When you call DisplayRecordedMessage the game will immediately call the StartDisplay function and when the player closes the message box, the game will call the StopDisplay function.<br />
<br />
That's it for todays post - tomorrow I will talk about Cinematic Cameras as well as how you can call up the standard cameras from script such as the Cab Camera.<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com2tag:blogger.com,1999:blog-2198684265915171562.post-58136970982665951432015-02-06T09:11:00.000+00:002015-02-06T09:11:00.284+00:00TS2015 - Scenario Scripting in LUA Part 2 - Debugging with LogMateContinuing our series on using LUA scripts to enhance your Scenarios, I thought that it was prudent to cover how to debug your scripts as early as possible. That way, when things start going wrong (they will, trust me!) then you have the knowledge to figure out what's going on and then how to fix it.
<br />
<h2>
Getting LogMate Running</h2>
Logging in Train Simulator is done via a tool called LogMate, we'll need to add some command line parameters to Train Simulator in order to enable this and set it up.
<br />
<br />
First, go to the in-game settings for Train Simulator and change it so that it's running in a window, this will make life much simpler.
Once you've done that, close the game. Now go to the Steam Launcher, go to the Library and find Train Simulator. Right Click on it and select Properties. Click "Set Launch options".
<br />
<br />
In the box that comes up, you need to type the following:
<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">-LogMate -SetLuaFilters="All" -lua-debug-messages</span>
<br />
<br />
It is important that you get all the capitalisation correct, if you make any mistakes it will not work.<br />
<br />
Click OK and then the next time you launch the game, the LogMate window will open.
It's important to note that while the LogMate window is open, the game is logging a <i>lot</i> and this will definitely slow the game down. At any point, you can simply close the LogMate window to return the game to full performance (without logging of course) however to get it back again you must restart the game.<br />
<br />
Once LogMate is running you will see a screen that looks like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIdVrCxmT3hef-BH1jen-n3gVliER85ieHv6tk-SM0emp2yHKL0YmTSLuddYtk77MrMZlGmdaAkHa1-r24q-CF7T1KeW3HxzTqbF5xg6AF-CYXPyz58bER4zV4WZy4hNgwLEPrNMCh-J8/s1600/Untitled+picture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIdVrCxmT3hef-BH1jen-n3gVliER85ieHv6tk-SM0emp2yHKL0YmTSLuddYtk77MrMZlGmdaAkHa1-r24q-CF7T1KeW3HxzTqbF5xg6AF-CYXPyz58bER4zV4WZy4hNgwLEPrNMCh-J8/s1600/Untitled+picture.png" height="200" width="400" /></a></div>
<br />
The main part of the window is where logging will appear.<br />
<br />
In the File menu there are a couple of options - Save Log and Clear Logs. You can click "Save Log" to save everything out to disk, which will enable you to search it in another application such as Notepad++ much more easily.<br />
<br />
Clear Logs is an option you will need to get used to using regularly. As the game logs to LogMate, it will fill up - if you leave it too long, you'll find the game begins to slow to a crawl, once this happens it is quite hard to get it back again without simply closing it however if you keep pressing "clear log" this keeps everything moving relatively smoothly. Find out how long it takes to fill up and then just keep an eye on it and clear it out before that happens.<br />
<br />
Once you've started the game, LogMate will start receiving logging text, here's an example of what it might look like:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2Xj-u-RnQVqe4TtdGNk2CVSkiHwpzTCGqPKUUw6Wf5GPFJJukmsfyQnHUHjN51t8NqoQjG2dxf-sJ8wWr_3CO2Gbb8fIrQbYabOi8eHnlnYeGqORNIO6zxiUkRBYbQ_OZiGKABdgpXU/s1600/Untitled+picture+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2Xj-u-RnQVqe4TtdGNk2CVSkiHwpzTCGqPKUUw6Wf5GPFJJukmsfyQnHUHjN51t8NqoQjG2dxf-sJ8wWr_3CO2Gbb8fIrQbYabOi8eHnlnYeGqORNIO6zxiUkRBYbQ_OZiGKABdgpXU/s1600/Untitled+picture+2.png" height="197" width="400" /></a></div>
<br />
You can see that there's lots of complicated text in the logging, for the most part you can really just ignore a lot of the detail. The aim here is going to be to look at your own logging rather than the in-game logging, and generally find anywhere it says "error" and see if it's something caused by your script.<br />
<br />
Along the top you can see a number of new tabs have appeared, these help separate the logging in to various subsystems within the game, though for the most part I generally simply stick with the "All" tab.<br />
<h2>
Sending Log Text to LogMate</h2>
When you're testing debugging your script you are going to want to put in some simple logging to try and work out "did it get here?", "well, what's that value then?" and so forth. With the help of this logging you can then work out what path the game took through your code and where the code went wrong.<br />
<br />
Writing to LogMate is very easy:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;">print <span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">This is a line of logging</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span></pre>
<br />
You can also add variables, so let's take our OnEvent function and add some interesting logging:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
print <span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent called - event is [</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event <span style="color: #808030;">.</span><span style="color: #808030;">.</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">]</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end</pre>
<br />
You can see that the two dots, "..", are used to allow us to append other things to the string in the "print" statement, including continuing on with the string.<br />
<br />
Tip: Whenever printing a value, I like to always wrap it in brackets, that way I know for sure if the value has any extra characters like newlines in it, or if there's anything else generally of note.<br />
<br />
You can also print numbers the same way:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> TestConditionOverspeed<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Player speed [</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> speed <span style="color: #808030;">.</span><span style="color: #808030;">.</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">] m/s</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end</pre>
<br />
As a general point of style, I would recommend including common information that helps gather your log entries together, so in an event handler perhaps always include the name of the event being handled, such as this:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEventIntroText<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
print<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEventIntroText() - Started</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
<span style="color: #808030;">--</span> <span style="color: maroon; font-weight: bold;">do</span> some stuff
print<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEventIntroText() - Finished</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
end</pre>
<br />
In this way you can simply do a search for "OnEventIntroText" in the log file later and you'll see all the lines of log that came out of that function.<br />
<h2>
Debugging Process</h2>
As a general process, when you're debugging you need to work methodically and not assume anything. Prove all facts to ensure that you don't end up spending hours looking at a problem and not seeing it because you assumed "well it can't possibly be wrong here" - in most cases, that's exactly where the problem ultimately sits!<br />
<br />
I would recommend having a debug line at the start of OnEvent to log each event as it is fired. Don't log at the top of TestCondition unless necessary as this will badly spam the log file, use it to prove you're getting the right conditions to check and then remove the log entry again.<br />
<br />
I would also recommend logging each event that you handle, so if you're using the function-based method I recommend in the first part of this tutorial, then a line of log at the top of each of those functions will prove it got in to the right function that you were expecting it to.<br />
<br />
If you are reading any values from controllers or as the returns from other function calls perhaps to get the player engine speed or signal states etc then it's worth logging those values out.<br />
<br />
At various decision points in your code where you have "if/then/else" type statements, you could log the variables that you're checking before the IF statement and then log inside each of the "then" or "else" sections so that you can trace through where it actually ended up going.<br />
<br />
Debugging is an investigative process and one that will take time to really get to grips with. <br />
<br />
Imagine that there's an invisible person running through your code and you're trying to figure out what he's doing. Any time that invisible person steps on a "print" statement you can get a line of log - and therefore by being clever about where you put these print statements you can build up a picture of where he went and why he went there. Using this information you are then well armed to correct any errors and make him go where you want!<br />
<br />
Here's a quick example:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspedCondition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;"><</span> <span style="color: green;">4.47</span><span style="color: #808030;">)</span> then
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Overspeed1</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerDeferredEvent</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck2</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">5</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
This function has problems, it's there to detect when we exceed 10mph but nothing is happening, so let's put some debug in and try to find out why.<br />
<br />
First step - let's check TestCondition and if we're detecting the condition correctly. Since this is a spammy log entry we'll just do that first, the new function looks like this:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition() - Condition[</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition <span style="color: #808030;">.</span><span style="color: #808030;">.</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">]</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspedCondition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;"><</span> <span style="color: green;">4.47</span><span style="color: #808030;">)</span> then
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Overspeed1</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerDeferredEvent</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck2</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">5</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
When we run it in LogMate, save the log file after our test and then open it in Notepad, if we search for "TestCondition" we see:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span><br />
TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<br />
(etc)<br />
<br />
So we can see two conditions are being fired, which is what i'd expect in my scenario script, but I still can't see a problem so let's check the IF statement. We'll leave the existing "print" statement in place.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition() - Condition[</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition <span style="color: #808030;">.</span><span style="color: #808030;">.</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">]</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspedCondition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition() - Checking for the overspeed condition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;"><</span> <span style="color: green;">4.47</span><span style="color: #808030;">)</span> then
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Overspeed1</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerDeferredEvent</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck2</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">5</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
So, now we've got two log entries - one happens each time TestCondition is called and the other confirms we're in our specific check for overspeed.<br />
<br />
When we run it, this is what we end up with in the log:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span><br />
TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<br />
Hmm, that looks remarkably familiar and it proves we're not getting in to our overspeed check code. This means that the "if" statement is what's wrong and we can now pull out our microscope and find out why. Having done that, I realise that I've mis-spelled the condition name in the "if" statement! Let's correct that and re-run.<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Checking for the overspeed condition</span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span><br />
TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Checking for the overspeed condition</span></span></span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Checking for the overspeed condition</span></span></span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Checking for the overspeed condition</span></span></span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[StoppedCondition]</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Condition[OverspeedCondition]</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Checking for the overspeed condition</span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><br />
</span>Better, we're now getting in to the "if" statement, but what happened when I ran it was that I immediately got told I was overspeeding even though I hadn't moved yet. So let's find out what's happening there. Now that we're know we're in the "if" statement, i'm going to comment that logging out, that way we can easily put it back if we want but for the time being it's out of our way.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
<span style="color: #808030;">--</span> print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition() - Condition[</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> condition <span style="color: #808030;">.</span><span style="color: #808030;">.</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">]</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>condition <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">OverspeedCondition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
<span style="color: #808030;">--</span> print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition() - Checking for the overspeed condition</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
speed <span style="color: #808030;">=</span> SysCall<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PlayerEngine:GetSpeed</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition() - Overspeed - Speed[</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> speed <span style="color: #808030;">.</span><span style="color: #808030;">.</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">]</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>speed <span style="color: #808030;"><</span> <span style="color: green;">4.47</span><span style="color: #808030;">)</span> then
print <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition() - Overspeed - We are going too fast!</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span>
DisplayRecordedMessage<span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Overspeed1</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
SysCall <span style="color: #808030;">(</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">ScenarioManager:TriggerDeferredEvent</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">starttoofastcheck2</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #008c00;">5</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_SUCCEEDED<span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
In our updated function, we are now reporting the speed of the loco that was returned to the script from the game, and then reporting if we got in to the "if" statement once we reached overspeed. Let's run it and see what we get.<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Overspeed - Speed[0.01235532]</span><br />
<span style="font-family: "Courier New", Courier, monospace;">TestCondition() - Overspeed - We are going too fast!</span><br />
<br />
Wait, hang on, even though the speed was definitely very low, we still succeeded that IF statement and got in to the overspeed code! We need to scrutinise that IF statement, and upon doing so we realise that what it currently reads is "if the current speed is LESS than 4.47 meters per second", oops. Once that is fixed, the script is now running correctly.<br />
Closing Notes<br />
Debugging is something that is going to take time to learn how to do so stick with it, once you get the hang of it you will be able to quickly work out what is happening and identify the many causes of problems that might be haunting you in your script.<br />
<br />
Another tool I recommend for analysing log files that you've saved is Log Expert, which you can get for free here: <a href="http://www.log-expert.de/">http://www.log-expert.de/</a><br />
<br />
To use LogExpert, run LogMate as normal to get the log file and save it out. Then run LogExpert.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCGs93nnY_7vMe3yKw-9dP0P_3i4bwGLbcOxcVT_PdFb8jqBLbv90AKz7iK-yp_CcoKQ6JPjSIa7-L7Rk94ZGQ2ravxXIAGDo0akTeDZv0wAEI3mVXl-6GGyC5vAgz8l45VcnTsR7xCV8/s1600/Untitled+picture+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCGs93nnY_7vMe3yKw-9dP0P_3i4bwGLbcOxcVT_PdFb8jqBLbv90AKz7iK-yp_CcoKQ6JPjSIa7-L7Rk94ZGQ2ravxXIAGDo0akTeDZv0wAEI3mVXl-6GGyC5vAgz8l45VcnTsR7xCV8/s1600/Untitled+picture+3.png" height="173" width="400" /></a></div>
<br />
Drag Drop the log file you saved on to it and it will log in to a tab which you can browse and search as normal. Where LogExpert really comes in to its own however is Filtering and Highlighting.<br />
<br />
On the View/Navigate menu, select Filter and a new section will appear in the bottom half.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5RcIGBJjK0LVY9VcPU-TKDHvztiPGxErhdI7TbiWWFSgS51zjRLL0Bf-6L_i1-7OP_Js0-bvOsipk3TrA-foBl5_-YxTOopV6qtBeDoGtObJVAv5VfpIWSMmwvgCP5DQHMXGIhpdImaw/s1600/Untitled+picture+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5RcIGBJjK0LVY9VcPU-TKDHvztiPGxErhdI7TbiWWFSgS51zjRLL0Bf-6L_i1-7OP_Js0-bvOsipk3TrA-foBl5_-YxTOopV6qtBeDoGtObJVAv5VfpIWSMmwvgCP5DQHMXGIhpdImaw/s1600/Untitled+picture+4.png" height="175" width="400" /></a></div>
<br />
In the "Text Filter " field you can type parts of your log entries - this is where having good common logging will really help. E.g. it's here you could type "TestCondition" from the example above, and see precisely every thing in the log file that contains that phrase. If you want to get more complex, learn Regular Expressions (not for the faint of heart, but very powerful) and you can even type Regular Expressions in this field to search based on a complex search string by ticking the "regex" field.<br />
<br />
To do highlighting, which can make navigating complex logs much easier than trying to search specific things out, click on the Options menu and then select Highlighting and Triggers.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbKdBFTTO0socxXzYEhHCXePITnn-QSt4gwg337R5I0MzimSO-GBMXGb2YsqrGzJsGOurdsyCvdWzSkdYR0HnJVOgpaG0T9mCqezkBk01GmvmEFHSoRIPQ2rGUShBAssIppjxaCXu_tME/s1600/Untitled+picture+5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbKdBFTTO0socxXzYEhHCXePITnn-QSt4gwg337R5I0MzimSO-GBMXGb2YsqrGzJsGOurdsyCvdWzSkdYR0HnJVOgpaG0T9mCqezkBk01GmvmEFHSoRIPQ2rGUShBAssIppjxaCXu_tME/s1600/Untitled+picture+5.png" height="400" width="286" /></a></div>
<br />
In the "Search string" field, type in the phrase you want to pick out (this can be a regular expression too if you want). Choose a foreground and background colour in the bottom left and then click the Add button in the middle section. When you click OK, anything in the log that contains this text will now be highlighted.<br />
<br />
Highlighting is great for many reasons - it may be that you want to look for a variety of things but for various reasons can't search, perhaps you want to see around the entry more and get more context for the entry. Perhaps the lines you're finding are good at marking the start of something and you just want to then read the log - once it's highlighted you can simply scroll through and you'll find it very easy to quickly pick out the highlights and navigate the log file.<br />
<br />
Finally, when your scenario is working well make sure you go back and either remove or at least comment out all of your debug. Leaving debug in <i>can</i> cause a performance slow-down even if the player isn't running LogMate.<br />
<br />
Hope that was useful, it was long and detailed but I wanted to cover everything needed to debug your scripts - you'll be coming back to this article as you get more proficient at scripting scenarios and run in to more challenges where things don't quite work, so don't worry if it doesn't all make sense just yet.<br />
<br />
I'd love to hear your feedback in comments and don't forget to follow the blog to make sure you find out about future articles - there are quite a few planned in this series!<br />
<br />
<br />
<br />
<br />Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com1tag:blogger.com,1999:blog-2198684265915171562.post-49046389388135478312015-02-03T17:39:00.003+00:002015-02-03T17:39:18.321+00:00TS2015 - Scenario Scripting in LUA Part 1 - Getting StartedLast night on Twitch I did another tutorial about scenario creation, this time it covered the much more complex topic of using LUA scripting to add a lot of other cool things to your scenarios.<br />
<br />
I thought i'd start this blog to allow me to put other commentary on the topic as well as provide access to various script snippets to help you reproduce the techniques in your own work.<br />
<br />
I'm not going to go in to great step by step detail, that was covered in the show and available on YouTube.<br />
<br />
The video from the show is here: <a href="https://www.youtube.com/watch?v=1RcO_og8q7M">https://www.youtube.com/watch?v=1RcO_og8q7M</a><br />
<br />
Once you've got your script created and have a scary blank window in your editor of choice (I use Notepad++), the first thing you're going to want to do is drop some definitions in to make the code easier to read as we go. Here they are - just copy and pasted to the top of your script file:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: #808030;">--</span> <span style="color: #0f4d75;">true</span><span style="color: #808030;">/</span><span style="color: #0f4d75;">false</span> defn
FALSE <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
TRUE <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
<span style="color: #808030;">--</span> condition <span style="color: maroon; font-weight: bold;">return</span> values
CONDITION_NOT_YET_MET <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
CONDITION_SUCCEEDED <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
CONDITION_FAILED <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span>
<span style="color: #808030;">--</span> Message types
MT_INFO <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span> <span style="color: #808030;">--</span> large centre screen pop up
MT_ALERT <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span> <span style="color: #808030;">--</span> top right alert message
MSG_TOP <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
MSG_VCENTRE <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span>
MSG_BOTTOM <span style="color: #808030;">=</span> <span style="color: #008c00;">4</span>
MSG_LEFT <span style="color: #808030;">=</span> <span style="color: #008c00;">8</span>
MSG_CENTRE <span style="color: #808030;">=</span> <span style="color: #008c00;">16</span>
MSG_RIGHT <span style="color: #808030;">=</span> <span style="color: #008c00;">32</span>
MSG_SMALL <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span>
MSG_REG <span style="color: #808030;">=</span> <span style="color: #008c00;">1</span>
MSG_LRG <span style="color: #808030;">=</span> <span style="color: #008c00;">2</span></pre>
<pre class="brush: javascript"></pre>
Next, you'll want to put in the standard function definitions that the game will call:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
end</pre>
<br />
Anyone who codes a lot knows the golden rule about not putting too much code in any one single function. Unfortunately these two functions are going to inherently get very big with lots of "if this then that else if this then the other etc etc". Fortunately LUA comes to the rescue with a neat capability that I didn't cover in the show. Modify the above two functions to read as follows:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
return _G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end
<span style="color: maroon; font-weight: bold;">function</span> TestCondition<span style="color: #808030;">(</span>condition<span style="color: #808030;">)</span>
return _G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">TestCondition</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end</pre>
<br />
What this does is mean that every event or condition can now be placed in to its own function!<br />
<br />
So where we might have had this before:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span> <span style="color: #808030;">(</span>event <span style="color: #808030;">==</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">IntroText</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span> then
<span style="color: #808030;">--</span> <span style="color: maroon; font-weight: bold;">do</span> some stuff
end
end</pre>
<br />
Now we've got this:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> OnEventIntroText<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: #808030;">--</span> <span style="color: maroon; font-weight: bold;">do</span> some stuff
end
<span style="color: maroon; font-weight: bold;">function</span> OnEvent<span style="color: #808030;">(</span>event<span style="color: #808030;">)</span>
_G<span style="color: #808030;">[</span><span style="color: maroon;">"</span><span style="color: #0000e6;">OnEvent</span><span style="color: maroon;">"</span> <span style="color: #808030;">.</span><span style="color: #808030;">.</span> event<span style="color: #808030;">]</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
end</pre>
<br />
Now any time you want to add a new event you just need to add a new function.<br />
<br />
The same applies with conditions; using the snippet above for the modified TestCondition, the conditions will now go to their own function such as this:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;"><span style="color: maroon; font-weight: bold;">function</span> TestConditionOverspeed<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> CONDITION_NOT_YET_MET<span style="color: purple;">;</span>
end</pre>
<br />
That's the foundations of your script in place, in future articles i'll start covering specific features.<br />
<br />
I'd love to hear your feedback on this article, not just if you like it but if there's anything you think could be improved!<br />
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; word-spacing: 0px;">
<span style="color: #008c00;"></span> </div>
Train Sim Livehttp://www.blogger.com/profile/09616717278173382993noreply@blogger.com10