tag:blogger.com,1999:blog-44706290659128240482024-02-20T00:42:18.301+00:00FreeRCTBits and bobs about the development of the free and open source game inspired by RollerCoaster TycoonUnknownnoreply@blogger.comBlogger36125tag:blogger.com,1999:blog-4470629065912824048.post-3803474135061083872015-03-17T00:02:00.001+00:002015-03-17T00:06:09.534+00:00Google Code to GitHub, Subversion to GitGoogle Code is <a href="http://google-opensource.blogspot.com/2015/03/farewell-to-google-code.html">shutting down</a>.<br />
<br />
Although there was no need to rush our decision (the site will not become read-only until 24 August), the FreeRCT dev team began discussing alternatives straight away.<br />
<br />
The discussion started with where to move the project to (GitHub, SourceForge, Bitbucket, or self-hosted). Of course, moving the project to one of the aforementioned options also meant a likely change in the version control system (VCS) used (see: allowed).<br />
<ul>
<li><i>GitHub</i> (GH) primarily supports Git (of course), with some Subversion support that we did not think would be worth dealing with.</li>
<li><i>Bitbucket</i> would give us more flexibility with its support of both Mercurial and Git; nevertheless, the interface is somewhat lacking when compared to GH, and searching for projects as an anonymous user is not as user-friendly (not helpful for project visibility).</li>
<li><i>SourceForge</i> (SF) would allow us to stay with Subversion; of course, this would mean using SF's interface, something that none of the devs seemed particularly excited about. </li>
<li>Some <i>other</i> sites and VCSs were mentioned, if for nothing more than to provide a bit of jocularity to the serious discussion. </li>
<li>Finally, the team briefly discussed the possibility of going the <i>self-hosting</i> route. Although we may eventually go down this road, it was decided that there is no real need for it in the project's current state.</li>
</ul>
After receiving feedback from the rest of the team, it was decided to make the move to GitHub. Admittedly, the team was in a state of wonder as to how the entire process would go, especially with regards to how GitHub would handle Google's wiki format and the fact that we already had a Read-only mirror in place at GitHub.<br />
<br />
Lucky for FreeRCT, we had the unique combination of our own LordAro, as well as Google's (admittedly fancy) 'Export to GitHub' functionality.<br />
<br />
<b>Operation successful</b>: <a href="https://github.com/FreeRCT/FreeRCT">FreeRCT.</a><br />
<br />
With the move to GitHub complete (minus a few small changes being made as I write this), the team can refocus its efforts on making this awesome game.<br />
<br />
Hopefully this post gave you a good overview of what was involved in moving the FreeRCT project from one site and system to another. As always, you can continue to stay up to date on FreeRCT happenings through all your favorite sites, including checking here at this blog. :)<br />
<br />
<div style="text-align: left;">
Until next time,</div>
<div style="text-align: left;">
<b>The FreeRCT Dev Team</b></div>
<i>"FreeRCT is really good value!"</i>Anonymousnoreply@blogger.com6tag:blogger.com,1999:blog-4470629065912824048.post-743361042402293392015-03-04T07:03:00.001+00:002015-03-04T07:03:28.239+00:00Q1 2015 Report<div style="text-align: left;">
<b>Hello fellow FreeRCTers!</b></div>
<div style="text-align: left;">
<b><br /></b>
It has been an interesting past half of a year for the FreeRCT dev team, and we wanted to take the chance to update our eager followers with what we have been up to.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Real life aside, the dev team has been contributing as much time as is possible to the entire FreeRCT project, pushing updates ranging from necessary bug fixes and improved continuous integration support all the way up to entirely new features that will excite end users, most of which are highlighted in the Changelog below.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
As noted in the upcoming changes sections, there are significant features and improvements in the pipeline (or queue path :D) that we are working hard on and will hopefully be adding to the official project within the next couple of months.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
To those eager for more frequent updates, there can, of course, be no promises from us; nevertheless, with this post, the hope is to continue updating you all with the most significant changes as time allows. On the plus side, the less time we dedicate to writing posts, the more time we are probably using to improve the code and assets of the game, as well as brainstorm further improvements and ideas to add to our ever-growing ideas/to-do list. :)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Until our next official update, you can follow us on <a href="https://twitter.com/FreeRCT">Twitter</a> (and like us on <a href="https://www.facebook.com/Freerct">Facebook</a>), visit our <a href="http://freerct.org/">home page</a>, watch for code updates at the <a href="https://code.google.com/p/freerct/source/list">official repository</a>, read our other posts on this blog, join our <a href="https://www.reddit.com/r/freerct">subreddit</a>, check out the <a href="https://code.google.com/p/freerct/w/list">wiki</a>, and/or <a href="https://code.google.com/p/freerct/wiki/Contributing">get involved</a>.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Until next time,</div>
<div style="text-align: left;">
<b>The FreeRCT Dev Team</b></div>
<div style="text-align: left;">
<i>"FreeRCT is really good value!"</i><b> </b></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<b>Changelog (1 September 2014 - 4 March 2015):</b></div>
<ul style="text-align: left;">
<li>Guests 'going home' walk to the edge of the world before disappearing.</li>
<li>Thunder and (ride) state lights (not in game-play use yet).</li>
<li>More items for shops to sell to guests.</li>
<li>Toilets (Building and guest visitation support).</li>
<li>Guest mood changes based on weather and umbrella possession.</li>
<li>Initial support for guests on rides. </li>
<li>Guests are informed of ride destruction.</li>
<li>Guests exit rides.</li>
<li>Multiple improvements to the renderer.</li>
<li>Initial queuing for ride support for guests. </li>
<li>Removal of guests from a ride upon its deletion.</li>
<li>Guests stop buying food/drink upon bathroom necessity.</li>
<li>Initial path decoration support.</li>
<li>Support for Unicode character input and handling key input.</li>
<li>Underground mode view.</li>
<li>Support for single tile click (and hold-drag) path placement (and removal).</li>
<li>Ability to change (override) path type of currently placed path(s).</li>
<li>Coverity support (Travis CI).</li>
<li>Numerous bug fixes, documentation improvements, and other behind-the-scenes updates.</li>
</ul>
<div style="text-align: left;">
<b>Upcoming gameplay changes:</b></div>
<ul style="text-align: left;">
<li>Ability for persons in the world to handle (walk on) non-path tiles correctly.</li>
<li>Ability to pick up, move, and drop persons in the world.</li>
<li>Initial staff (employees) support.</li>
<li>Further enter / exit ride support for guests.</li>
</ul>
<div style="text-align: left;">
<b>Upcoming engine changes:</b></div>
<ul style="text-align: left;">
<li style="text-align: left;">Replacement of SDL2 with GLFW. </li>
<li style="text-align: left;">Replacement of window mouse modes with an improved approach.</li>
</ul>
Anonymousnoreply@blogger.com6tag:blogger.com,1999:blog-4470629065912824048.post-71251101568357544282014-08-31T11:52:00.000+01:002014-08-31T11:52:01.300+01:00Guests, paths, and park borders<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGKdFYnpGK_a007XD2aAwwtgi65a1MPjXm3dn-vTQpl21nDnnkzTf3WYMUoT4558b9YVzjak3hyphenhyphendOk7d4kDg_AnlKc_xSTwSdHgakPT8N5Pl5DYzuCNArJTR3MTrROVr81itJbt2q90So/s1600/path_finding2.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/AVvXsEhGKdFYnpGK_a007XD2aAwwtgi65a1MPjXm3dn-vTQpl21nDnnkzTf3WYMUoT4558b9YVzjak3hyphenhyphendOk7d4kDg_AnlKc_xSTwSdHgakPT8N5Pl5DYzuCNArJTR3MTrROVr81itJbt2q90So/s1600/path_finding2.png" height="158" width="320" /></a></div>
Until yesterday, guests were randomly walking around over the paths, buying things when they happened to pass a shop that sold something they needed.<br />
They also didn't care about park borders, walking in and out of the park wherever the path went. Luckily they didn't have to pay an entrance fee!<br />
<br />
I added an "activity" to a guest, a short term goal of what they aim to do. The first activity of a guest is now "enter the park". As soon as it reaches land owned by the park, the activity changes to "wander around in the park". Eventually, other activities will be added, such as "go to a ride", or "go home".<br />
<br />
Making a guest stay in the park was then quite easy. Whenever a guest is "wandering", block any path leading to a tile that is outside the park. Since a guest starts wandering when it is inside the park, blocking the paths to non-owned tiles makes it stay in the park.<br />
<br />
Having an activity such as "enter the park" is nice, but how does a guest find out where to go? For us it is easy usually, we see the paths, and can often immediately point out the shortest route to the destination. A computer can list all path tiles very quickly, you can teach it when two path tiles are adjacent, but it does not know easily which tiles to use for quickly getting in the park.<br />
<br />
Luckily, three smart people figured out a solution to this problem a long time ago, and created an algorithm for it, which is known as <a href="http://en.wikipedia.org/wiki/A*_search_algorithm">A*</a>. Basically, you try every possible direction that you can go <i>at the same time</i> (making copies of yourself to walk in different directions is easy in a computer). With every step (or tile) that you walk, you measure the distance that you walked, <i>and</i> you estimate the length of the remaining path. Since paths in FreeRCT are either in X direction or in Y direction (ignoring height for simplicity), the <a href="http://en.wiktionary.org/wiki/Manhattan_distance">manhattan distance</a> to the destination point is used as estimate. You add both numbers, and the position with the lowest sum is the best to try taking the next step. The rationale behind it is that if you walk in the "wrong" direction, the length of the walk increases, but the estimate also increases. The sum of both numbers thus gets bigger rather quickly. If you walk in the "right" direction, the length of the walk increases, but the estimate decreases (since you get closer to your goal), so the sum of both numbers stays more or less the same.<br />
<br />
Positions in walks in the "right" direction get a lower sum, and are more favourable to explore further. Taking such steps continue until you found a position at the destination (or until you tried all paths that you can reach). When you reached the destination, the path is also known, and the guest at the junction knows whether to go left or right to enter the park.<br />
<br />
You see both things in action in the picture. The two guests outside the park are trying to get to the park as quickly as possible, and walk straight rather than turn left to enter the park more to the north.<br />
Guests inside the park 'bump' into the park ownership boundary, and wander back and forth on the three tiles that they can reach.Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com3tag:blogger.com,1999:blog-4470629065912824048.post-18873200229134786372014-08-23T13:07:00.000+01:002014-08-23T13:31:08.958+01:00Developing using Visual Studio on Windows<br />
If you prefer to develop on Visual Studio over using Linux, there have been some improvement in this area recently. If you like Linux better, then you can continue to enjoy that. The point here is not to claim that one is better than the other.<br />
<br />
On the wiki, we have <a href="https://code.google.com/p/freerct/wiki/BuildProgramVisualStudio">documented </a>a number of steps that you need to carry out in order to compile using Visual Studio 2013 with the source code changes that were recently committed. The level of documentation is intended for programmes familiar with Visual Studio. The list is not as short as I would like it to be, but it is a first start. At some point we will probably look into providing a package with pre-compiled libraries for building FreeRCT instead of shamelessly referring to OpenTTD-utils for zlib and png. It may also be possible to add some code to CMakeList.txt so that we can just point to where FreeRCT utils bundle is to set up all library paths in one go.<br />
<br />
Still, while the current list is a bit long, most steps are only needed on the first compile. If you re-generate the project files, no manual tweaking is needed.<br />
<br />
<br />
<br />
If you are just interested to play in Windows and are not familiar with programming, you can of course try to follow the instructions, but I'm sorry this is just the first step on establishing a development environment for people who like to develop on Windows. But this means that hopefully there will be binaries for you to try later on.Leifhttp://www.blogger.com/profile/13601833992406520897noreply@blogger.com0tag:blogger.com,1999:blog-4470629065912824048.post-21683128586289430512014-08-17T23:00:00.000+01:002014-08-17T23:04:07.739+01:00Fences<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<br />
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiufk2V94JXFd5vKzEgzKWXnIwHfT17ijunZrzv94CXq5KYeSMEuHZL9d2-i4gOMbizd-q27ATN5iQUsKfYNeIq97Li5KIeA8fUYuh-Zqd2_0Iq9zKQd00hn8-qzRooLSjAX0aDL7EXUVmo/s1600/fence.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/AVvXsEiufk2V94JXFd5vKzEgzKWXnIwHfT17ijunZrzv94CXq5KYeSMEuHZL9d2-i4gOMbizd-q27ATN5iQUsKfYNeIq97Li5KIeA8fUYuh-Zqd2_0Iq9zKQd00hn8-qzRooLSjAX0aDL7EXUVmo/s1600/fence.png" height="236" width="320" /></a><span lang="EN-US" style="mso-ansi-language: EN-US;">Some time
ago I started to work on the task to add park borders. The first thing I did
was to add land ownership which I guess some of you have seen when you tried to build
things near the border of the map and suddenly there is an invisible border
there. I’m sorry for anyone who may have been upset about that.</span></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US;">Well, now
this border is not invisible anymore, because finally my work on fences has
resulted in park border fences. I think it is now more than 8 months ago that I started
with the fences. Then got busy with other things, got back to it a few times and then now finally got the time
to finish it up so that you all can enjoy not hitting the invisible wall. </span></div>
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>SV</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Normal tabell";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0cm;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]-->
<br />
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US;">The fences
in FreeRCT now come in 4 types. A park border type which you cannot build
yourself, and 3 types that you can build yourself using the new GUI for building fences. A feature that I don’t remember if RCT had, is that you can use the
landscaping tools on a tile and the fence and the fence will adopt to the new slope.</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US;"><span lang="EN-US" style="mso-ansi-language: EN-US;">I have also
worked on making paths and fences aware of each other, and had it working quite
nicely 7 months ago, but this patch is now in a broken state and needs fixing.</span> </span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US;">On the technical side, one of the challenges with fences is what to do with sloped tiles. As you might know, the world is composed of voxels. For flat tiles, it is easy, store the fences in the ground voxel. However, if the slope have two raised corners and a fence between those corners, then that fence actually belongs to the voxel above. Furthermore, in FreeRCT there is also so called steep slopes that cover two voxels. This adds more special cases that all needs to be handled to build, draw and update fences correctly when the landscaping tools are used.</span></div>
<div class="MsoNormal">
<br /></div>
Leifhttp://www.blogger.com/profile/13601833992406520897noreply@blogger.com4tag:blogger.com,1999:blog-4470629065912824048.post-88846219611774420592014-08-02T09:11:00.000+01:002014-08-02T09:11:29.442+01:00Queue paths<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxd79nLLEXcDDy9en0mMYMI6HLrpBTuDfYK-Ng23lILQF-xy1f8b4FMNSQ7btXujDjmvPj-IrLTiBCs3ELlcm4zxFBYGb2w8jct7kyUVu36dJPZJ7cPOHt9oMNXZbpfUZtF0AnTmgTSLQ/s1600/queuepaths.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/AVvXsEjxd79nLLEXcDDy9en0mMYMI6HLrpBTuDfYK-Ng23lILQF-xy1f8b4FMNSQ7btXujDjmvPj-IrLTiBCs3ELlcm4zxFBYGb2w8jct7kyUVu36dJPZJ7cPOHt9oMNXZbpfUZtF0AnTmgTSLQ/s1600/queuepaths.png" height="222" width="320" /></a></div>
The second item I have been busy with is paths.<br />
<br />
FreeRCT could use a little bit more variety in paths, in particular, it needs queueing paths that you put in front of a ride for quests to wait for a chance to experience the attraction.<br />
<br />
The first step was to add different types of paths. The Path build window was extended. As you can see we now have up to 4 different types of path (4 rows). The second step was to denote each path type as being a normal path to walk on, or a queueing path. This is denoted by the two columns. The gui can probably be reduced a bit further by merging some rows.<br />
<br />
Adding different types of path, and saying it's a queueing path is one thing. Making it actually work that way is another.<br />
<br />
If you build a number of normal path tiles next to each you get a nicely fully covered area as you can see at the left of the picture. It's great for making a grand entrance of the park (although something less dull than grey could be useful :) ). For queueing in front of a ride however, you don't want areas, you want a long path, or in technical terms, each path tile should be connected to at most two other path tiles.<br />
<br />
This is what the blue queue path tiles do. They connect to at most two other tiles, preferably other queue tiles. As a result, if you build such a path from the bottom left to the top right (first the bottom lane and then the top lane), you get two separate paths rather than one big area.<br />
<br />
<br />
Now that you can build queues quite easily, I need to teach the quests about queues. The need to walk behind each other, and stop walking when there is no room in front of them. Finally rides must pickup the first guest from the queue until the ride is full, and deliver the quests at the exit afterwards.<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com3tag:blogger.com,1999:blog-4470629065912824048.post-47170531468517422642014-07-27T14:57:00.001+01:002014-07-27T14:57:54.084+01:00Weather<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgST6yg9_z8sk2kN0HDOvUrBy2iVb7YLotzGnuBKlmryxb_53ve2UaTHZ_c437EKaGmdRyNOuNfz5RwwjNbVQfns0ycHpX2Y8LibAPSnxcuoWNvRqPv350Jtd2jVXJytQuSqmXX25uFR1U/s1600/weather.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/AVvXsEgST6yg9_z8sk2kN0HDOvUrBy2iVb7YLotzGnuBKlmryxb_53ve2UaTHZ_c437EKaGmdRyNOuNfz5RwwjNbVQfns0ycHpX2Y8LibAPSnxcuoWNvRqPv350Jtd2jVXJytQuSqmXX25uFR1U/s1600/weather.png" height="283" width="320" /></a></div>
Got distracted by real life stuff for a while, the dev blog is a bit behind on current developments. On the other hand, the features are nice enough not to summarize in a few sentences, so here goes the first one, namely support for weather. <br />
<br />
<br />
The weather was a bit of a puzzle to make. The basic idea is to make the world look brighter on a sunny day, and more grey on a clouded or rainy day.<br />
<br />
The first requirement was of course the ability to lighten or darken the entire world view. It's like recolouring, but a) every pixel changes instead of only a few, and b) colours only get lighter or darker. The previous step of getting proper recolouring some months ago also solved the gradient shifting, so that was already available.<br />
<br />
Interestingly, the more tricky part was deciding what weather should be displayed. In reality, weather "just happens". In a game, you have to program it. To program it, you need an algorithm to decide what weather should be displayed!<br />
<br />
In the end I made a table for each month, how often each type of weather in that month occurs. Then by drawing a random number (uniform distribution over the sum of occurrences of all weather types), the 'new' weather is decided.<br />
<br />
Immediately jumping to that new weather would be a bit weird however, you'd have sun one day, and thick rain the next. To make the transition more smooth, the change is done gradually in a few days.<br />
<br />
The temperature is interpolated between the average temperatures of each month. This may be a bit too simplistic but it will do for now.<br />
<br />
<br />
With the weather type and temperature decided, smoothly changing to new weather over a couple of days, and connecting the current weather to the gradient shifting, we have bright sunny days and dark cloudy days now as you can see in the pictures. Other effects of the weather still have to be programmed.<br />
Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com6tag:blogger.com,1999:blog-4470629065912824048.post-55509106747488112112014-05-25T12:21:00.000+01:002014-05-25T12:21:09.991+01:00The apple drops<iframe allowfullscreen="" frameborder="0" height="315" src="//www.youtube.com/embed/L_JAtZGHL0Q" width="420"></iframe>
<br />
<br />
Could watch it for hours, couldn't you? :)<br />
No friction yet, so passengers will have to jump out of the car as it passes through the station, but that's a small price to pay...Lord Arohttp://www.blogger.com/profile/09806347683912821140noreply@blogger.com24tag:blogger.com,1999:blog-4470629065912824048.post-68834027812867106892014-05-05T17:31:00.000+01:002014-05-05T17:31:42.627+01:00Ice creams in all colours!<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3OIO-z_DTyDWAnOyCKJGIBvjYVQ3Kj6oFrZS1Ycvi59ZlOA_wxa65nJYavae3zg2pyyEkJT2XWnULF7tfQvYnW8KbiApXa-5i9bCoo-WF9SK_z09ZH4rTkmBw3X4vGe01Xd0yYsei7D4/s1600/ice_creams_recoloured.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/AVvXsEg3OIO-z_DTyDWAnOyCKJGIBvjYVQ3Kj6oFrZS1Ycvi59ZlOA_wxa65nJYavae3zg2pyyEkJT2XWnULF7tfQvYnW8KbiApXa-5i9bCoo-WF9SK_z09ZH4rTkmBw3X4vGe01Xd0yYsei7D4/s1600/ice_creams_recoloured.png" height="245" width="400" /></a><br />Hello again,<br />
<br />
Until now, only the guests got different colours when they entered. In the original game, many more things could have a different colour, amongst others, the shops.<br />
<br />
FreeRCT did have a notion of recolouring for quite some time, but either the graphics didn't allow use of it, or it was not really working.<br />
<br />
Today, I committed a set of patches that should fix all that. The 32bpp blitter now also does recolouring. I have also added a dropdown to allow selecting a new colour if the random colours are not to your liking.<br />
<br />
Last but not least, there is a new shop, the ice cream stall. It's a 32bpp sprite, and as you can see, it comes in all (re)colours.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<!-- Blogger automated replacement: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3OIO-z_DTyDWAnOyCKJGIBvjYVQ3Kj6oFrZS1Ycvi59ZlOA_wxa65nJYavae3zg2pyyEkJT2XWnULF7tfQvYnW8KbiApXa-5i9bCoo-WF9SK_z09ZH4rTkmBw3X4vGe01Xd0yYsei7D4/s1600/ice_creams_recoloured.png" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3OIO-z_DTyDWAnOyCKJGIBvjYVQ3Kj6oFrZS1Ycvi59ZlOA_wxa65nJYavae3zg2pyyEkJT2XWnULF7tfQvYnW8KbiApXa-5i9bCoo-WF9SK_z09ZH4rTkmBw3X4vGe01Xd0yYsei7D4/s1600/ice_creams_recoloured.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-sKw5MvuLn7c%2FU2e6s-CvCCI%2FAAAAAAAAAN4%2F6667n_VNNoM%2Fs1600%2Fice_creams_recoloured.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3OIO-z_DTyDWAnOyCKJGIBvjYVQ3Kj6oFrZS1Ycvi59ZlOA_wxa65nJYavae3zg2pyyEkJT2XWnULF7tfQvYnW8KbiApXa-5i9bCoo-WF9SK_z09ZH4rTkmBw3X4vGe01Xd0yYsei7D4/s1600/ice_creams_recoloured.png" -->Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com3tag:blogger.com,1999:blog-4470629065912824048.post-90721182153574642982014-04-12T09:14:00.001+01:002014-04-12T09:14:56.174+01:00Welcome to the 21st century <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtDjBiJ5eRHW2HheKYHWBQ-KJHV8JHm3e2KIMysb1I5WuFl06eqjpko7NXtZVYVxwMf9mQQR4pRV-3E5gOCyd_9O7FK86jDTz9xl1TLkEV5X_qM2FQxAGP1G_mkc3SMft-jYKvV3i7z0k/s1600/find_the_differences.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/AVvXsEgtDjBiJ5eRHW2HheKYHWBQ-KJHV8JHm3e2KIMysb1I5WuFl06eqjpko7NXtZVYVxwMf9mQQR4pRV-3E5gOCyd_9O7FK86jDTz9xl1TLkEV5X_qM2FQxAGP1G_mkc3SMft-jYKvV3i7z0k/s1600/find_the_differences.png" height="91" width="320" /></a></div>
We are slowly moving to the less visible features, and the feature I am talking about today is one of them (in a sense).<br />
<br />
If you're following the news about SDL (our video and keyboard interface), you know that after many many years, a new SDL version has been released (SDL 2.0). One person found that interesting enough to clone our github repository, and modify the program for the new interface. Unfortunately, he left before I had a chance to look at the changes in detail and discuss them.<br />
<br />
Another thing that has come up at times is the question of 32bpp colour (aka full colour) support. At the start of the project, we considered 8bpp colours enough (just like the Rollercoaster Tycoon 1 & 2 programs). However, you see an increasing interest in full colour from users. Also, the video hardware is moving away from 8bpp. In other words, eventually, we will need full colour support for the program. Thus, I took this opportunity to add 32bpp support to the program, together with the switch to the new SDL 2.0 library.<br />
<br />
At the top-right you see the <i>before</i> and <i>after</i> images. Looks the same, you say? Well, you're right about the grass. In both images it's the same sprite. The shop however is different, as you can see below at 800% zoom. The left part shows the shop as we had it from the start. The right part is the same shop, but in 32bpp. The right image is much smoother at 800%, without the weird coloured pixels here and there.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga78s7BHfUDlSg2ujAXqGbWMimUCyYtX4dOHk5GU4-8z1s6syA5EVXCBacAVIgvznYIix5c-7tnEa8YCzI4-FK8Jb2cdaZfQrv3pe9eF3E2q1CFGIpOr8yu4D0KH2d4ssgC5XlNIvvmKg/s1600/closeup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga78s7BHfUDlSg2ujAXqGbWMimUCyYtX4dOHk5GU4-8z1s6syA5EVXCBacAVIgvznYIix5c-7tnEa8YCzI4-FK8Jb2cdaZfQrv3pe9eF3E2q1CFGIpOr8yu4D0KH2d4ssgC5XlNIvvmKg/s1600/closeup.png" height="130" width="320" /></a></div>
<br />
Technically, the program accepts and renders both 32bpp and 8bpp images. Our current shop sprite isn't a great example of what you can do with full colour support, but I am sure we will get shiny new colourful graphics somewhen.<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com8tag:blogger.com,1999:blog-4470629065912824048.post-27356540526286698112013-12-29T09:42:00.001+00:002013-12-29T09:42:57.701+00:00Moving coaster carsHello all,<br />
<br />
If you are watching the YouTube FreeRCTGame channel, you know already, there is a new video.<br />
<br />
It shows building of a small roller coaster, followed by a moving coaster car (at fixed speed, and not rotating along with the tracks). For some reason, the blog doesn't allow me to link to the video directly (thank you so much, smart user interface), so instead I post the url: <a href="http://www.youtube.com/watch?v=aqBzyJIvrrg">http://www.youtube.com/watch?v=aqBzyJIvrrg</a> I hope you like it.<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com8tag:blogger.com,1999:blog-4470629065912824048.post-10219548205856976272013-11-02T10:23:00.002+00:002013-11-02T10:23:40.848+00:00Car tracks<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihe8ByNmjBTWTSss2uYc_wkhf1X5KNJfPUp9LcC91a7ouq3ziaGLd-xIPY-RgWumd78pN3XoP68D9L89pUi0kHYUzMyXmlH19EsRp0PaHNw5Diyb8xgZbBGO7T2Pg1aHHXZRAPgckB_VA/s1600/car_paths.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihe8ByNmjBTWTSss2uYc_wkhf1X5KNJfPUp9LcC91a7ouq3ziaGLd-xIPY-RgWumd78pN3XoP68D9L89pUi0kHYUzMyXmlH19EsRp0PaHNw5Diyb8xgZbBGO7T2Pg1aHHXZRAPgckB_VA/s320/car_paths.png" width="276" /></a></div>
After tracks, the next step is obviously to have some cars on them, carrying paying guests of course!<br />
In the real world, you just put the car on the track, and it will follow them. In the digital world of make-believe, car graphics don't care about track graphics, and you have to explicitly tell them how to move through the world.<br />
<br />
If you remember the original Rollercoaster Tycoon programs, you'll know tracks came in all kinds of bendy shapes, so how to do that?<br />
<br />
One answer that should work (we think), is segmented <a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve">cubic bezier splines</a>. Basically, you define a start and end point in 3D space, and two intermediate control points (also in 3D), and the bezier algorithm computes a smooth line from the start to the end point. For the more bendy shapes, one such spline is not sufficient, you either need a higher order bezier curve (but it's math becomes complicated), or you chain a number of cubic splines after each other. If you do that careful, the cross-over from the end of one spline to the start of the next spline is also smooth.<br />
<br />
So far so good, bezier splines gives a line of rope through 3D space for the car to follow. But what about the orientation of the car? (Keep in mind, the car ignores the track graphics!)<br />
<br />Just a line doesn't tell whether the car is up-right or upside-down (or anything in-between). To solve this problem, a track also needs a <a href="http://en.wikipedia.org/wiki/Flight_dynamics_%28aircraft%29">roll orientation</a> for every point at the line. A smooth path from a starting roll value to an ending roll value (in degrees).... Another segmented cubic bezier spline to express the roll orientation in degrees!<br />
<br />
From the direction of the 3D line (for the mathematically inclined, its derivative) and the roll, the pitch and yaw can be computed (hopefully, I haven't actually tried that yet).<br />
<br />
For the test rollercoaster track graphics, roll is simply 0 (upright orientation), so that's easy. The path involved a bit more experimenting. I made a small Python program that plotted the path curve onto the existing track graphics, and tuned the start, end, and control points until it all looked ok. You can see the result above.<br />
<br />
For example, the path of the level-to-going-down-track in negative x direction (bottom-right sprite) is defined as<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">car_xpos: splines { cubic { a: 255; b: 150; c: 100; d: 0; length: 1000; } }</span><span style="font-family: "Courier New",Courier,monospace;">car_ypos: splines { cubic { a: 128; b: 128; c: 128; d: 128; length: 1000; } }<br />car_zpos: splines { cubic { a: 80; b: 78; c: 50; d: 15; length: 1000; } }<br />car_roll: 0;</span><br />
<br />
The <b>roll</b> is 0, as expected. The <b>x position</b> runs from 255 (point <i>a</i>) to 0 (point <i>d</i>), with intermediate control points at 150 and 100. The <b>y position</b> is 128 all the time. The <b>z position</b> starts at 80, and ends at 15 (points <i>a</i> and <i>d</i>). Point <i>b</i> at 78 is almost the same height as point <i>a</i>, so near the start the path is almost level. Point <i>c</i> is much higher than point <i>d</i>, so it goes down more steeply.<br />
<br />
<br />
So far, it all looks good, but getting to the point of a car following the track on the screen will be quite some work. Then we will see whether the above math actually works :)<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com11tag:blogger.com,1999:blog-4470629065912824048.post-61104734479980043742013-10-19T14:12:00.000+01:002013-10-23T12:24:44.713+01:00Quick updateJust a quick update to let you know we're still here!<br />
<br />
<h4>
Recent changes</h4>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCqZbEv18-HyGLZzY99cYAtZCQHvOBaKhgpIeeKRKbq6yFVREJhXfrv6HFJ7LPnFRb9mmYDxUSOUfevrQC93fK3fd03kSb76FYQWVmBvWPR9rOQ6HUUuR8TMR4mVx8tR1kKLnCW0VMUY/s1600/2013-10-19--1382188183_340x131_scrot.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/AVvXsEjDCqZbEv18-HyGLZzY99cYAtZCQHvOBaKhgpIeeKRKbq6yFVREJhXfrv6HFJ7LPnFRb9mmYDxUSOUfevrQC93fK3fd03kSb76FYQWVmBvWPR9rOQ6HUUuR8TMR4mVx8tR1kKLnCW0VMUY/s1600/2013-10-19--1382188183_340x131_scrot.png" /></a></div>
<h3>
Languages</h3>
You can now change language ingame, via the new settings window. Language strings appreciated!<br />
<br />
<h3>
Bug fixes</h3>
<div>
There had been a nasty bug for quite some time where FreeRCT crashed whenever a guest visited a shop. Since that is still basically our main 'feature', it was somewhat important that we got that fixed.</div>
<div>
<br /></div>
<div>
Numerous other minor fixes, including a memory leak in rcdgen.</div>
<div>
<br /></div>
<h3>
Build System</h3>
As some of you may have noticed, FreeRCT's build system has been switched to a CMake system. This makes cross-platform much easier (<a href="https://code.google.com/p/freerct/wiki/BuildProgram">Build Instructions here</a>). However, there are some notes:<br />
<br />
<br />
<ul>
<li>Existing checkouts may be broken, due to CMake not recognising existing generated files. To fix this, you must delete the existing generated files<br />With svn, this can be done with:<br />"svn st --no-ignore | grep '^I' | awk '{print $2}' | xargs rm -rf"<br />Remember to backup your freerct.cfg !</li>
</ul>
<div>
<br /></div>
<ul>
<li>Please test the build system on your OS, whatever it is and report any problems you have, to the <a href="https://code.google.com/p/freerct/issues/list">bug tracker</a>. FreeRCT <u>should</u> build on all Operating systems now, but there might be some problems with the build system initially. Note that we cannot help you with regards to installing individual libraries, as we have no idea ourselves, but if you manage it and the process is particularly difficult, tell us how so we can add it to the wiki.</li>
</ul>
EDIT: Existing translations can be found <a href="https://code.google.com/p/freerct/source/browse/trunk#trunk%2Fgraphics%2Frcd%2Flang">here</a>, in the default_**.txt files<br />
<br />
Thanks<br />
Lord AroLord Arohttp://www.blogger.com/profile/09806347683912821140noreply@blogger.com5tag:blogger.com,1999:blog-4470629065912824048.post-46215453249065989182013-09-07T11:58:00.002+01:002013-09-07T11:58:52.062+01:00Birthday surprise: Coaster tracks!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFWuKbuWon26xEEkgzXG75mHKeoEmzVrg7QfClPq9XHQ3hW8i_5kfDvmcUQ40fxwWACL1vheYg_rLuYcqKEDdc2LySSE9Dkl1m9qvHFLoFg7yGkIeOMGzOmDnGnjObGK71FHIfMOivYEY/s1600/coaster_yay.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFWuKbuWon26xEEkgzXG75mHKeoEmzVrg7QfClPq9XHQ3hW8i_5kfDvmcUQ40fxwWACL1vheYg_rLuYcqKEDdc2LySSE9Dkl1m9qvHFLoFg7yGkIeOMGzOmDnGnjObGK71FHIfMOivYEY/s320/coaster_yay.png" width="320" /></a></div>
Hello all,<br />
<br />
Time sure flies when you're busy. Next week it is the second birthday of the project.<br />
<br />
Look at the right what present we got?<br />
<br />
Indeed, you can build tracks of a roller coaster. It's still very rough version. Delete doesn't work, back and forward doesn't work either. Platforms are still invisible. But who cares, One big step towards getting a playable game!<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com6tag:blogger.com,1999:blog-4470629065912824048.post-24805045831480122472013-05-20T10:16:00.002+01:002013-05-20T10:16:42.827+01:00HurdlesIt has been a while since the last blog about the development.<br />
Those of you that follow the commit logs, know development has not stopped.<br />
The main reason not to post anything is that there is not much to show to you. All changes are preparation for the next step, namely getting a roller coaster rolling. It looks like it's going to be a long ride with a lot of hurdles.<br />
<br />
After getting all the nice coaster ride sprites from Richard, the first hurdle was getting them loaded in the game. The Python RCD file generator didn't want to co-operate, so I spent a month on ditching the thing. We now have a shiny new C++ implementation. Not only is the generation process faster (which will be useful with larger roller coasters, the number of sprites is going to explode!), it also means you don't need Python any more to build RCD files. This is very useful for whoever is going to enable development at windows.<br />
<br />
The next hurdle was making room for coaster data inside the game. A roller coaster is a 'ride', just like the shop (with both, a guest enters, does something, and leaves again). Thus logically a coaster belongs next to the shop. The code however did not agree sufficiently, so I have been pushing it into a better shape for some weeks. The game can now load the coaster sprite data (it contains a lot more than just the sprite, the shape of every piece is also stored, and which piece can be connected to which other piece).<br />
<br />
The previous hurdle is still causing some small trouble, but that's manageable. The next hurdle I somewhat expected, but yesterday I found out how large it was exactly. It is not a pretty sight :(<br />
<br />
Once you can load pieces of track, the next thing you want is to allow the world to display it. (Basically, you want to be able to say "draw that track piece at this position in the world".) Displaying it is the stepping stone to making a GUI window for editing coaster tracks in the world. (And having a rollercoaster ride in the world is in its turn the stepping stone to adding cars, and adding physics so the cars move in virtual gravity.)<br />
<br />
Unfortunately, the current display storage doesn't even look right. It will need a lot of restructuring to push it into any usable shape. It might be easier to just write the thing again. What's worse, there is a lot of code attached to that display storage. Paths decide how they connect, shops decide where they can be placed, guests decide where they can walk. A small change in the display storage has already a large impact, let alone a major restructuring like I need to do.<br />
<br />
<br />
So this is what is happening. We're not dead, far from it.<br />
There are 'just' an unknown number of hurdles in the way, and I am fighting with a big one for the next weeks or months.Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com21tag:blogger.com,1999:blog-4470629065912824048.post-66842004476532820942013-05-06T18:26:00.001+01:002013-05-06T18:26:14.467+01:00Contributing and InfoIt has become apparent that some people who would like to contribute to the project are unable to do so, as they do not know what needs to be done. Short answer: Everything!<br />
<br />
Seriously. The project is still in its early stages, and any contributions are welcome. A guide to contributing is located at our <a href="https://code.google.com/p/freerct/w/list">wiki</a>, specifically <a href="https://code.google.com/p/freerct/wiki/Contributing">here</a>. Hopefully all the necessary information is there. Comment below if you feel something is missing.<br />
<br />
Also set up recently was a '<a href="https://groups.google.com/forum/?fromgroups=#!forum/freerctgame">Google Group</a>'. You should be able to use this to discuss things and future content etc. (Although what you'd actually usefully discuss is somewhat unknown at this time)<br />
<br />
Oh, we also have a <a href="https://www.facebook.com/Freerct">FaceBook page.</a> It's, umm, quiet.<br />
<br />
In FreeRCT development news, preliminary work is being done to add the first Roller Coasters!<br />
<br />
Any other questions, leave a comment below!Lord Arohttp://www.blogger.com/profile/09806347683912821140noreply@blogger.com2tag:blogger.com,1999:blog-4470629065912824048.post-90599109531233664362013-01-14T21:58:00.000+00:002013-01-14T21:58:20.567+00:00The Graphics GuyAs the guy who draws the graphics I don't get to show off amazing videos of building paths, modifying terrain or opening shops, though all the graphics in those videos are my work. As I <a href="http://freerct.blogspot.co.uk/2011/09/graphics-and-development.html">said before</a> we are aiming to produce all the graphics ourselves. This may seem like a crazy huge task, but it will give us more flexibility and ease in getting the fundamentals of the game up and running - we can custom make any and all the graphics exactly as we need. "Home made" graphics certainly doesn't mean we are compromising on quality though!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYkx44L1TKqHUul3XAZs04nsLpNfMhy5ktgx2j2TQ81bzKpCEmU8N7i27_oneZyKCuw-A-vx8zYJYMEzn3GT7nbigxtd-O3K1MNYa0HbYvcuioCrHdf-VPBgfzm_rPcNPPz8W5HtFQp8Yj/s1600/track1x1basic_template8bpp64.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYkx44L1TKqHUul3XAZs04nsLpNfMhy5ktgx2j2TQ81bzKpCEmU8N7i27_oneZyKCuw-A-vx8zYJYMEzn3GT7nbigxtd-O3K1MNYa0HbYvcuioCrHdf-VPBgfzm_rPcNPPz8W5HtFQp8Yj/s1600/track1x1basic_template8bpp64.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Basic track tiles</div>
<br />
It is likely that about 20,000-30,000 separate images will be needed for all the game graphics. This is a huge number but through smart use of 3D software and automation making these graphics is comparatively simple. Since starting the FreeRCT project I have been working on several projects with similar graphical requirements to FreeRCT. These projects have let me work out streamlined workflows for creating this type of image; my last major project was an extra zoom level graphics set for OpenTTD. If you are interested you can read more about that project at these blog entries: <a href="http://calculatedimages.blogspot.co.uk/2013/01/openttd-32bpp-making-massive-graphics.html">Making a Massive Graphics Update</a>, <a href="http://calculatedimages.blogspot.co.uk/2013/01/openttd-32bpp-part-2-moving-to-3d.html">Moving to 3D</a>, <a href="http://calculatedimages.blogspot.co.uk/2013/01/openttd-32bpp-part-3-automation.html">Automation</a>, <a href="http://calculatedimages.blogspot.co.uk/2013/01/openttd-32bpp-part-5-finished-product.html">The Finished Product</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQjZ3kYbpk3aN9qo72jUEy8cvbSuXeO8g7Q68TI244r7gfv2eX70aLJiuqWoedF-0iNeVbOp9TU0whzEZStb5LvR3wf5ahu8332mtcFECeL_FRQebFe1-0kx-AGUuMYgtUtLjc2v4UM4FU/s1600/template8bpp64.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQjZ3kYbpk3aN9qo72jUEy8cvbSuXeO8g7Q68TI244r7gfv2eX70aLJiuqWoedF-0iNeVbOp9TU0whzEZStb5LvR3wf5ahu8332mtcFECeL_FRQebFe1-0kx-AGUuMYgtUtLjc2v4UM4FU/s1600/template8bpp64.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
The very first shop</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So far land, cliff/foundation, water, path and path support graphics for FreeRCT are made (although there are some technical issues that still need working out). The next big challenge will probably to make templates for track rides, in particular the track pieces which stretch over more than one tile.</div>
<br />
<br />Unknownnoreply@blogger.com21tag:blogger.com,1999:blog-4470629065912824048.post-34681090924657217692013-01-05T13:29:00.001+00:002013-01-05T13:30:09.097+00:00We're in business!<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/jPNVrK7zxd8?feature=player_embedded' frameborder='0'></iframe></div>
<span id="goog_26188328"></span><span id="goog_26188329"></span>Today, you can open a shop, and have guests buy things from them. The video demonstrates it :)<br />
(At 3:05 and 4:17.) The recording program had some trouble around 3:38 apparently, the delay and speed-up was not at the screen.<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com9tag:blogger.com,1999:blog-4470629065912824048.post-48715516875401128372012-12-29T16:33:00.000+00:002013-08-18T12:47:44.642+01:00The most wanted feature ever...It's been a long time coming, and due to message-loss (my fault) in the blog registration, has been implemented for a couple of weeks now.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidn8rMprj-NO_2iK7PZweIOsAHfHJMLpFim5pPI4wOp7w9QxtTmaThXt4_Hw_-Bf4mi6rCaZQ3MkTmADzQdMY7oFynZZIz9QQD62xkz6JvFx9ojGSca7dca8oyCATPPr4ckB1I2rpyYNo/s1600/closebox_path.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/AVvXsEidn8rMprj-NO_2iK7PZweIOsAHfHJMLpFim5pPI4wOp7w9QxtTmaThXt4_Hw_-Bf4mi6rCaZQ3MkTmADzQdMY7oFynZZIz9QQD62xkz6JvFx9ojGSca7dca8oyCATPPr4ckB1I2rpyYNo/s1600/closebox_path.png" /></a></div>
The closebox is here!<br />
<br />
Looks good, huh?<br />
<br />
EDIT: As of r830, closebox sprite is now the proper colour.Lord Arohttp://www.blogger.com/profile/09806347683912821140noreply@blogger.com3tag:blogger.com,1999:blog-4470629065912824048.post-83061227763812880882012-12-08T10:18:00.002+00:002012-12-08T10:18:45.085+00:00Mountains in FreeRCT<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmbGiHAEhRaqC9DHHrhu5J2EQSR5Todl9D9bNgdaTrNRn8QwTtM9SgVr6Nh8jpvUJz5mwd-gA2stSqbIZbQ0NpiopVp57AUv_wcQGVC8ao3j8s1MFmR9Osd3iMDtZe0gg8o9CPOzSGRLM/s1600/path_demo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmbGiHAEhRaqC9DHHrhu5J2EQSR5Todl9D9bNgdaTrNRn8QwTtM9SgVr6Nh8jpvUJz5mwd-gA2stSqbIZbQ0NpiopVp57AUv_wcQGVC8ao3j8s1MFmR9Osd3iMDtZe0gg8o9CPOzSGRLM/s320/path_demo.png" width="320" /></a></div>
With shops, clicking on stuff and opening a window about it became useful. However, the mouse was always used for terraforming (changing the terrain), so that has to move to its own window first.<br />
<br />
While at it, I decided to also add foundations (the vertical walls between the levels, and at the edge of the world).<br />
<br />
In the picture an example of the result, at the bottom-left the terraform window, with the main part displaying the size of the area you modify (from a single corner-point to a 10x10 tile area).<br />
You can either level the area (move the lowest parts up or the highest parts down), or move the entire area as-is (preserving the hills and holes within the area).<br />
<br />
The other thing that got fixed is the connection of the shop with the path. The path is now extended towards the shop. In the air it was difficult to see whether it worked, so I added platforms under the paths and shops. It looked so great that I also added the supports as well.<br />
It is starting to look very nice!<br />
<br />
The code is still somewhat fragile, guests don't know about shops yet, and while preparing the above picture I found that path-building also sometimes gets confused.<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com8tag:blogger.com,1999:blog-4470629065912824048.post-21736529468093827442012-11-09T18:49:00.000+00:002012-11-09T18:49:49.721+00:00Place a shop<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPqFKgnJnegGwfbAmMJu7O3OwWdrCLmZXd6njaKrEgHj1zB7EBMytgwY5dwPLIuqrXS1AdZfbR0AwkxASNiavYJq-eGZrEjxwPN4F6pI0Mjxgswa7VZckVIQQY9W3XYezVI-4s2TyLBNA/s1600/shop_placement.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPqFKgnJnegGwfbAmMJu7O3OwWdrCLmZXd6njaKrEgHj1zB7EBMytgwY5dwPLIuqrXS1AdZfbR0AwkxASNiavYJq-eGZrEjxwPN4F6pI0Mjxgswa7VZckVIQQY9W3XYezVI-4s2TyLBNA/s320/shop_placement.png" width="275" /></a></div>
Yet another step in the right direction, this time placing a 1x1 shop in the world.<br />
<br />
The window at the top allows selection of the 'rides' (only one exists at this time). Click 'select' at the bottom, and optionally rotate it, then move the cursor to where you want to place it, and click again.<br />
<br />
The shop can be placed next to a path, or on the ground.<br />
<br />
<br />
Lack of supports was always somewhat of a problem, and now it has become really useful to spend some time on it, as it is quite impossible to see where you put the shop.<br />
<br />
Other issues that must be resolved are the fact that there is a gap in the path just before the shop, the path has to be extended to the front of the shop.<br />
Also, when placing a shop at the ground, you lose the ground surface (you can see this near at the right back of the bottom shop). This is however not a big problem, it just needs a bit of shuffling of data in a voxel, so you can have a voxel with both a shop and ground surface.<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com6tag:blogger.com,1999:blog-4470629065912824048.post-24730984676168934732012-09-15T09:42:00.000+01:002012-09-15T09:42:25.824+01:00Happy birthday FreeRCTToday, FreeRCT exists for one year, always a happy moment in the life of a project.<br />Time to look back and reflect a bit on what happened.<br /><br />The start was pretty quick. After about a month of talking how, what, and when we decided to just go ahead and do it, and created the FreeRCT project.<br />It has been an interesting ride so far.<br /><br />I started with some world-display code into the project, while Richard provided some first sprites. (Probably everybody starts with a display of the 2D world in a game like this, I think :) )<br /><br />Then the real work started. Since the project literally started from nothing, lots of infra-structure got created in the past year:<br />- A 3D voxel world holding ground and paths (and tomorrow shops and rides).<br />- Display of the world to the screen.<br />- A GUI system for creating and managing the windows.<br />- A string system.<br />- Mouse, keyboard, and screen handling.<br />- Time and clock ticks.<br />- Random numbers.<br />- Colour/brightness parametrization.<br /><br />The infra-structure is still not complete (no rides yet), so in the coming year it will be expanded further. Also, existing parts get replaced or expanded when the need arises (like the replacement of the Python code that generates the RCD files, and the string system that got unified with added translations).<br /><br />The highlight of the past year was of course the moving people video. Your response was heart-warming. A clear sign that many people still like these games. Many thanks for your support, let's hope we get another highlight like that this year.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmqLdVp0fEYaWGt4ipiKUkvsHEToJTA5C0mgdniCFrqox3xY03iTVA0uEBR9DMt5rbtg23Uyt4BVKrah8bM4ErMGB_WyDYPn0dqyzv0i32YthxMoJIIHr9e37i5LsjJSlgU8q2aNbjePw/s1600/ride_select_window.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="144" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmqLdVp0fEYaWGt4ipiKUkvsHEToJTA5C0mgdniCFrqox3xY03iTVA0uEBR9DMt5rbtg23Uyt4BVKrah8bM4ErMGB_WyDYPn0dqyzv0i32YthxMoJIIHr9e37i5LsjJSlgU8q2aNbjePw/s320/ride_select_window.png" width="320" /></a></div>
<br />
Last but not least, a sneak preview of what I am working on (very green currently).Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com4tag:blogger.com,1999:blog-4470629065912824048.post-24909971020209419682012-09-02T21:19:00.002+01:002012-09-02T21:21:01.790+01:00Strings and translations<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8sX8DDxbMCS-Wwwvh_bbfSGd7IPYezDiznpR0BYjOTgVThX4Y0IfAtlqahr6RRpIoHANTRCR50cbUoVI2H3fMK0n-ds6XhtUKsTm6XHk1uYzvyItHsfgJPiPtljIaffoGugtGuXaYk98/s1600/strings_and_translations.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8sX8DDxbMCS-Wwwvh_bbfSGd7IPYezDiznpR0BYjOTgVThX4Y0IfAtlqahr6RRpIoHANTRCR50cbUoVI2H3fMK0n-ds6XhtUKsTm6XHk1uYzvyItHsfgJPiPtljIaffoGugtGuXaYk98/s320/strings_and_translations.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Translated texts</td></tr>
</tbody></table>
It has been a while, but another small step is made. In this case it's strings.<br />
<br />
Remember that one of the aims was that different people could make parts of the game? A consequence of that decision is that every part must have its own strings.<br />
<br />
The hard part was to find a way to have all these strings live together, such that you can combine strings from different parts without worries. A second puzzle was what to do with strings in the game windows. Eventually, this proved to be quite simple, see it as yet another part!!<br />
<br />
While below the surface and in the build system, a lot has changed around strings (I completely removed the old gui string system), at the surface you don't see it. The windows are the same (including the missing closebox, I really should fix that one day). The layout is also the same as before. The only thing that's different is that you can now switch language (by changing a variable and recompiling the source code due to lack of a window for it). The screen shot proves it. Most strings are Dutch (spontaneously provided by Kenny), while some other strings are still English due to not having a Dutch translation.<br />
(Please don't start sending in translations in your favourite language now, I appreciate the thought, but it will be a long time before they become useful, and quite likely strings I have now are obsolete by then. Better wait until the game is somewhat playable.)<br />
<br />Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com0tag:blogger.com,1999:blog-4470629065912824048.post-83143887181754322122012-07-08T10:29:00.000+01:002012-07-08T10:29:50.680+01:00Colourful people<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPI0SM_q2cshqOCaEGFYTmlmVbKBsN_7WGhQuf7KVlLXxFtqm_h-R5PL78Q0qjsaSCAsmMdC0L21lY5uDcLOheCVYx4YZ8jd66Mk3cRVjska7ZwQiKOSXRuumHTGi-k7wFVYz5eISa8OE/s1600/coloured_pillar_people.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPI0SM_q2cshqOCaEGFYTmlmVbKBsN_7WGhQuf7KVlLXxFtqm_h-R5PL78Q0qjsaSCAsmMdC0L21lY5uDcLOheCVYx4YZ8jd66Mk3cRVjska7ZwQiKOSXRuumHTGi-k7wFVYz5eISa8OE/s320/coloured_pillar_people.png" width="320" /></a></div>
First of all, thanks everybody for your support. It is good to know that so many people like the project. Some people went a step further and submitted graphics and a translation. Many thanks, except it will be a while before it can be displayed in the game.<br />
If you want to drop in and chat a bit, there is now an <i>IRC channel <b>#freerct</b> at <b>oftc.net</b></i>. As it was recently created (and this is the first advertisement of its existence), it is still very quiet.<br />
<br />
As a next step, I decided to add random colours, so different guests can have differently coloured cloths, shops and rides can be painted in different colours, etc.<br />
<br />
At the game-side it was no too complicated, and the windows now have colour too (albeit a bit too intense, it needs further work). At the RCD data-file generation side, I wanted more than possible, so I spend two weeks Python code refactoring and extending to allow specifying random recolouring in a nice way (so much for an easy feature :D )<br />
<br />
As usual, I have added a picture showing the new features, the windows have different colours (and there is a 'quit' window too!), and the pillar guests now appear in (almost) all colours of the rainbow.Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com2tag:blogger.com,1999:blog-4470629065912824048.post-5727972906405275712012-05-28T16:41:00.000+01:002012-05-28T16:59:38.763+01:00Guests! (Take 2)After some code shuffling and re-organising of the animation data, FreeRCT now has moving guests.<br />
I did not change the renderer yet, so they are still grey, but it seemed big enough news to let you know anyway!<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="330" src="http://www.youtube.com/embed/FzFXQjSxJZw" width="550"></iframe></div>
<div style="text-align: right;">
<a href="http://youtu.be/FzFXQjSxJZw">[watch in higher quality here]</a>
</div>Alberthhttp://www.blogger.com/profile/17957525462981587518noreply@blogger.com15