<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6934491</id><updated>2011-12-14T18:58:04.525-08:00</updated><category term='Manager'/><category term='templates'/><category term='Marriage'/><category term='data management'/><category term='DNS'/><category term='Visual Sidekick'/><category term='Wedding'/><category term='check'/><category term='Belgium'/><category term='PC Lint'/><category term='modifier'/><category term='Review'/><category term='happyness'/><category term='migrate'/><category term='interfaces'/><category term='Data driven'/><category term='Game Development'/><category term='UltraEdit'/><category term='data module'/><category term='Objects'/><category term='WinMerge'/><category term='Source code'/><category term='nameserver'/><category term='entities'/><category term='Enterprise Architect'/><category term='Visual Lint'/><category term='container'/><category term='Visual Assist'/><category term='domain'/><category term='data value'/><category term='components'/><category term='SCXML'/><category term='Game Programming'/><category term='script module'/><category term='SVN'/><category term='Team Foundation'/><category term='SSCXML'/><category term='UltraCompare'/><category term='State Chart XML'/><category term='vps'/><title type='text'>Programming and other useless stuff</title><subtitle type='html'>Programming is my life. And game development is the highest possible expression of the creativity of this mastership. Read about what I do and feel free to comment...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6934491.post-1489933289302170404</id><published>2009-01-16T11:53:00.000-08:00</published><updated>2009-01-16T15:29:17.141-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Review'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Assist'/><title type='text'>Visual Assist review</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;As I stated yesterday, I’ll start to review my current development environment. If you have read the list of tools I review, you understand that some if not most of them are used in combination. For example: I extensively use Visual Assist together with Visual Sidekick.&lt;/div&gt;Today it’s up to:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:180%;"&gt;Visual Assist by Whole Tomato Software&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Visual Assist is what I call a productivity improvement tool. It integrates seamlessly into Visual Studio and replaces or enhances some of its features. It’s focusing on enhancing the existing IntelliSense, improving code readability, helping you write code faster and last but not least refactoring your code. There are some more features such as code navigation, but there are better solutions for that (see my upcoming Visual Sidekick review).&lt;/div&gt;&lt;span style="font-size:130%;"&gt;&lt;u&gt;Integration and functions&lt;/u&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div align="justify"&gt;Visual Assist integrates into Visual Studio in 7 ways: the VAssist X menu, the Visual Assist X toolbar, two tool windows (Outline and View), the integrated menu when you press the right mouse button, a small VA button within the source code, the IntelliSense enhancement during typing and the down arrow in the context field of the Visual Studio code editor.&lt;/div&gt;&lt;div align="justify"&gt;The &lt;strong&gt;toolbar&lt;/strong&gt; (see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/Toolbar.png"&gt;Image 1&lt;/a&gt;) gives access to the most used features such as “Find reference”, “Find next” and “Find previous” by context or the cpp/h switch button.&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/Toolbar.png"&gt;&lt;img style="MARGIN: 0px; WIDTH: 213px; HEIGHT: 47px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/Toolbar.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 1: The toolbar&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align="justify"&gt;The &lt;strong&gt;VAssist X menu&lt;/strong&gt; (see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/Menu.png"&gt;Image 2&lt;/a&gt;) basically has the same options but contains additional functions such as the code snippets or the refactoring (which will reappear when I’ll talk about the context menu or the IntelliSense enhancements).&lt;/div&gt;&lt;div align="justify"&gt;The menu itself is the less used integration feature of Visual Assist. It I could decide, it would totally disappear from the menu bar because it’s just one more menu at the top. And if, as I do, you have multiple tools that integrate their own menu at the top, finding a menu that you really might need such as the debug menu or the tools menu is means that you have to re-read the menu title anytime you want to access it... They just put themselves at any place they want in the menu bar and the Visual Assist is right between the View menu and the Project menu.&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/Menu.png"&gt;&lt;img style="MARGIN: 0px; WIDTH: 316px; HEIGHT: 431px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/Menu.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 2: The menu&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;The two tool windows are almost never used by me. They have their place, if you don’t have a better alternative to them. &lt;div align="justify"&gt;The first one is the &lt;strong&gt;Outline window&lt;/strong&gt; (see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/Outline.png"&gt;Image 3&lt;/a&gt;). Basically it displays the outline of the current file. As you can see in the image, it groups the functions by classes (similar to the Visual Studio class view) but only for the current file. You can easily access the class functions by double clicking on them... and that’s about it. You cannot for example add a new class member or a new function to the class as you could with the Visual Studio class viewer.&lt;/div&gt;&lt;div align="justify"&gt;What you can do is re-order your header files or your functions via drag and drop. Simply grab a function, a class member or an include and drop it anywhere you want. The code is then inserted between the element before and the element after the drop place. This comes handy if you want to group your function in a particular way. It’s a lot faster than cut and paste.&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/Outline.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 463px; HEIGHT: 591px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/Outline.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 3: The outline window&lt;/span&gt;&lt;/div&gt;&lt;div align="center"&gt; &lt;/div&gt;&lt;div align="justify"&gt;The &lt;strong&gt;VA View window&lt;/strong&gt; (see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/View.png"&gt;Image 4&lt;/a&gt;) is more or less a search window. There are 2 combo boxes: one to find files in you solution, the other one to find symbols. Just type in some letters into the combo box edit field and a list with corresponding files or symbols or functions will appear in the list beneath.&lt;br /&gt;&lt;br /&gt;Now this sounds like a cool feature. But it’s only useful if you’re searching for a function or class member and you’re not completely sure about the name. Chances are that you’re a little bit faster if you use your keyboard wisely and if you assign one or another Visual Assist function to a key. I’ll talk about this later.&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/View.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 192px; HEIGHT: 492px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/View.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 4: The view window&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt; &lt;/div&gt;&lt;div align="justify"&gt;The view window contains another function: If you hover your mouse over a class name, a function name or a class member, the lower part of the view window will display the context of that element. For example, if you hover over a class member name, the class outline is shown with the class member visible (see the &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/View_hover_var.png"&gt;image 5&lt;/a&gt; where I hover over m_onExit; m_onExit is highlighted in the VA View window). &lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/View_hover_var.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 498px; HEIGHT: 467px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/View_hover_var.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 5: The cursor hovering above a class member variable.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt; &lt;/div&gt;&lt;div align="justify"&gt;The next feature I would like to talk about is the &lt;strong&gt;context menu integration&lt;/strong&gt; (when you press the right mouse button;see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/Context_refactor.png"&gt;Image 6&lt;/a&gt;) ). In the example in &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/Context_refactor.png"&gt;image 6&lt;/a&gt;, I put my cursor on load and clicked the right mouse button. As usual, the context menu opens. Visual Assist integrates into this menu through 2 new sub-menus: “Refactor (VA X)” and “Surround With (VA X)”.&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/Context_refactor.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 463px; HEIGHT: 302px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/Context_refactor.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 6: The refactoring context menu&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt; &lt;/div&gt;&lt;div align="justify"&gt;I imagine that you know what it’s all about. While “Refactor” gives you access to the refactoring functions of Visual Assist, “Surround” enables you to easily alter your source code by adding code snippets (see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/Context_surround.png"&gt;Image 7&lt;/a&gt;).&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/Context_surround.png"&gt;&lt;span style="font-size:78%;"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 385px; HEIGHT: 502px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/Context_surround.png" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;Image 7: The surround with source code context menu.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;While I extensively make use of the refactoring functions, I almost never use the surround functions. But that’s me. I know a lot of people who are keen of this feature. In fact, you can add your own code snippets to Visual Assist which then can be inserted into the source code through this menu. As you can see in the screenshot, there’s already a nice selection of snippets which, as I must state here, are dependent on the programming language you use.&lt;/div&gt;&lt;div align="justify"&gt;The refactoring contains functions such as symbol renaming, method extraction, field encapsulation, etc. It would take too much time to explain them all, so please refer to the website (link at the bottom of the review).&lt;/div&gt;&lt;div align="left"&gt;If you hover with your mouse above a symbol (here a function name), a &lt;strong&gt;small button containing a triangle&lt;/strong&gt; will appear (see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/SC_button_hover.png"&gt;Image 8&lt;/a&gt;).&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/SC_button_hover.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 329px; HEIGHT: 57px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/SC_button_hover.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 8: The cursor hovering above a class member function.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left"&gt;Once you press this button, a list of possible Visual Assist operations will appear(see &lt;a target="_blank" href="http://www.sidema.be/BlogSeries/VA/SC_button_press.png"&gt;Image 9&lt;/a&gt;). These contain all functions related to the symbol. In my example, you can add a similar member to the class, change the signature, etc. If I would have hovered above the class name, I would have the option to add a member. &lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://www.sidema.be/BlogSeries/VA/SC_button_press.png"&gt;&lt;img style="MARGIN: 0px 0px 10px 10px; WIDTH: 295px; HEIGHT: 170px; CURSOR: hand" border="0" alt="" src="http://www.sidema.be/BlogSeries/VA/SC_button_press.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Image 9: Once we click on the triangle button, we see the possible Visual Assist operations.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left"&gt;While hovering above the symbol, further information appears such as the function declaration or the variable declaration. Any comment that is just above the declaration is displayed.&lt;/div&gt;&lt;div align="justify"&gt;It’s difficult to make good screen shots of the next features I’ll talk about. So please refer to the website to see them “in action”.&lt;/div&gt;&lt;div align="justify"&gt;The &lt;strong&gt;IntelliSense enhancement&lt;/strong&gt; is what everybody loves most. It’s one of those features you see in the beginning and you get so customized to it, that you don’t even remark it anymore because it just feels so natural. But once you have to work with a Visual Studio which is missing the enhanced IntelliSense, you’re totally lost... at least, that’s my case.&lt;/div&gt;&lt;div align="justify"&gt;The enhanced IntelliSense has an &lt;strong&gt;improved suggestion list&lt;/strong&gt; which will not only display the possible symbols (variables, defines, enumerations and functions) but also those that fit closest to the current situation. For example, you have used within the function you’re currently developing calls to other functions which needs specific variables from your context. The second or third time you call that function, it will suggest the symbols you have previously used to make that function call. If you have passed 2 times the variable “a” to that function, the third time you call that function, the variable “a” will be the top suggestion.&lt;/div&gt;&lt;div align="justify"&gt;And this feature can become really scary... Once I had to hard-code (bad bad) a table of 256 values. These 256 values were based upon 8 or 9 different enum-values. When I started the table coding, the suggestions seemed to be quite random. But the more values I coded into the table, the more precise was the suggestion. And this up to a point that I had the feeling that VA actually knew in which order I had to encode them because I almost never selected another one than the suggested one after I had entered the first 50 values.&lt;/div&gt;&lt;div align="justify"&gt;Other features that you don’t see anymore is the &lt;strong&gt;automatic parenthesis and braces&lt;/strong&gt; setting. Whenever you put a “(“, a ”)” is put, too. If you put a “{“, a “}” is put also.&lt;/div&gt;&lt;div align="justify"&gt;Another cool feature is the &lt;strong&gt;“.” to “-&gt;”&lt;/strong&gt; option. Dependent on the source code and the variable declaration, Visual Assist recognizes if a “.” or a “-&gt;” is needed and adjusts the source code while you’re typing. I almost never type anything else than “.”.&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Acronyms and shorthand typing&lt;/strong&gt; is another very cool feature. Just type in a few letters, select the right symbol, function or code from the appearing list box and you’re done. In most cases you only need to type 4-5 letters to enter a function name consisting of 10, 15 or 20 letters.&lt;/div&gt;&lt;div align="justify"&gt;One of the last features I would like to mention is the improved method list in the context field on top of your source code window. If you click on the down arrow, all classes and methods of the current file are listed and you simply select one to instantly jump to its position.&lt;/div&gt;&lt;div align="justify"&gt;On the very right is the &lt;strong&gt;“go to” button&lt;/strong&gt;. Simply put your mouse cursor on a function name or a variable, click onto the “go to” button and it will either directly go to the implementation or the declaration, or it will display a list with suggestions of files in which the function or the variable has been declared. It’s not necessary to activate the browse information within Visual Studio to use this feature.&lt;/div&gt;This is all for the feature tour...&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;To improve your workflow&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;One of the features I use most is the “go to” functionality. While it’s ok to press the “go to” button on the top right of the source code window, I’m more comfortable with simple key strokes. So, if I can give you an advice, then make you life easier and assign the most often used functions to key codes. The “go to” feature for example is set to F3 on my key board. I go to a function, a variable or any other symbol and press F3 to go to its definition. If my cursor is on a function call, I get the choice between the header file in which the function has been declared or the source file where it has been implemented.&lt;/div&gt;&lt;div align="justify"&gt;To assign your keys to functions, go to “Tools”-&gt;”Options”-&gt;”Keyboard”, find the “VAssistX.GotoImplementation” command in the command list and assign it to whatever key you want. If you enter “VAssist” in the command line, you’ll get all the Visual Assist commands you might want to assign to a key. The most useful are “GotoImplementation”, “FindReferences”, “FindNextByContext” and “FindPreviousByContext”. Another one, which is not part of Visual Assist, is “Edit.GotoBrace” to quickly jump between enclosing braces.&lt;/div&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Options&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;A lot of features can be adjusted to your needs. If you want to change the syntax coloring, you can do it either through the quick config (which lets you switch between max, default and min) or the advanced font and color settings.&lt;/div&gt;&lt;div align="justify"&gt;The list box content and the suggestions can be adjusted and the code snippets can be edited.&lt;/div&gt;&lt;div align="justify"&gt;You can even adjust the number of spaces between the method name and the braces.&lt;/div&gt;&lt;span style="font-size:130%;"&gt;&lt;u&gt;Pricing&lt;/u&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Visual Assist is no free tool. In fact I discovered that it got more expensive since I initially bought it. And to top it all, they have changed their licensing model. Before you paid $149 for your license and you had full year of software updates and technical support.&lt;/div&gt;So since mid 2008 (?) you have the choice between paying&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;$249 including 1 year of support and updates and qualifying for maintenance renewal (which costs $49 per year),&lt;br /&gt;&lt;/div&gt;&lt;/strong&gt;Or&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;$99 for a personal license which is not renewable and only includes 6 months of updates and technical support.&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Visual Assist is a great tool containing a lot of features which help you to work more efficiently and more precise.&lt;/div&gt;&lt;div align="justify"&gt;The suggestion list of the enhanced IntelliSense helps you to quickly find and enter any symbol you might need. Once you have started using it, you don’t want to miss it. The “go to” function is a precious help which you never want to miss again.&lt;/div&gt;&lt;div align="justify"&gt;The refactoring functions help you a lot when you have to extract parts of your code to put them into functions or if you want to rename them. Even changing the function signature is possible.&lt;br /&gt;The tool windows as the outline window might be handy if you shuffle your functions around to create a clearer structure of you source files.&lt;/div&gt;All in all Visual Assist integrates greatly into Visual Studio.&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Nevertheless I’m missing quite some stuff in Visual Assist: I would like to have better control when changing function signatures or when I move want to create functions; I would like to see improved controls to create getters and setters for member variables; And a lot more... If you have ever worked with Eclipse you might understand what I mean. The amount of possible refactoring functions is incredible. The Visual Assist developers might want to take a look at Eclipse because a lot of developers have suggested them to do so...&lt;/div&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;br /&gt;- Great feature list&lt;br /&gt;- Seamless integration into Visual Studio&lt;br /&gt;- Options let you configure almost everything&lt;br /&gt;- Create your own code snippets&lt;br /&gt;- Improved IntelliSense&lt;br /&gt;- Great “go to” functionality&lt;br /&gt;- Great community through their forums&lt;br /&gt;- Great support&lt;br /&gt;- Multiple updates per year containing new features and bug-fixes&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;br /&gt;- Could use more and better refactoring functions&lt;br /&gt;- Although requested bugs and features get “case” ids, users (registered or not) cannot see the “cases”, so bugs or features are discussed multiple times.&lt;br /&gt;- The outline and view windows are almost useless. They are no real improvement compared to the already available class viewer.&lt;br /&gt;- The changed license model which is more expensive than before and could hinder small developers to purchase it.&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;a href="http://www.wholetomato.com/"&gt;http://www.wholetomato.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-1489933289302170404?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/1489933289302170404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=1489933289302170404' title='80 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1489933289302170404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1489933289302170404'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2009/01/visual-assist-review.html' title='Visual Assist review'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>80</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-8888003235362831907</id><published>2009-01-15T02:25:00.000-08:00</published><updated>2009-01-15T02:28:17.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WinMerge'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Assist'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Sidekick'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='UltraEdit'/><category scheme='http://www.blogger.com/atom/ns#' term='PC Lint'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architect'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Lint'/><category scheme='http://www.blogger.com/atom/ns#' term='UltraCompare'/><category scheme='http://www.blogger.com/atom/ns#' term='SVN'/><title type='text'>Development tools...</title><content type='html'>&lt;p&gt;Hi,&lt;/p&gt;&lt;p&gt;Since 1996, when I have entered the gaming industry as a programmer, I have seen a lot of tools coming and going which helped me to improve my code and facilitate the work I had to achieve. While I had to let lose some of them because they no more fitted my needs, there are still some I have kept all the time.&lt;/p&gt;&lt;p&gt;Last year I signed a contract containing huge amounts of code to maintain. I’m not talking about 300.000, 400.000 or 600.000 lines of code. The code base contains not less than 2340 files with 886.000 lines of code (comment lines not included).&lt;/p&gt;&lt;p&gt;Since maintaining such a huge code base is really a pita, I had to find a way to handle the code navigation, the code maintenance and the refactoring. So, during several blog entries, I’m going to talk about the tools I currently use citing their pros and cons and their pricing.&lt;/p&gt;&lt;p&gt;Before I start, some additional information:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Although I also do Java development, I focus on Visual Studio (2005/2008) since this my main development tool. For Java development I use Eclipse.&lt;/li&gt;&lt;li&gt;Whenever I search a tool, I try to find those which integrate into Visual Studio. This is not because I don’t like other tools but because I don’t want to switch forth and back between different environments. Nevertheless, for some tasks it’s not possible or useful to concentrate on Visual Studio. You’ll understand when I’ll talk about those tools.&lt;/li&gt;&lt;li&gt;I mainly do C++ development. Almost all of my clients do so also. Some of them use Java and others C#. I can develop in all of them (and more since I also have experience using Delphi, FORTRAN, and Assembler...) but I excel in C++. So all tools I discuss support at least C++.&lt;/li&gt;&lt;li&gt;If a tool is useful to me, I spend money to buy it. While there are a lot of freeware tools out there, those which might be useful sometimes lack support in case of problems. I do not buy tools at any price. My ROI estimation must fit to some criteria: how useful is it to me? How is the support? Who else is using it? What does it achieve? Is there another tool which does almost the same for less money?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ok... that said, here’s the list of tools I’ll discuss:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Visual Assist by Whole Tomato Software, Inc.&lt;/li&gt;&lt;li&gt;Visual Sidekick by Syntaxia Technologies&lt;/li&gt;&lt;li&gt;PC Lint by Gimpel Software&lt;/li&gt;&lt;li&gt;Visual Lint by Riverblade&lt;/li&gt;&lt;li&gt;UltraEdit by IDM Computer Solutions, Inc.&lt;/li&gt;&lt;li&gt;UltraCompare by IDM Computer Solutions, Inc.&lt;/li&gt;&lt;li&gt;WinMerge (Open Source)&lt;/li&gt;&lt;li&gt;Enterprise Architect by Sparx Systems&lt;/li&gt;&lt;li&gt;Team Foundation Server and Team Foundation Explorer by Microsoft&lt;/li&gt;&lt;li&gt;AnkhSVN  (Open Source)&lt;/li&gt;&lt;li&gt;TortoiseSVN (Open Source)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This is already quite a list of tools to discuss. Tomorrow I’ll start with Visual Assist...&lt;/p&gt;&lt;p&gt;Have fun,&lt;br /&gt;Stefan&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-8888003235362831907?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/8888003235362831907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=8888003235362831907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8888003235362831907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8888003235362831907'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2009/01/development-tools.html' title='Development tools...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-249133012414677322</id><published>2009-01-06T10:00:00.000-08:00</published><updated>2009-01-06T14:26:13.753-08:00</updated><title type='text'>Enhancing SSCXML and it's future</title><content type='html'>Ok,&lt;br /&gt;&lt;br /&gt;as promised I'll talk about the missing stuff in the new data module. But I have a second topic that I'ld like to mention... but that's for later on.&lt;br /&gt;&lt;br /&gt;So, if you take a look at the saturday's blog entry, you'll have a little idea of how the new data module interfaces will look like. They're neat, they're simple, they're incomplete...&lt;br /&gt;&lt;br /&gt;In fact, an entire interface is missing. Here's why: When you're working with data value whose type is non-specific as expressed through the IDataValue interface, you cannot simply make a "new something" call. In fact, you'll need a factory that is able to create the data value of the type you need. Therefore a IDataValueFactory interface is needed.&lt;br /&gt;&lt;br /&gt;My current definition looks like this:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class IDataValueFactory&lt;br /&gt;{&lt;br /&gt; /** \brief Access the number of types this factory can create.&lt;br /&gt; *&lt;br /&gt; * \return value containing the number of types.&lt;br /&gt; */&lt;br /&gt; virtual size_t getNrTypes() const = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Identifies the indexed type of the data value that can be created using this factory.&lt;br /&gt; *&lt;br /&gt; * \param Index to the type identifier string to retrieve.&lt;br /&gt; * \return a string containing the identifier.&lt;br /&gt; */&lt;br /&gt; virtual const ScxmlString&amp; type(unsigned int _index) const = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Checks if the type of the data value can be created using this factory.&lt;br /&gt; *&lt;br /&gt; * \param a string containing the data value type.&lt;br /&gt; * \return true, if the type can be created using this factory.&lt;br /&gt; */&lt;br /&gt; virtual bool canCreate(const ScxmlString&amp; _type) const = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Create a new data value of the given type.&lt;br /&gt; *&lt;br /&gt; * \param a string containing the data value type.&lt;br /&gt; * \return Pointer to the data value created using this factory.&lt;br /&gt; */&lt;br /&gt; virtual IDataValue* create(const ScxmlString &amp;_type) = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Destroy the data value.&lt;br /&gt; *&lt;br /&gt; * \param Pointer to the data value to destroy.&lt;br /&gt; * \return true, if the data value has been destroyed by the factory.&lt;br /&gt; */&lt;br /&gt; virtual bool destroy(IDataValue* _value) = 0;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In my opinion, any factory should be able to create more than only one data value type. This makes sense because you don't want to implement one factory for every data value type you want to support. So, the first 4 functions enable the user of the factory to check which data types are supported by the factory. Again this is entirely based upon strings to facilitate the usage.&lt;br /&gt;&lt;br /&gt;The last two function create or destroy a data value. I think that for a clean structure, the one who has created an object is responsible for it's deletion. Simply incoke the factory's delete function and that's it.&lt;br /&gt;&lt;br /&gt;Now, using the factories themself might be a little painful because you'll first have to get the right one and then make the create/destroy call.&lt;br /&gt;&lt;br /&gt;So, I enhanced the interface of the data module by some functions: addFactory, removeFactory, createValue and destroyValue. Basically the developer is able to create his own factories, add them to the data module and create or destroy data values through the data module... hence everything data related "flows" through the data module.&lt;br /&gt;&lt;br /&gt;One last thing I did was to add a clone function to the data value which might come handy when managing variables, creating copies, etc.&lt;br /&gt;&lt;br /&gt;I still have to verify some of the interface functions to see if and how well they work together with a separate script implementation (remember: data management and scripting language linked together).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So far so good.&lt;br /&gt;&lt;br /&gt;Now the other thing: The future of SSCXML.&lt;br /&gt;&lt;br /&gt;I admit that, although I hoped otherwise, I didn't sell any license of SSCXML. I had some companies showing interest, some people asking questions but it didn't start off as I had hoped. Although the possible application fields are widely ranged, the interest itself was (and is) quite low.&lt;br /&gt;&lt;br /&gt;SSCXML was the first publicly available implementation in C++, having a very easy to understand and very easy to use interface structure. It doesn't cost anything as long as you don't develop a commercial application using it and if you do, the price seems to be ok to me for the work that has been put into it (and the time you save when using it). Although these advantages, it just didn't pull off.&lt;br /&gt;&lt;br /&gt;Now, almost a 9 month after my beta testing session and the launch, I've seen Qt (aka Trolltech/NOKIA!!) implement a SCXML lib into their Qt library. As far as I have learned, there have been several people working on it (while I was working alone), they're talking about some stuff I have on my road-map (ie. visual editor) and their google hits are higher (I suppose it's due to Qt overall higher presence and their tags on their webpages).&lt;br /&gt;&lt;br /&gt;While my implementation is quite free from any library that must be available to use it, the Qt SCXML implementation is very bound to the Qt library itself.&lt;br /&gt;&lt;br /&gt;So, now, seeing all this, I'm wondering what I should do. The product doesn't sell, the user base isn't high (tending to a handful of people coming and going) and so is the feedback I get.&lt;br /&gt;&lt;br /&gt;I have several options:&lt;br /&gt;&lt;br /&gt;1. I keep everything as is and I change nothing. I keep the business model, I continue development at my own speed (taking user requests into account as fast as possible) and hope that both, the user base and the licenses, will rise.&lt;br /&gt;&lt;br /&gt;2. I make it completely open-source handing out the source code, scratching any idea of it being "my baby" and let an eventual user base take over the control.&lt;br /&gt;&lt;br /&gt;3. Make it in a Qt similar way: under dual licensing handing out the complete source code but people have to pay to make commercial usage. This actually is almost the same way I do it now, except that I keep the source code closed.&lt;br /&gt;&lt;br /&gt;4. Keep the source code closed and hand them only to those who pay for it. The non-paying people can use it for free.&lt;br /&gt;&lt;br /&gt;5. Make it "donation" soft or "donation" open source... however you might want to call it. Hand out the source code, taking some people into the team who would like to contribute and ask for some money which is spent on material (books, hardware, etc).&lt;br /&gt;&lt;br /&gt;So my question to you is: Which option would you use? Or do you have another suggestion?&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-249133012414677322?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/249133012414677322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=249133012414677322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/249133012414677322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/249133012414677322'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2009/01/enhancing-sscxml-and-its-future.html' title='Enhancing SSCXML and it&apos;s future'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-1566705313943520138</id><published>2009-01-03T10:47:00.000-08:00</published><updated>2009-01-03T11:04:33.175-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interfaces'/><category scheme='http://www.blogger.com/atom/ns#' term='data module'/><category scheme='http://www.blogger.com/atom/ns#' term='SSCXML'/><category scheme='http://www.blogger.com/atom/ns#' term='data value'/><title type='text'>Interfaces of the data value and data module</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;as promised yesterday today I'll show you the interface to the data value and the data module. In fact, as I stated yesterday, the data value interface is quite small since it only has to identify the type and to provide basic getter and setter functions.&lt;br /&gt;&lt;br /&gt;I was thinking about the most flexible way of usage for the interface. Since it is this tidy and tiny, the actual data getter and setter must be simple, too. I finally decided to make usage of strings (Note: ScxmlString is actually a typedef of std::string). The reason is simple: Everyone can handle strings with too much hassle and almost every type of data can be described using a string. An integer is as easy to put into a string as is a float. An array of numbers can be put into a string used a separator.&lt;br /&gt;&lt;br /&gt;Furthermore, as I said yesterday, the datamodel itself is 90% linked to the script module (since the script module would be responsible for the expression parsing). This implies that the developer who's implementing the script module interface, would also make sure that the implementations of the different types of data values (integer, strings, floats, even objects) can easily be handled by the script module. This means, that the derived class may include access functions that bypass the get/set functions that make usage of strings. A derived integer class easily can implement a get and set function that makes usage of an integer. The script module only has to determine the data value type and cast the interface accordingly.&lt;br /&gt;&lt;br /&gt;Thus, the interface of the data value in its basic form looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class IDataValue&lt;br /&gt;{&lt;br /&gt; /** \brief Identifies the type of the data.&lt;br /&gt; *&lt;br /&gt; * \return a string containing the identifier.&lt;br /&gt; */&lt;br /&gt; virtual const ScxmlString&amp; type() = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Access the data.&lt;br /&gt; *&lt;br /&gt; * \return a string containing the data value.&lt;br /&gt; */&lt;br /&gt; virtual const ScxmlString&amp; get() = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Set the data.&lt;br /&gt; *&lt;br /&gt; * \param a string containing the data value.&lt;br /&gt; */&lt;br /&gt; virtual void    set(const ScxmlString&amp; _value ) = 0;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;My first draft of the data module interface looks as simple as the interface for the data value. Currently only 3 functions are defined: a function to set data, a function to get data and a function to remove data.&lt;br /&gt;&lt;br /&gt;Here it is:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class IDataModule&lt;br /&gt;{&lt;br /&gt; /** \brief Get data as a string from the data module.&lt;br /&gt; *&lt;br /&gt; * \return true, if the named date exists within the data module. False, if not.&lt;br /&gt; * \param _name  Name of the data to fetch.&lt;br /&gt; * \param _out  This variable will store the fetch result.&lt;br /&gt; */&lt;br /&gt; virtual IDataValue*  getData(const ScxmlString &amp;_name) = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Set data.&lt;br /&gt; *&lt;br /&gt; * Data that is set in this way will be set to the data module.&lt;br /&gt; *&lt;br /&gt; * \return true, if the data could be set; false otherwise.&lt;br /&gt; * \param _name  Name of the data. This name must be unique. If the name is not unique, it will replace the data value that has been stored using that name before.&lt;br /&gt; * \param _val  Content of the data.&lt;br /&gt; */&lt;br /&gt; virtual bool  setData(const ScxmlString &amp;_name, const IDataValue*_val ) = 0;&lt;br /&gt;&lt;br /&gt; /** \brief Remove a data entry.&lt;br /&gt; *&lt;br /&gt; * The named data will be removed from the data module.&lt;br /&gt; *&lt;br /&gt; * \return true, if the data could be removed. false otherwise.&lt;br /&gt; * \param _name Name of the data.&lt;br /&gt; */&lt;br /&gt; virtual bool  removeData(const ScxmlString &amp;_name) = 0;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;These 3 function would enable the developer to manage a set of data values within the data module. The identifiers (names) must be unique but that's part of the script module (or the implementation that makes usage of the datamodel interface).&lt;br /&gt;&lt;br /&gt;Nevertheless, the interface for the data module is not complete. At least, that is my opinion ;) On monday or latest tuesday I'll tell you what is still missing and how that stuff is looking like.&lt;br /&gt;&lt;br /&gt;Until then: Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-1566705313943520138?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/1566705313943520138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=1566705313943520138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1566705313943520138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1566705313943520138'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2009/01/interfaces-of-data-value-and-data.html' title='Interfaces of the data value and data module'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-4002942650776120374</id><published>2009-01-02T06:04:00.000-08:00</published><updated>2009-01-02T06:32:04.645-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data module'/><category scheme='http://www.blogger.com/atom/ns#' term='data management'/><category scheme='http://www.blogger.com/atom/ns#' term='SSCXML'/><category scheme='http://www.blogger.com/atom/ns#' term='script module'/><title type='text'>Enhancing SSCXML</title><content type='html'>Ok... so as you might have read I plan to improve &lt;a href="http://www.sscxml.com/"&gt;SSCXML &lt;/a&gt;(Simple State Chart XML) to mirror a little bit better what is actually written in the &lt;a href="http://www.w3.org/TR/scxml/"&gt;W3C draft&lt;/a&gt;. One thing that is mentioned in the latest version of the draft is the split into different parts such as the &lt;a href="http://www.w3.org/TR/scxml/#data-module"&gt;data module&lt;/a&gt;, the &lt;a href="http://www.w3.org/TR/scxml/#script-module"&gt;script module&lt;/a&gt; etc.&lt;br /&gt;&lt;br /&gt;Although they describe them as being two different parts, they mention (in the same time) that the data module must provide a data access language which will allow to access the data stored in the data module.&lt;br /&gt;&lt;br /&gt;Now, this sounds like a great idea, but IMHO this also implies that a complete expression parser must be included in the data module. Why? Because once you define a "language" that enables you to access the data, there are also some operations that you want to handle: using a variable to index an access to an array of variables ("a[b]" or "a[10]") or combine variables to create a new one (AKA as assign a value to another variable). Those are two examples of what ideally should be possible with the data module.&lt;br /&gt;&lt;br /&gt;Unfortunately this implies a lot more: In fact, implementing a data access language into the data module ultimately means that you have a complete expression parser implemented to access, assign, handle, alter and delete the data.&lt;br /&gt;&lt;br /&gt;And there's now the notion of the script module. According to the &lt;a href="http://www.w3.org/TR/scxml/#script-module"&gt;draft&lt;/a&gt;, the script module adds scripting capability to the state machine. They're giving the example of ECMAScript (aka JavaScript).&lt;br /&gt;&lt;br /&gt;Now, think a second about what I've written above... complete expression parser... script module... You see it? Yes... for a developer this basically means the same: When you want to include scripting into your state machine, you automatically also have the data module, since you cannot script without holding a basic set of data. This means that for a programmer the data module almost always goes in combination with a script language and vice versa.&lt;br /&gt;&lt;br /&gt;Now, my idea is this: The data module is only there to store data is using a very basic scheme: values put into relation with an identifier. For every value pushed into the data module, an identifier must be given. If an identifier is used twice, the previously stored data is replaced by the new value.&lt;br /&gt;&lt;br /&gt;This notion of the data module has some advantages and some drawbacks:&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;- no expression parser must be included.&lt;br /&gt;- replacing data is easy.&lt;br /&gt;- the data module is not responsible for solving the value addressing.&lt;br /&gt;&lt;br /&gt;Cons:&lt;br /&gt;- Access of large datasets might be more difficult&lt;br /&gt;  Example: a is an array of 1000 values. You can access a value by directly indexing it. Since the data module only has simple identifiers, an array must be mapped to a simple scheme such as "a[10] -&gt; a.10" (access the 10th element of an array).&lt;br /&gt;- The script module/expression parser is responsible to create unique ids and to verify that data is handled as expected (IE. temporary data storage).&lt;br /&gt;- The data module would have no garbage collection.&lt;br /&gt;&lt;br /&gt;To solve some of the issues, it is important that the value that is actually stored within the data module, is as flexible as possible. Also, one might want to have the possibility to enable the developer to implement his own data values (IE. an object, a specific data type, etc.). The data module must not now how to handle these new data value types. It only has to store them and provide access to them.&lt;br /&gt;&lt;br /&gt;I'll write about the interfaces themselves tomorrow. So... keep coming back to take a look at it :)&lt;br /&gt;&lt;br /&gt;Have fun and a happy New Year,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-4002942650776120374?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/4002942650776120374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=4002942650776120374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/4002942650776120374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/4002942650776120374'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2009/01/enhancing-sscxml.html' title='Enhancing SSCXML'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-440717107606996309</id><published>2008-12-28T09:10:00.000-08:00</published><updated>2008-12-28T09:45:44.048-08:00</updated><title type='text'>The end of the year is nearby...</title><content type='html'>&lt;p&gt;First of all I wish you a Happy Christmas (a bit late, I know) :)&lt;br /&gt;&lt;br /&gt;It has been a long time since my last blog entry. The primary reason for this is that currently I'm submerged in work. I've several clients who were waiting for stuff. For at least one client, the situation will be stressful until end of January.&lt;br /&gt;&lt;br /&gt;Nevertheless from time to time you have to take some days off for a special occasion (well... Christmas is special, isn't it?), get some clear ideas about the future and think of some New Year's resolutions.&lt;br /&gt;&lt;br /&gt;I've spent a couple of hours thinking of mine... here's a work related list: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Simple SCXML:&lt;br /&gt;&lt;br /&gt;- Improve the underlying code.&lt;br /&gt;- Modularize the code base (data module, parser module, script module, ...)&lt;br /&gt;- Make parallel states being parallel threads.&lt;br /&gt;- Make a C# version of SSCXML.&lt;br /&gt;- Create a simple editor for state machines.&lt;br /&gt;- Make a Linux compatible version (I might need some help here).&lt;br /&gt;- Think of how to integrate behavior trees into SSCXML (I'm still convinced that this is more or less easily possible).&lt;br /&gt;- Enable the user to write his own executable.&lt;br /&gt;- And finally: Think of how to promote SSCXML. While I got some companies interested into SCXML and my implementation, the sales are quite low...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Serve my clients even better by improving my knowledge (AKA read some books and write some test code).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Write at least 2 articles that get published somewhere (Note: I wrote some comments in an online games magazine forum and another games magazine took my comments and patched them together into a ten pages article. It's about the working conditions in the games industry in Germany and the overall situation for the developers. The main intention of my comments was to sensitise the gamers out there to the hard working conditions we encounter and that, although we must have a masochist vein, we are not into getting insulted. It's all in German but for those who are interested: &lt;a href="http://www.pcaction.de/?menu=010101&amp;amp;page=1&amp;amp;article_id=662872"&gt;Offen, ehrlich, lesenwert - ein Programmierer spricht Klartext &lt;/a&gt;("Open, honest, worth reading - a programmer speaks plain language").&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Continue working on Prohibition. The game currently is "On Hold" due to my work charge. Nevertheless, the idea still is there. Unfortunately, some of my ideas must be changed because either the technical part is not good enough (IE. Navi as the Gui or etwork for the network part), or my game ideas are too complex (IE. the mixing of role playing and strategy creates just too much work, the idea to enable the in game characters to make usage of the environment (chairs, tables, etc) creates to much work on the AI implementation).&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This is already quite much for an entire year and I'm not sure that I can realize or progress the way I would like to. Especially the Prohibition stuff creates me some head ache. The idea spins around since almost 10 years and I'm no further than 10 years ago. I wanted to focus more on the game development part and I fall back into the technical part which is not as I wanted it to be.&lt;/p&gt;&lt;p&gt;SSCXML has not done the progress I wanted it to have. The idea of a state machine entirely defined by an XML is very good, but then you encounter problems on the developer side: While game AI developers currently are more into behavior trees (which in my opinion is more or less a special case of a state machine), application developers either have their own state machine (if applicable) or don't see the need of using a) a state machine middleware or b) an external expertize on that matter. A small part of developers are waiting of a Linux version of SSCXML, which is a whole history of it's own.&lt;/p&gt;&lt;p&gt;I'll try to write more often in the future. I'll refocus on SSCXML, start my own network library implementation (based upon etwork), and talk about the progress done on Prohibition.&lt;/p&gt;&lt;p&gt;Have fun,&lt;br /&gt;Stefan&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-440717107606996309?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/440717107606996309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=440717107606996309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/440717107606996309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/440717107606996309'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/12/first-of-all-i-wish-you-happy-christmas.html' title='The end of the year is nearby...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-6485507547379350618</id><published>2008-11-24T00:49:00.001-08:00</published><updated>2008-11-24T00:49:40.903-08:00</updated><title type='text'>The PS3 can be...</title><content type='html'>a real bi*** when you want to copy your DVD collection onto an HDD. I have about 200 DVDs plus all Star Trek Series waiting to be pulled off the DVD and transformed into a PS3 readable format.&lt;br /&gt;&lt;br /&gt;Although one might think that this is an easy task, I went from failure to failure in the last couple of weeks. I tested ~20 different programs, combining several video and audio codecs, only to see that almost all of them fail (or I am too dumb to succeed).&lt;br /&gt;&lt;br /&gt;My objectives were:&lt;br /&gt;&lt;br /&gt;1. PS3 readable&lt;br /&gt;2. Small data footprint (aka "Please... no big files...")&lt;br /&gt;3. Good quality&lt;br /&gt;&lt;br /&gt;2 and 3 actually is a question of fine tuning. I don't want to have a 1 gig file for a 40 minute Star Trek Episode. 500 Mb is my limit. Normally, one would rip off the DVD the VOBs and encode them via a tool or another with DivX, xviD or whatever else codec to reduce the data footprint.&lt;br /&gt;&lt;br /&gt;Actually point 1 is difficult and the number of discussion one might find if you google for it, is quite impressiv. While different video and audio codecs are available, they are not "mixable" as you want. I could not manage to mix a DivX video stream with an MP3 audio stream. While it play fine on my computer, the PS3 reports "Corrupted data" or "Incompatible data".&lt;br /&gt;&lt;br /&gt;I messed around with the vobs but they are just too huge. The only "good" combination I have found is ht263 combined with AC3. Unfortunately, not very much software can combine it. Or they're not fast (waiting ~2 hours on a quad-core machine to ripp-encode an 1:30 h film isn't my idea of fast).&lt;br /&gt;&lt;br /&gt;Finally, I stumbled onto &lt;a href="http://www.slysoft.com/en/clonedvd-mobile.html"&gt;CloneDVD mobile (by Slysoft)&lt;/a&gt; which combined all I need: PS3 readable without a glitch, fast (1h 30 to ripp-encode 1 film (1:23h in length) and 2 episodes (42 minutes long each)). That is the speed I wanted. I set the quality of video encoding to 18 (whatever that means) which results to a good quality (can't see the difference between DVD and encoded file).&lt;br /&gt;&lt;br /&gt;The file size is 905 Mb for the 1:23h film and 459 Mb for the 42 minutes episodes.&lt;br /&gt;&lt;br /&gt;And these files (in opposite to the files generated by much other software) does play without a glitch.&lt;br /&gt;&lt;br /&gt;Ah yes, I combined Clone DVD mobile with AnyDVD (by Slysoft also) which removes copy protection from any DVD.&lt;br /&gt;&lt;br /&gt;Another remark or two:&lt;br /&gt;&lt;br /&gt;1. No, I won't hand you any of my encoded files if you ask for them. I encode them for my personal use; I don't spread them...&lt;br /&gt;&lt;br /&gt;2. Please refer to your countries laws to know if you may or may not copy your DVDs (and bypass any copy protection). Don't do anything illegal.&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-6485507547379350618?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/6485507547379350618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=6485507547379350618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6485507547379350618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6485507547379350618'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/11/ps3-can-be.html' title='The PS3 can be...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-6879221351809569329</id><published>2008-11-13T04:53:00.000-08:00</published><updated>2008-11-13T05:31:08.203-08:00</updated><title type='text'>More than a month...</title><content type='html'>It's been more than a month without an update on my blog. While I'm sorry for this, I must admit that time was precious and I wasn't quite motivated. There happened a lot of things in the last month, some good and some bad (even very bad).&lt;br /&gt;&lt;br /&gt;Let's start with the worst:&lt;br /&gt;&lt;br /&gt;A couple of weeks ago my wife, my children and me attended a funeral. Ombelie, a friends 8 year old girl, passed away. While suffering from autism, she was a beautiful little girl able to astonish the people around her. Even though her mother was more an online knowledge, they mother have been a couple of times at my home and we have met them several times per year on discussion group meetings. Just 4 days before Ombelie passed away, her mother and my wife have met in a restaurant to have a dinner together. She told her how much progress Ombelie has made the last couple of weeks. The week after her heart stood still...&lt;br /&gt;&lt;br /&gt;Ombelie, we'll miss you. Rest in peace wherever you are...&lt;br /&gt;&lt;br /&gt;I didn't have much time for myself the last month. I worked hard (with much overtime) for one of my clients to finish the codebase for his software which he wanted to show at an asian tech expo. I spent almost a week at his office to fine tune everything, bug fix some stuff for his clients and do some other maintenance work on the development environment.&lt;br /&gt;&lt;br /&gt;When I came back home, I had problems with the roof of my house. Rain poured into my office. So I had to call the guys who did my roof at the end of last year. They fixed it (at no cost since all this sh** is still under guarantee) and left me with the mess that was my office. So, I ripped out the ceiling of my office, the floor, ripped off the paper off the walls and started the renovation of my office sooner than I wanted. It took me more than a week full time to redo everything.&lt;br /&gt;&lt;br /&gt;In the same time, I equipped my house with a 1GB Lan structure. I had a 100 mbit structure before and I wasn't quite satisfied with the speed :) So, for a couple of Euros (60 I think), I bought some new switches. Fortunately, the cabling in my house is recent and works fine with the higher speed.&lt;br /&gt;&lt;br /&gt;As soon as I finished my office, I had to jump start working for my client again. I had to test the (rather old) installation process of his software because some clients complained of not being able to install it on 64-bit OSs. Since I didn't have a 64-bit OS machine available, I bought some equipment and changed some stuff in my working machine. The rest was used to set up the 64-Bit Vista machine (which has been converted to a server after testing ;) ).&lt;br /&gt;&lt;br /&gt;So, now I have an Intel 2,8 Quad Core CPU in my working machine :)&lt;br /&gt;&lt;br /&gt;Before changing the CPU, I had some problems with my working machine not booting properly at startup. It freezed upon reactivation of the USB ports (most often, it went into BSOD). Finally, after much thinking about what to do, I decided to give a shot at a complete reinstall of the system. And this solved my problem... no more freezes right now.&lt;br /&gt;&lt;br /&gt;I suppose that I have installed and uninstalled too much sh** in the last 2 years (since I initially set up the machine) which finally screwed the driver setup.&lt;br /&gt;&lt;br /&gt;I also did a new version of SSCXML which can be found &lt;a href="http://www.sscxml.com/"&gt;here&lt;/a&gt;. Just go into the download section and get the latest version. If you want to discuss anything about SSCXML, please go &lt;a href="http://www.sidema.be/smf/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ok... so... now after having tested the installation process, I totally re-implement the entire process and therefor have to change the code base a bit. And this is really ugly because throughout the entire code base FIXED file system pathes are used to identify, manipulate and access files. All this has to be changed. Additionally a "client package creation tool" that has been implemented for my client (by the guy who worked for my client before me) uses a HARDCODED SCRIPT to configure an installer version dating from '95/'96. So, this whole part has to be changed, too... Sometimes it makes me wonder how the heck some people got they programming jobs out there...&lt;br /&gt;&lt;br /&gt;This has to be done until end of this month. Afterwards, there are the preparations for the version which will be delivered at the beginning of next year... and I have to fit 5 month of work into less than 3... wish me luck :)&lt;br /&gt;&lt;br /&gt;With all this, I didn't really work on Prohibition. Didn't have any time :( Nevertheless, from time to time I'm thinking about one or another aspect of the game and it takes shape in my head :)&lt;br /&gt;&lt;br /&gt;Another thing I'm trying to set up is a media server which can be accessed by my PS3. I have a quite extensive DVD collection (containing ALL Star Trek series and all Star Trek films; I even have the animated Star Trek series :) ). I'ld like to put them on HD to stream them to the PS3. Currently I'm testing TVersity which seems to be a fine piece of software. But I get disconnects and the Tversity Service seems to terminate itself when ie. transcoding files (ie. the featured online streams).&lt;br /&gt;&lt;br /&gt;Ok... hopefully I'll update my blog more often from now on :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;br /&gt;&lt;br /&gt;PS: For those able to read german texts: The german PCAction has taken comments I've made in a forum to create a 10 pages article. You can take a look at it &lt;a href="http://www.pcaction.de/?article_id=662872"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-6879221351809569329?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/6879221351809569329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=6879221351809569329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6879221351809569329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6879221351809569329'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/11/more-than-month.html' title='More than a month...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-8223660821862953261</id><published>2008-10-10T12:29:00.001-07:00</published><updated>2008-10-10T12:29:54.093-07:00</updated><title type='text'>Sorry for...</title><content type='html'>not posting much blog entries the last couple of weeks. And unfortunately, it'll be like this until the end of next week, at least.&lt;br /&gt;&lt;br /&gt;Currently it's about 9pm here in Belgium on a friday evening... and I'm working. As I have been the last couple of weeks.&lt;br /&gt;&lt;br /&gt;One of my clients will leave to an exposition in Asia on the 22nd and I've been working on an enhancement of his software package. Basically, the software package allows for CAD of industrial facilities. After design, the user can initiate a report generation which contains references to formulas used to calculate tensions, pressures, etc. Now, the clients would like to see the actual formula used to make a calculation integrated into the report. Additionally to that feature, I implemented a feature that is able to replace the variables of the formulas by values held by the software.&lt;br /&gt;&lt;br /&gt;So far, so good. Now, I'm integrating everything into the report generation which makes use of hand made tables, hand made object within the table etc. On first glance the hand made stuff allowed including bitmaps into the report... only on first glance, because when digging deeper, the "bitmap" I could enter was a table that would always fit onto an entire page of the report. Thus, it was not possible to include a bitmap into line x row y.&lt;br /&gt;&lt;br /&gt;I spent most part of 2 days understanding how those hand made classes are constructed, interweaved and derived. I also spent an entire day debugging to see which functions get called when. To give you a small glimpse of what kind of code I have to handle:&lt;br /&gt;&lt;br /&gt;if (imp_info_wand() == 1) ziel &amp;lt;&amp;lt; imp_terf();&lt;br /&gt;  else ziel &amp;lt;&amp;lt; undef;&lt;br /&gt;                &lt;br /&gt;if (imp_info_wand() == 2) ziel &amp;lt;&amp;lt; imp_terf();&lt;br /&gt;  else ziel &amp;lt;&amp;lt; undef;&lt;br /&gt;                &lt;br /&gt;if (imp_info_wand() == 3) ziel &amp;lt;&amp;lt; imp_terf();&lt;br /&gt;  else ziel &amp;lt;&amp;lt; undef;&lt;br /&gt;                &lt;br /&gt;if (imp_info_wand() == 11) ziel &amp;lt;&amp;lt; imp_terf();&lt;br /&gt;  else ziel &amp;lt;&amp;lt; undef;&lt;br /&gt;                &lt;br /&gt;if (imp_info_wand() == 12) ziel &amp;lt;&amp;lt; imp_terf();&lt;br /&gt;  else ziel &amp;lt;&amp;lt; undef;&lt;br /&gt;                &lt;br /&gt;ziel &amp;lt;&amp;lt; undef;&lt;br /&gt;ziel &amp;lt;&amp;lt; undef;&lt;br /&gt;&lt;br /&gt;This is actually a piece of code filling one part of a table. The &amp;lt;&amp;lt; operator actually puts the cursor into the next line of the table after inserting the value. There's no whatsoever documentation of the code. So...&lt;br /&gt;&lt;br /&gt;There was also an issue to determine when and where which formula has been used since the reference to the formula appears magically in the comment row when the &amp;lt;&amp;lt; operator has been used. I found out that the same line is used multiple times within the table description. Using a &amp;lt;&amp;lt; with "undef" actually skips a line of the description and "removes" it from the table (thus the multiple following "ziel &amp;lt;&amp;lt; undef;" line that I encountered.&lt;br /&gt;&lt;br /&gt;Now, since the &amp;lt;&amp;lt; operator puts the cursor into the next line, the trick is to try to determine which formula in mentioned in the comment line *before* the value is written into the table.&lt;br /&gt;&lt;br /&gt;On monday evening I'll have to travel to the customer's office and I'll stay there until the end of the week. I still have this evening and monday until 4pm (shortly before I leave) to get at least a formula into the report. Once I have one formula in the table, I can insert additional tables at the end of the report and refer to those (if ie. values are included in the table).&lt;br /&gt;&lt;br /&gt;Well well well...&lt;br /&gt;&lt;br /&gt;Have fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-8223660821862953261?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/8223660821862953261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=8223660821862953261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8223660821862953261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8223660821862953261'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/10/sorry-for.html' title='Sorry for...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-2233342865166505605</id><published>2008-09-30T07:34:00.001-07:00</published><updated>2008-09-30T07:34:26.515-07:00</updated><title type='text'></title><content type='html'>I know, I know... being busy is really no excuse for not writing my blog... although...&lt;br /&gt;&lt;br /&gt;Many things have happened since my last blog entry :) Here's the list:&lt;br /&gt;&lt;br /&gt;1. I spent the entire thursday evening on trying to install debian on my NSLU2... and I failed. I mainly had two problems:&lt;br /&gt;&lt;br /&gt;The first one was that the debian installer didn't correctly get the DNS even though I had set up the network card to be dhcp. So, whenever I selected a mirror in the ftp list, it wouldn't accept it because the installer could not contact it. At least that's what I think. But what is strange is that when I selected the critical setup in the def menu, it would contact the ftp ?!?&lt;br /&gt;&lt;br /&gt;The second one was that I had to fetch the SCSI package for the installer to be able to recognize my HD plugged into the USB port. But it recognized my HD only in 20% of time...&lt;br /&gt;&lt;br /&gt;At midnight, after almost 10 hours trying, I decided to scrap it and to use uNSLUng instead. Half an hour later, I had finished. Everything ran as expected and fine.&lt;br /&gt;&lt;br /&gt;On friday I installed TwonkyVision, a nice multi media server. It fit's without problems onto my NSLU2 and the PS3 recognized the server immediately. I still had to set PS3 explicitly in Twonky but hey... it works:) Now I have access to my music, my photos and my home made video clips on my PS3.&lt;br /&gt;&lt;br /&gt;I still have to find the right video format because some seem to cause trouble to the PS3. VOB sometimes reports only 20 minutes of video but play the hour of video fine. On some avi encodings it doesn't recognize the video size correctly and on others it says it's unsupported.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. On saturday we've met some friends and had a nice dinner. We didn't see the time pass and came back home quite late.&lt;br /&gt;&lt;br /&gt;3. On sunday I continued putting my stuff into boxes (I'll redo my office) and we had a nice afternoon walk with the kids in the forest.&lt;br /&gt;&lt;br /&gt;4. Yesterday I had a really stressful day. Coding from 8:00 am 'til 11:30 pm. For one of my contracts I'm working on a LaTex formula renderer which is able to render a formula or a formula group identified by an ID or name. It's also possible to pass a parameter container which will contain values that will replace variables within the formula...&lt;br /&gt;&lt;br /&gt;Imagine you have the formula "A=B*C" (to make it simple). You deliver a parameter container which contains "B" is equal to "1.23". The rendered formula will then be "A=1.23*C".&lt;br /&gt;&lt;br /&gt;So after working out the interfaces and starting their implementation last week, I wanted to finish it to show it to my customer. So I spent my time yesterday putting in some final things such as formula loading from an XML, access functions, container construction, etc. Some 90% of the code have been programmed yesterday. The result is a powerful interface which can handle nested formulas etc.&lt;br /&gt;&lt;br /&gt;The customer was really happy because the initial plan had set the variable by value replacement to a point *after* an exposition he has to attend in a couple of weeks. Now he's able to show off more than he expected :)&lt;br /&gt;&lt;br /&gt;Well... gonna go back to work, documenting and cleaning up some code, putting stuff into boxes...&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;br /&gt;&lt;br /&gt;PS: Sorry... but I cannot show code of the interface due to NDA...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-2233342865166505605?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/2233342865166505605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=2233342865166505605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/2233342865166505605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/2233342865166505605'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/i-know-i-know.html' title=''/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-7908119379123222335</id><published>2008-09-25T06:38:00.001-07:00</published><updated>2008-09-25T06:38:54.208-07:00</updated><title type='text'>Got it...</title><content type='html'>Ok... got my TV on tuesday. Installation was quite quick and hooking up my freshly aquired PS3 worked without problems. I then tried to put the PS3 into the network and had to search the Inet to find how to do it... finally, I rebootet my router and the problems I had went away. Spent more than 2h on that.&lt;br /&gt;&lt;br /&gt;I bought "Ratatouille" as BRDisc and "Fifa08" and "Uncharted" as games. Haven't played "Uncharted" yet because "Fifa08" kept me busy :)&lt;br /&gt;&lt;br /&gt;Overall I'm really happy with my TV setup. I tried hooking up a network drive via USB to my PS3 and that worked too (after I found out how to set up the folders). Unfortunately, the network HDs I have cannot be accessed by network and USB in the same time. And it doesn't switch unless you turn of the HD and turn it back on.&lt;br /&gt;&lt;br /&gt;So I took a look into how to set up a media station and decided to give a try to the NSLU2 from Linksys. Normally, you should be able to flash it with a Linux distribution and install further software on that device. But my first attempt on that didn't work out: a) it didn't let me select a mirror server within the debian installer (it always jumped from the ftp server select screen into the proxy server screen and *without* me doing anything instantly jumped back into the ftp server select screen. I talked to a friend who already set up 2 of those devices in that way and even he told me that this is strange.&lt;br /&gt;&lt;br /&gt;So, I just flashed it back to the old firmware and I'll give it a second try later this day...&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-7908119379123222335?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/7908119379123222335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=7908119379123222335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/7908119379123222335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/7908119379123222335'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/got-it.html' title='Got it...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-1312591719793497175</id><published>2008-09-22T07:37:00.000-07:00</published><updated>2008-09-22T07:51:04.726-07:00</updated><title type='text'>A lot of work...</title><content type='html'>A lot of work :) That's what I have. And unfortunately, this is also the reason why I'm not updating very much my blog :(&lt;br /&gt;&lt;br /&gt;1. Server migrating has been done for almost everything. Only 1 domain is still remaining and I have to wait "for the right moment" :) In fact, my wife has to fetch her emails and then I have to switch. And since currently we rarely are on our computers in the same time, this hasn't been done yet.&lt;br /&gt;&lt;br /&gt;2. SSCXML: I've been looking into enhancing further SSCXML and make it a little bit more SCXML compliant. The draft that has been released earlier this year describes a more modular behaviour of the standard. Also, I interpreted the draft a little bit less restricting (which result in *not* freezing in some scxml constellations as would the draft-sticking implementation do).&lt;br /&gt;&lt;br /&gt;3. Prohibition: Didn't have much time to work on this. I'm still working on some basic things. I also reviewed Navi, which I would like to use for the game (since it allows the usage of html files as gui files)... what turns me down most is the huge amount of data needed to use it... &gt;30mb :(&lt;br /&gt;&lt;br /&gt;4. Jobs: Here's most work for me. I finally got (almost) all information I needed to work and to define how the stuff is going to be implemented for one of my clients. It's also for that client that I'll use mimetex, a tex to gif lib. The currently used font sizes result in rather small printed images (even in HUGE). So, I spent the day today to learn about metafont, gf-files, etc. I'm no LaTex expert so I struggled a lot understanding why this implementation (mimetex) can't use TTF straight forward. Well...&lt;br /&gt;&lt;br /&gt;5. Tomorrow (tuesday) I'll get my new TV: A Samsung LE40A557. Currently they seem to have a special price here in Belgium. Well... it's still 890 Euros but it's ok :) I paid almost 1000 Euros for a normal TV 5 years ago.&lt;br /&gt;&lt;br /&gt;My wife decided to buy me the TV as a birthday present :) (birthday = 9/24). And I'll certainly buy myself a PS3 with a BR-Disc or two and a game or two. We'll see... My intend is to stick a network drive to one of the USB ports and upload some media to be played by the PS3.&lt;br /&gt;&lt;br /&gt;6. This week-end I cleaned up most of our cellars. I need space for my stuff once I start renovating my office. I finished the plans for it... Will take some time to actually start with it.&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-1312591719793497175?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/1312591719793497175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=1312591719793497175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1312591719793497175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1312591719793497175'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/lot-of-work.html' title='A lot of work...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-4107537769143653121</id><published>2008-09-17T07:44:00.001-07:00</published><updated>2008-09-17T07:44:43.692-07:00</updated><title type='text'>Reading sources and modeling...</title><content type='html'>Well... today I spent most of my day reading through one of my clients printer sources. The software itself calculates wall thicknesses for ie. cylindrical shells using some complicated formulas. Target is to integrate the formulas in the printing...&lt;br /&gt;&lt;br /&gt;In my spare time I've modeled my office :) Now, I'm no graphic artist, so... I'm modeling my office because I want to renovate it.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sidema.be/gfx/Office_View_1.jpg" width="50%" height="50%"&gt;&lt;br /&gt;&lt;img src="http://www.sidema.be/gfx/Office_View_2.jpg" width="50%" height="50%"&gt;&lt;br /&gt;&lt;img src="http://www.sidema.be/gfx/Office_View_3.jpg" width="50%" height="50%"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-4107537769143653121?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/4107537769143653121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=4107537769143653121' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/4107537769143653121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/4107537769143653121'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/reading-sources-and-modeling.html' title='Reading sources and modeling...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-4002816258196152043</id><published>2008-09-16T13:25:00.000-07:00</published><updated>2008-09-16T13:26:29.523-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><category scheme='http://www.blogger.com/atom/ns#' term='nameserver'/><title type='text'></title><content type='html'>I'ld like to thank TheFlyingDutchman, ukdm and benryves for checking my websites and pinging them. I spent another half day yesterday searching for the source of the problem and... I finally found it.&lt;br /&gt;&lt;br /&gt;For the history: Until now I've been on a shared host with all my sites. Since I had some serious problems using any script which wanted to use more than 8mb of memory, and because in a far, far future, I might be tempted to install a server software of my prohibition project on a server, I decided to go for a virtual private server.&lt;br /&gt;&lt;br /&gt;When registering for the VPS, the provider asked (in an online form) about the nameserver names to use, which I provided. After the setup of the server, the provider told me about the IPs and all other information including the nameserver names I initially gave. I logged into the server container software (Parallels) and saw that the nameservers where mentioned there.&lt;br /&gt;&lt;br /&gt;So, I started switching my stuff to the new server. Sidema.be which is my company domain switched with no glitches. I entered the nameserver at godaddy as being hosts of sidema.be and entered the names into the NS field of my sidema domain...&lt;br /&gt;&lt;br /&gt;I did this with two of my other domains... which made all the problems I described in my previous journal entry: Some could reach them, others couldn't... I definitely could not.&lt;br /&gt;&lt;br /&gt;After the tests of TheFlyingDutchman, ukdm and benryves I had a talk with a friend of mine who pointed me to the problem that the nameservers themself did not show up as expected. He used a tool called "dig".&lt;br /&gt;&lt;br /&gt;So I "digged" up (HA! Nice joke) "dig" for Windows and played around with it. And we finally found the solution: In fact, the hosts had not been created on the VPS. Although they were mentioned by Parallels, the domain "sidema.be" didn't have the nameserver entries. After adding two entries to the DNS management and waiting some minutes, everything went fine.&lt;br /&gt;&lt;br /&gt;Lesson learned: Always add two "A" lines to your DNS management for the nameservers.&lt;br /&gt;&lt;br /&gt;Tools used: &lt;a href="http://members.shaw.ca/nicholas.fong/dig/"&gt;Dig&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks for helping,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-4002816258196152043?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/4002816258196152043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=4002816258196152043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/4002816258196152043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/4002816258196152043'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/ild-like-to-thank-theflyingdutchman.html' title=''/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-798202801829693353</id><published>2008-09-13T01:57:00.000-07:00</published><updated>2008-09-13T01:58:32.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Belgium'/><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><category scheme='http://www.blogger.com/atom/ns#' term='check'/><category scheme='http://www.blogger.com/atom/ns#' term='nameserver'/><title type='text'>Quick update...</title><content type='html'>before leaving for the weekend.&lt;br /&gt;&lt;br /&gt;I didn't do any updates last week and I'm absolutely p**** about myself. I had no valid reason but a little down. On the other hand I'm struggling with setting up my sites on the new virtual server I have lent.&lt;br /&gt;&lt;br /&gt;In fact, I have setup two sites, set their nameservers and waited for the nameservers to be distributed. Now strange things happen:&lt;br /&gt;&lt;br /&gt;a) I can check my sites via dnscheck.net and they are reported reachable and all ok.&lt;br /&gt;b) From my home (in Belgium) I cannot reach the sites. Even worse, they don't show up when I ping them meaning that the DNS doesn't solve to IP here in Belgium.&lt;br /&gt;c) I have some friends in Germany who can reach the sites and some others who can't.&lt;br /&gt;&lt;br /&gt;I reset the nameservers, tested again and a+b+c from above still occur.&lt;br /&gt;&lt;br /&gt;If anyone has a hint what I can do or which checks I can make to see why I cannot access them from Belgium, it would be great if you post a comment.&lt;br /&gt;&lt;br /&gt;Also, please try to ping/visit &lt;a href="http://www.prohibition-online.com/"&gt;www.prohibition-online.com&lt;/a&gt; and &lt;a href="http://www.game-developer.biz/"&gt;www.game-developer.biz&lt;/a&gt; and make a small comment about whether you can reach the site or not. (There is no real content there since I cannot reach them to put stuff on them).&lt;br /&gt;&lt;br /&gt;Thanks for your help,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-798202801829693353?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/798202801829693353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=798202801829693353' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/798202801829693353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/798202801829693353'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/quick-update.html' title='Quick update...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-285202890414905778</id><published>2008-09-07T11:28:00.000-07:00</published><updated>2008-09-07T11:46:57.321-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SCXML'/><category scheme='http://www.blogger.com/atom/ns#' term='modifier'/><category scheme='http://www.blogger.com/atom/ns#' term='container'/><category scheme='http://www.blogger.com/atom/ns#' term='SSCXML'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><title type='text'>Components enhancement</title><content type='html'>While thinking about the modifiers, I stumbled upon a problem that might not spring into mind when figuring out a game system. I wondered, how I would handle components that should be removed or deactivated? What should happen, when the game is paused?&lt;br /&gt;&lt;br /&gt;Imagine a character has attached a buff which gives him ie. +5 Health every 10 seconds. When you pause the game, you might still want to update any graphic animations (ie. idle animation) but you certainly don't want any buff continue it's work. So you might have to put the buff into "pause mode", you'll have to deactivate the buff.&lt;br /&gt;&lt;br /&gt;I played around with the components and modifiers (which are components, too) in my mind and finally decided that it was a good idea to have a ComponentContainer. This container would hold any type of component, and could hold a set of flags which ie. activate a component, tell the container, that the component should be removed (ie. during next update) or that the component should not get an update.&lt;br /&gt;&lt;br /&gt;I then decided to derive my Component class from the ComponentContainer. The benifit of this is that I automagically have the possibility to attach ie. a modifier to a modifier (remember the timer example from yesterdays blog entry?).&lt;br /&gt;&lt;br /&gt;Currently I have 3 flags: IS_ACTIVE, DO_UPDATE and DO_REMOVE.&lt;br /&gt;&lt;br /&gt;DO_REMOVE flags a component to be removed during ie. the next update of the parent component (well... in fact, the one that holds the component container should decide when unused components should be removed. A character class ie. would remove them in every game turn, while a component would remove them in the next update.).&lt;br /&gt;&lt;br /&gt;IS_ACTIVE and DO_UPDATE mostly come in pair. Only active components can receive updates. You can see that removing the DO_UPDATE flag from component would make them "pause" until you set the flag active again. Disable IS_ACTIVE is useful when ie. the player wants to push things around from the inventory to the character and vice versa. A grapped item (attached to the mouse) would be set inactive (while remaining on the character in a greyed out manner) and thus have no more effect on ie. the characters values (if there was a value modifier attached to the item).&lt;br /&gt;&lt;br /&gt;That's my current state of the components. I'm thinking of how to handle those flag changes with small effort and the more I think of this, the more I'm convinced that my SSCXML has found a new place to be :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;br /&gt;&lt;br /&gt;PS: It's quite possible that I'll have no blog updates in the next two days since I have to travel to some clients on monday and tuesday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-285202890414905778?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/285202890414905778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=285202890414905778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/285202890414905778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/285202890414905778'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/components-enhancement.html' title='Components enhancement'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-1843833541135335168</id><published>2008-09-06T13:45:00.000-07:00</published><updated>2008-09-06T13:56:18.707-07:00</updated><title type='text'>Nothing special... modifiers...</title><content type='html'>Nothing really special happened today. I spent most time doing some work at my home, cooking and doing some shopping.&lt;br /&gt;&lt;br /&gt;Programming side, I did &lt;strong&gt;nothing&lt;/strong&gt;. In fact, I only touched my computer to take a look at my emails.&lt;br /&gt;&lt;br /&gt;Nevertheless I've been thinking about the modifiers in my game. Modifiers can be be applied to character values, item values or anything that can be altered through access functions. An item that gives a "Strength+5" buff, would have an modifier attached to itself, which will be applied to the entity to which the item is attached (equipped). The modifier specifies the "Strength" as a target for a "+5" modification.&lt;br /&gt;&lt;br /&gt;Now, since I want to have modifiers that can ie. alter a valid only for a certain amount of time, the idea is that modifiers are set up of components. A modifier that alters a value for the next 5 minutes, would have a timer component which can trigger an event to the modifier ("remove yourself"). In the same logic, a timer component could send an event to apply a +1 to health every 10 seconds. Combining with the first mentioned timer component, this would lead to a modifier which gives a +1 to the health every 10 seconds for the next 5 minutes.&lt;br /&gt;&lt;br /&gt;I'm still working out the details, but this can go very far. Timer component could ie. trigger events to create gfx effects...&lt;br /&gt;&lt;br /&gt;I'll write more about this as soon as I know more myself :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-1843833541135335168?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/1843833541135335168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=1843833541135335168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1843833541135335168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1843833541135335168'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/nothing-special-modifiers.html' title='Nothing special... modifiers...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-9101558928133144031</id><published>2008-09-05T14:23:00.001-07:00</published><updated>2008-09-05T14:28:44.470-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='domain'/><category scheme='http://www.blogger.com/atom/ns#' term='SCXML'/><category scheme='http://www.blogger.com/atom/ns#' term='migrate'/><category scheme='http://www.blogger.com/atom/ns#' term='vps'/><category scheme='http://www.blogger.com/atom/ns#' term='SSCXML'/><title type='text'>Migrating domains and SSCXML</title><content type='html'>Well... I'm currently in the middle of migrating all my domains from a shared hoster to a VSP. In fact, my hoster restricted a lot of things which were fine before. IE. the memory usage of processes is very low. So low, that even tools like image galleries that have been installed through fantastico will not be able to add a simple image.&lt;br /&gt;&lt;br /&gt;That and some other considerations led me to search for a VPS. I came across a lot of sites and finally I found a VPS plan that was ok for me: not too expensive while still having enough features for my current needs. I took the lowest plan offered by &lt;a href="http://www.geekstorage.com/gs/service/vps"&gt;Geekstorage&lt;/a&gt;. I talked with one of my friends who's already set up some VPS and has a lot of experience with Linux. So I spent most of my time today learning about VPS and Linux, httpd setup and all those things.&lt;br /&gt;&lt;br /&gt;I must say that I'm happy with the choice I made although I pay like 10 times what I paid before. The support guys of geekstorage replied quickly (max. 2h although I posted my tickets in the middle of the day... in Europe). Not that I had any problem... just questions about setups and how to do things. I'll tell you more once I have more experience with these guys :)&lt;br /&gt;&lt;br /&gt;I worked on a new release of SSCXML yesterday. Added some keywords to replace the &amp; and &amp;gt; and &amp;lt; signs. Using those straightforward in condition strings within XML is no valid XML. You'ld have to write "&amp; a m p ;" for an &amp; (Sorry... had to put spaces between letters). So I added keywords which can be used by the users to replace things like &amp;&amp;, &amp;lt;= or &amp;gt;= (keywords are "and", "le" and "ge"). A "(a&amp;lt;5)&amp;&amp;(b&amp;gt;10)" would become "(a lt 5) and (b gt 10)". As readable and easy to retain as C/C++ code :)&lt;br /&gt;&lt;br /&gt;So, SSCXML is V1.04 now...&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-9101558928133144031?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/9101558928133144031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=9101558928133144031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/9101558928133144031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/9101558928133144031'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/migrating-domains-and-sscxml.html' title='Migrating domains and SSCXML'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-662197623220738438</id><published>2008-09-04T02:10:00.001-07:00</published><updated>2008-09-04T02:13:24.710-07:00</updated><title type='text'>Still searching...</title><content type='html'>&lt;span class="Apple-style-span" style="  white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;for the ideal setup but I think I have found something that comes close to it. I'm talking about my new TV and the PS3... at least, what I would like to buy... if my wife would be ok with it :)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Ukdm (from gamedev.net) suggested to take a look at the Samsung screens. So I did and I would like to thank him for this. And for pointing to the avforums. In fact, I learned that some Philips TVs (the constructor I wanted to pick initially) had problems displaying the PS3 signal through HDMI. There seems to be a "lag" between the user input and the screen display, something that isn't reported for ie. the Samsung screens. I learned a lot about screens on that forum :) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;So I spent most time of yesterday morning reading the forum, picking out 3-4 screens I wanted to look at at my local TV store. After some hesitation, I finally decided to pick the Samsung LE40A552. It's slightly smaller (2 inches) than the Philips TV I wanted to take initially, but I compared the displays and I felt more comfortable with the Samsung one. And so did my wife. But...  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;While my wife was ok with picking the TV, she was less fine with picking a PS3 in the same time :( I feared something like this. As she felt that I was quite upset (I left the store without buying anything; yes, I can be stubborn), and after some arguing why I want to have a PS3, she said that she would buy me the TV as a birthday present and that I could buy the PS3 myself... Stubborn as I am, I said that this didn't interest me (well, I want to change TV, not her, so I want to pay it all myself), but she said: "You have to come because if I go myself a) I might damage the TV while transporting it myself and b) I might get the wrong one." Never argue with your wife...  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Well... finally all this gave me a real bad head-ache and I went to bed early (like 9 pm); that's why there was no blog update yesterday.  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Have fun, Stefan&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-662197623220738438?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/662197623220738438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=662197623220738438' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/662197623220738438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/662197623220738438'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/still-searching.html' title='Still searching...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-6286468837194376539</id><published>2008-09-02T06:51:00.000-07:00</published><updated>2008-09-02T07:15:47.732-07:00</updated><title type='text'>New TV or no new TV, that's the question!</title><content type='html'>It's been some time since I'm looking into buying a flat screen TV. Not one of those which are called "HD ready" and which at most have 768 pixels in height. I'ld like to have one of those 1080 pixel screens. The one I liked most is the Philips 42PFL5603. It's a 42 inch full HD screen with 4 HDMI connections, PC entry, scart and some other stuff. The current price here in Belgium is ~1000€ ($1.466). It might be a bit cheaper in Germany, but I like to keep the stores where I buy expensive stuff nearby :)&lt;br /&gt;&lt;br /&gt;I still haven't bought it but I'm getting close to it. So, does anyone have good experience with this TV or a similar model? Please comment :)&lt;br /&gt;&lt;br /&gt;Also, I would like to buy a PS3. Not only because it seems to be a good console but also because it's a "cheap" blue ray player. Most other player cost the same or more but only can play BRD. At least, the PS3 has games one can buy. And those got slightly cheaper. You can find them for rather 30€ ($44).&lt;br /&gt;&lt;br /&gt;Has anyone some advice about "must have" games on the PS3? Please comment :)&lt;br /&gt;&lt;br /&gt;Today I worked for my client in the music business. As I already said, sometimes it's just good to see that your planning and programming make life easier :) Yesterday we were talking about some new stuff I would have to implement. Our initial planning was 2 weeks of work. Today, I sat down, took a look at what we already have, started programming and finished everything :) Well... at least, it looks finished... My client will have a look at it tomorrow morning. I'm almost sure that we'll have to catch some special cases or some other mysteries of the music business :)&lt;br /&gt;&lt;br /&gt;Have fun (and don't forget to comment),&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-6286468837194376539?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/6286468837194376539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=6286468837194376539' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6286468837194376539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6286468837194376539'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/new-tv-or-no-new-tv-thats-question.html' title='New TV or no new TV, that&apos;s the question!'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-5813121187201844996</id><published>2008-09-01T14:14:00.000-07:00</published><updated>2008-09-01T14:25:49.047-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='State Chart XML'/><category scheme='http://www.blogger.com/atom/ns#' term='SSCXML'/><title type='text'>Return to work...</title><content type='html'>Today I visited one of my clients to talk about the next programming stuff to do for him. Nothing really spectacular. But this is the next stepstone in the business application we're creating. It's always good to make step forward and see that things work out well as expected and planned.&lt;br /&gt;&lt;br /&gt;This evening I spent some time working on SSCXML. I had a user remarking that any expression using &amp;amp; or &gt; or &lt;&gt;= or &lt;= is no valid XML code. Instead when using a normal notepad, one has to put in "&amp;amp; a m p;" (please read it condensed) to express valid xml code.&lt;br /&gt;&lt;br /&gt;Now this would be tedious to edit and the user suggested not to stick to C/C++ coding style here and use statements such as "and", "or", "lt", "gt", "le", "ge" and "eq". I added this to SSCXML tonight and my first tests ran fine. Now, I still have to trigger this a little bit since my current check is not independent of the cap. "and" will be recognized, "AND" or "And" will not... so I want to sort this problem out first before working on any additional stuff.&lt;br /&gt;&lt;br /&gt;Talking about additional stuff for SSCXML: I'm thinking of enhancing the engine a little bit by allowing delegators or registering of class functions for executable functions in the scxml code. I still have to think about this, but it will definitely go into SSCML.&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-5813121187201844996?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/5813121187201844996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=5813121187201844996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/5813121187201844996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/5813121187201844996'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/09/return-to-work.html' title='Return to work...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-101408545749068142</id><published>2008-08-31T05:46:00.000-07:00</published><updated>2008-08-31T05:59:02.171-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wedding'/><category scheme='http://www.blogger.com/atom/ns#' term='happyness'/><title type='text'>My Wedding</title><content type='html'>Phew... what a day... on august 23rd I married Christelle, the wife of my life. We had a great day and everyone was happy :)&lt;br /&gt;&lt;br /&gt;And I was happy, too. I've talked about friendship a couple of days before my wedding and me wondering if I have any friends. I found the answer: I have friends. I have the best friends one can imagine. Those who lend you a shoulder when you need it. Those who made me a surprise when they brought another of my friends with them... I wonder if they remarked that I had to leave the room... I had tears in my eyes and I didn't want to show it...&lt;br /&gt;&lt;br /&gt;I have uploaded a couple of photos which I would like to share here. It's just Christelle and me...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240657816031696802"&gt;&lt;img src="http://lh4.ggpht.com/MetronSM/SLqOhHnxl6I/AAAAAAAAAFM/QmzLR08mIwA/s144/P1000158.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240657818637879362"&gt;&lt;img src="http://lh4.ggpht.com/MetronSM/SLqOhRVIyEI/AAAAAAAAAEo/hti889W4rVU/s144/P1000166.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240657820404364754"&gt;&lt;img src="http://lh3.ggpht.com/MetronSM/SLqOhX6TNdI/AAAAAAAAAEw/Gpd5l__1p5I/s144/P1000167.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240657822587398706"&gt;&lt;img src="http://lh6.ggpht.com/MetronSM/SLqOhgCxqjI/AAAAAAAAAFc/xTF24Q37I8I/s144/P1000181.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240658740132617906"&gt;&lt;img src="http://lh4.ggpht.com/MetronSM/SLqPW6KmnrI/AAAAAAAAAFw/gw66aoegFJM/s144/PICT7278.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240658744384663970"&gt;&lt;img src="http://lh6.ggpht.com/MetronSM/SLqPXKAXsaI/AAAAAAAAAF4/VxkW_F2Dz1s/s144/PICT7281.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240657824359590866"&gt;&lt;img src="http://lh4.ggpht.com/MetronSM/SLqOhmpTK9I/AAAAAAAAAFA/LL8Osr5UECU/s144/P1000201.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240658739216780514"&gt;&lt;img src="http://lh6.ggpht.com/MetronSM/SLqPW2wQDOI/AAAAAAAAAFo/hCsTIF1SDSA/s144/P1000206.JPG" /&gt;&lt;/a&gt;&lt;a href="http://picasaweb.google.be/MetronSM/MyWedding/photo#5240665433068361586"&gt;&lt;img src="http://lh5.ggpht.com/MetronSM/SLqVcfS1V3I/AAAAAAAAAG4/2S-pzs15WCE/s144/P1000193.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would like to say thank you to all of those who were present at my wedding, to those who send me kind words, and those who thought of us on our special day.&lt;br /&gt;&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-101408545749068142?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/101408545749068142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=101408545749068142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/101408545749068142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/101408545749068142'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/my-wedding.html' title='My Wedding'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/MetronSM/SLqOhHnxl6I/AAAAAAAAAFM/QmzLR08mIwA/s72-c/P1000158.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-613519752836909759</id><published>2008-08-21T07:34:00.000-07:00</published><updated>2008-08-21T07:52:26.878-07:00</updated><title type='text'>Character Skills</title><content type='html'>Yesterday I wrote about the different character values. Today it's the character skills I'll describe.&lt;br /&gt;&lt;br /&gt;During the game the characters gain XP. XP then can be used to acquire skills they can use in the game.&lt;br /&gt;&lt;br /&gt;Skills are split into to categories: general and exclusive skills. General skills can be used by anyone even those who are not trained. If an untrained character tries to use a skill, he only has a 20% chance to succeed.&lt;br /&gt;&lt;br /&gt;When a character learns a skill, a random skill percentage is determined and then modified by the Skill Modifier Table. Using the table, a character who learns a skill would never have a value less than 31. The maximum value for a skill is 99.&lt;br /&gt;&lt;br /&gt;On the bottom of the entry you'll find skills that are only used for NPCs. Those skills are necessary to be able to use character skills.&lt;br /&gt;&lt;br /&gt;&lt;a class="mceItemAnchor" title="GeneralSkills" name="GeneralSkills"&gt;&lt;/a&gt;&lt;strong&gt;The general skills are:&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Shadowing:&lt;/em&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ability to follow someone without being noticed.&lt;/li&gt;&lt;li&gt;Shadowing check is done when:&lt;br /&gt;- Character being shadowed makes a move which would put him out of the sight of the follower (running into crowd, jumping on bus, suddenly get into a building). Failing check means character being followed has gotten out of sight.&lt;br /&gt;&lt;br /&gt;- Character being shadowed moves more than 60 feet indoors, two blocks in the city or two miles outdoors in the country. Failing check means the character knows being followed.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the game, the player assigns to one of his characters to shadow another one. The characters movements are then automatically generated by the computer.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Stealth:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to move short distances without being seen or heard.&lt;/li&gt;&lt;li&gt;Ability to hide in a position where you can observe someone without being seen.&lt;/li&gt;&lt;li&gt;Chars with this skill use darkness, shadows, doorways and other natural cover to stay out of sight.&lt;/li&gt;&lt;li&gt;Skill check when:&lt;br /&gt;- Someone is looking for them or trying to see them during the turn.&lt;br /&gt;- Char has moved 60 feet.&lt;br /&gt;- Char first comes into someone's Field of Vision.&lt;/li&gt;&lt;li&gt;Failing check means that other involved chars get to make an observation check. If they pass the observation check, they have seen or heard the char using stealth.&lt;/li&gt;&lt;li&gt;There must be darkness, shadow or cover to use stealth. No one (except the own team) must observe the char who wants to enter stealth.&lt;/li&gt;&lt;li&gt;Stealth cannot be used together with shadowing.&lt;/li&gt;&lt;li&gt;Characters in a fight cannot use stealth (is dropped at beginning of fight).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Explosives:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to use explisives to make bombs, blow up saves, etc.&lt;/li&gt;&lt;li&gt;Percent chance that char will set up the explosives correctly and safely.&lt;/li&gt;&lt;li&gt;Failure means the char either made a minor or a major mistake.&lt;/li&gt;&lt;li&gt;Minor mistake: ie. Fuse didn't work&lt;/li&gt;&lt;li&gt;Major mistake: fuse too short; char blew himself up.&lt;/li&gt;&lt;li&gt;Determined by difference between chars skill value and rolled value. Small difference -&gt; minor mistake.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Finding smuggled goods:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to find smuggled goods hidden in a car, truck, boat, airplane or other vehicle.&lt;/li&gt;&lt;li&gt;Char without skill will not find smuggled goods by searching normally. (Make explusive skill?!?)&lt;/li&gt;&lt;li&gt;On check chars score is modified by smugglers smuggling score.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;The exclusive skills are:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Accounting:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to keep financial records, alter them to hide stolen or misused money. (For bad NPCs)&lt;/li&gt;&lt;li&gt;Ability to detect altered records. (For the good ones)&lt;/li&gt;&lt;li&gt;Detect altered/doctored books:&lt;br /&gt;- Subtract score of accountant who doctored from the score of the accountant checking the books.&lt;br /&gt;- Use result as positive or negative modifier to the skill score of accountant checking the books.&lt;br /&gt;- Use modified score to make skill check. If modified score is negative -&gt; automatic fail.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Ballistics:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to determine whether a specific bullet was fired from a specific gun. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Boxing:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Char with boxing skill make a boxing skill check instead of agility check in a fist fight.&lt;/li&gt;&lt;li&gt;Success means char has hit opponent twice in the same turn. One hit normal injuries, second hit double injuries.&lt;/li&gt;&lt;li&gt;Failure means char makes agility check.&lt;/li&gt;&lt;li&gt;All modifiers applies to agility score in a fistfight apply to boxing skill.&lt;/li&gt;&lt;li&gt;Char with boxing skill rolling 5% or less when making boxing check knocks out opponent. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Counterfeit detection:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to detect counterfeit money.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Fingerprinting:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to take fingerprints at the scene of a crime, analyze and match sets of prints.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Gunsmithing:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to repair any type of firearm.&lt;/li&gt;&lt;li&gt;Successful check means the char can repair the item.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Knife throwing:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to throw knives accurately in fist- or gunfights.&lt;/li&gt;&lt;li&gt;Handled in the same way as gunfire but checks against knife throwing score instead of agility score.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Lockpicking:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to open locks using a small set of lockpicking tools.&lt;/li&gt;&lt;li&gt;Needs lockpicking tools to use skill.&lt;/li&gt;&lt;li&gt;Cannot be used to open a safe.&lt;/li&gt;&lt;li&gt;Lockpicking takes some time (up to 3 turns).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Wiretapping:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to connect and run wires from someone's phone to another location where the phonecalls can be recorded.&lt;/li&gt;&lt;li&gt;Location no more than 50 feet away from telephone pole carrying the wire for the phone to be tapped.&lt;/li&gt;&lt;li&gt;Failing means the equipment malfunctions or char made error wiring the tap.&lt;/li&gt;&lt;li&gt;Failure will not be remarked instantly. There will be no phone calls recorded. Player has to check this (ie. observation shows the phone is picked up and a call is done but nothing is recorded).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a class="mceItemAnchor" title="NPCSkills" name="NPCSkills"&gt;&lt;/a&gt;&lt;p&gt;&lt;strong&gt;NPC Skills:&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Accounting:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If a book has been doctored by a NPC, the NPC must have the accounting skill. The NPC who doctored the book will be referenced in the book data.&lt;/li&gt;&lt;li&gt;If the NPC who altered the book is not known, a Accounting value is stored in the book. This value is then used as the accounting skill score.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Counterfeiting:&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ability to make printing plates, to run a press.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;These are the currently planned skills. It's quite possible that one or the other might get dropped while a new one might see the light of day.&lt;/p&gt;&lt;p&gt;On another topic: It's quite possible (almost certain) that I cannot do any new blog entries until the end of the next week. This is due to the fact that I have some preparations to do for my wedding. Afterwards I'll leave for a week to a small honeymoon trip.&lt;/p&gt;&lt;p&gt;Next time I write, there'll be some xml code and talking about code refactoring. In fact, I reduced the character value components to one single component. Talking about that later :)&lt;/p&gt;&lt;p&gt;Have fun,&lt;/p&gt;&lt;p&gt;Stefan&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-613519752836909759?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/613519752836909759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=613519752836909759' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/613519752836909759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/613519752836909759'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/character-skills.html' title='Character Skills'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-2612173344737660854</id><published>2008-08-20T06:31:00.000-07:00</published><updated>2008-08-20T07:20:17.330-07:00</updated><title type='text'>Working on the game rules.</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;first of all I would like to say thank you to those who contacted me and send me kind words for my yesterday down. I had a talk with the "three remaining" and I'm happy that they are able to come to my wedding. This gave me enough motivation to work on the game rules and specially on the character values and the character skills.&lt;br /&gt;&lt;br /&gt;To not overwelm you with too much text, I'll split the cake in half and will post the character value description today. Tomorrow I'll post the skill list :)&lt;br /&gt;&lt;br /&gt;Here we go:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Character Values&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;br /&gt;Character values represent the character with his strengths and weaknesses. During the game, the player will be able to add gained char value points to the different values to improve the characters. It might be possible that some values can be altered through objects which are used by the characters. Character value modifiers are then added.&lt;/div&gt;&lt;br /&gt;This is the mapping and definition of the character values:&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Strength:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Measures how strong a character is. &lt;/li&gt;&lt;li&gt;Character can lift weight 2x his strength. &lt;/li&gt;&lt;li&gt;Determines punching score. &lt;/li&gt;&lt;li&gt;Percent chance to breakdown a door. &lt;/li&gt;&lt;li&gt;On character creation: Helps to determine Health.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Agility:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Measures the character's coordination. &lt;/li&gt;&lt;li&gt;Indicates accuracy at punching and shooting. (Basic percent chance) &lt;/li&gt;&lt;li&gt;Basic percent chance to do unusual things such as walking on ledge or leaping a fence. &lt;/li&gt;&lt;li&gt;On character creation: Helps to determine Health.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Vigilance:&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Measures the character's alertness to things that are concealed, unusual or out of place. &lt;/li&gt;&lt;li&gt;Used to determine surprise at start of fight. &lt;/li&gt;&lt;li&gt;Character's percent chance to notice hidden objects and clues.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Charisma:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Measures how easily the character can influence other people. &lt;/li&gt;&lt;li&gt;Represents: personal charm, looks, presuasiveness, how tough the character is. &lt;/li&gt;&lt;li&gt;Helps influence NPCs, get answers from prisoners and suspects.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Luck:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Measures how lucky a character is. &lt;/li&gt;&lt;li&gt;Percent chance to perform uncertain actions and escape certain death.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Health:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Injury is measured in points. &lt;/li&gt;&lt;li&gt;Health represent the hitpoints and this represent the total number of injury points. &lt;/li&gt;&lt;li&gt;Used to determine knock out or death. &lt;/li&gt;&lt;li&gt;Calculation: Health = (Strength+Agility)/10 + 5&lt;/li&gt;&lt;li&gt;Is calculated when Strength or Agility are altered.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Punch points:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Represents the number of injury points when opponent is hit. &lt;/li&gt;&lt;li&gt;Calculation: PP = (Strength/20)+1 &lt;/li&gt;&lt;li&gt;Calculated when Strength is altered.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That's it for today. Have fun,&lt;/p&gt;&lt;p&gt;Stefan&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-2612173344737660854?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/2612173344737660854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=2612173344737660854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/2612173344737660854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/2612173344737660854'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/working-on-game-rules.html' title='Working on the game rules.'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-8056473626954205729</id><published>2008-08-18T23:47:00.000-07:00</published><updated>2008-08-19T00:25:15.019-07:00</updated><title type='text'>Friendship</title><content type='html'>Have you ever wondered about your definition of friendship? For me, friendship means (or ment until now) that you're there for your friends when they need you. That you're available for them when something important in their life happens. That you share the good and the bad moments in life.&lt;br /&gt;&lt;br /&gt;I don't have much "friends". Even though I have ~80 people on my ICQ list, I can count the number of people who I consider friends on my two hands: 8. I've been working with all of them at one moment or another in my life. With some of them I've been through knee deep shit (i.e. when the company we worked for went down the drains, or when we had to work for several month non stop 20h/24h to finish a product), with some of them I felt a strong common interest, I know some of them since at least 8/9/10 years and one of them is my friend since ~21 years.&lt;br /&gt;&lt;br /&gt;At some point my oldest friend helped me when I struggled in my life. And so did I when other were in need: I pulled them into the companies I worked for, got them contracts, talked to my contacts to help my friends find work, kept them with me working even when my contractor asked me to drop them. I listened when they had trouble with their girlfriend, instantly jumped into the car when they asked my help for one of their projects, invited them for BBQs and dinners at my home, made hilarious plans for own projects with them...&lt;br /&gt;&lt;br /&gt;That's what's friendship is all about for me...&lt;br /&gt;&lt;br /&gt;As those who read my blog might know, I'll marry the wife of my life next saturday. That's a really special moment for me and therefor I invited my 8 friends to share that moment with me. In first time, everyone told me, they're happy to come to my wedding... and now, not even a week before my wedding, I know that at most three of them might come... and I'm not even sure about them. I haven't had contact with one of them since almost two weeks and the other two might not come if they learn that another one just had told me yesterday evening that he will not come. While one of them has to work that week-end outside of Europe, others suddenly confused dates and are on holidays, some didn't find a way to travel (the 40km) to my wedding or prefer going to their girlfriends home instead of making her come to my wedding (since they're invited, too) or that they prefer not to come since their wife can't be present...&lt;br /&gt;&lt;br /&gt;While I can understand some reasoning, I'm totally and absolutely down. I haven't slept this night because I was thinking about what is currently happening to me. I was thinking about my definition of friendship. And I was trying to find occasions where my "friends" actually tried or wanted to be with me. It was this moment which scared me: I suddenly realized that my friends never invite me to their birthdays, they don't invite me when they have a BBQ, they don't invite me when they have a cinema evening, they don't ask me if I want to join them when they play games in the evening... I admit that I would have to drive ~100km (~62 miles) to get there but I don't consider this as a problem. I jump into the car when they ask me to help them...&lt;br /&gt;&lt;br /&gt;And this is where I begin to struggle on my definition of friendship. Is this only a one-way drive? Have I done something that pissed off my friends? Or don't they want to be with me because I have a family, wife and kids?&lt;br /&gt;&lt;br /&gt;And all of a sudden, a question rised from deep within of me: Do I have friends?&lt;br /&gt;&lt;br /&gt;And I couldn't find the answer....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-8056473626954205729?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/8056473626954205729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=8056473626954205729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8056473626954205729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8056473626954205729'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/friendship.html' title='Friendship'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-877984476323519499</id><published>2008-08-18T06:48:00.000-07:00</published><updated>2008-08-18T06:57:03.674-07:00</updated><title type='text'>No post yesterday</title><content type='html'>Ok... I plead guilty. I didn't post yesterday... In fact, I had so much to do, that I didn't have much time for myself. After getting up in the morning, we went swimming with the kids. They had to get out of the house for some hours and swimming is the right activity for them.&lt;br /&gt;&lt;br /&gt;Afterwards, we (my future wife and I) worked on some wedding stuff and realized that we forgot to go to the bakery to order our wedding cake. So we had to phone them and go there in the afternoon.&lt;br /&gt;&lt;br /&gt;I also had some week-end chats with one of my clients. We pushed our meeting from today into the first week of september. I have too much to do this week... the wedding is eating up my time :)&lt;br /&gt;&lt;br /&gt;So... today I spent some time looking for a CMS for the Prohibition Online website. Currently I don't want to do a complete site by myself. I just want to throw a small site together where I can display some info, eventually some screen shots (later on), put some downloads and have (perhaps) a small wiki where I can put some things like the game design document.&lt;br /&gt;&lt;br /&gt;Currently the site looks awful...&lt;br /&gt;&lt;br /&gt;I've been thinking about the games' framework, the rule integration, the client/server separation etc. There's quite some work before me :) And I have to make a small plan, what has to be done...&lt;br /&gt;&lt;br /&gt;And this is, where I would like to invite you: I would like you to give me some hints about what you would like to see in a turn-based strategy game with a setting in the time of Prohibition (United States). Feel free to post in the comments section.&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-877984476323519499?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/877984476323519499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=877984476323519499' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/877984476323519499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/877984476323519499'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/no-post-yesterday.html' title='No post yesterday'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-6131261447154478719</id><published>2008-08-16T05:01:00.000-07:00</published><updated>2008-08-16T05:03:32.384-07:00</updated><title type='text'>Nothing really new...</title><content type='html'>No, I didn't forget to post an entry yesterday. I didn't have any time. My wife's computer didn't want to boot normally. It always freezed in the middle of the boot splash screen. I had some trouble making the save mode to work but finally, after almost 10 hours of work, research in the internet, trying and crying, the machine booted normally at 1:20 am.&lt;br /&gt;&lt;br /&gt;As you can imagine, I didn't have much time to work on Prohibition. Nevertheless, I did some research for virtual server hostings. In fact, I would like to have a virtual server somewhere to host one or more of Prohibitions Server software in the future. If you tell me, that this is a little bit early, then you're probably right. But if I want to stick to my current plans for the game, I have to be sure that I can implement the client/server structure as I want it. Currently, the server software is programmed under Win32. There are some virtual server plans for Windows, but I have to check, if they fit my needs.&lt;br /&gt;&lt;br /&gt;Basically, my games structure should look like this: There's one matchmaking/game server (or main server if you prefer) which holds a list of all public games that are going to start. People can connect to that first server, see the game list, download updates or new maps. Once they have selected a game, the main server connection is dropped to connect to the player hosting the game.&lt;br /&gt;&lt;br /&gt;That's the plan... we'll see, if I can get so far :)&lt;br /&gt;&lt;br /&gt;And for anyone wondering, if this is a game, one would have to pay for... I don't know... really. In fact, I don't program this game to gain money. I do it, because I want to have fun with it. I have several other contracts which bring in the money I need. And I think that I can afford spending a little bit of money for things like the server etc.&lt;br /&gt;&lt;br /&gt;That said... if anyone is interesting in helping out (on a non-paid basis), I'll appreciate any graphic artist willing to make some scribbles for the game style. Either PM me or send me an email to "maton at sidema dot be".&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-6131261447154478719?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/6131261447154478719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=6131261447154478719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6131261447154478719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6131261447154478719'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/nothing-really-new.html' title='Nothing really new...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-7588585394340268815</id><published>2008-08-14T06:49:00.000-07:00</published><updated>2008-08-14T07:58:00.325-07:00</updated><title type='text'>About Prohibition</title><content type='html'>Today I'll write a little bit about Prohibition, the game I'm currently working on in my spare time. So no source codes today :)&lt;br /&gt;&lt;br /&gt;Prohibition is (will be) a turn-based strategy game. Single- and multiplayer games will be possible. In the single player game, the player has to lead a group of special agents, police man and detectives through various missions in a story mode. The multiplayer game will contain PvP (bad vs good and bad vs bad... no good vs good). While it's a TBS game, there will be some role playing aspects in it. The entities (NPCs and player) will have a set of character values such as Strength, Agility, Vigilance or Charisma. Throughout the game, the player will be able to add new abilities to his entities, buy weapons and items and decide, who to take on a mission and who not.&lt;br /&gt;&lt;br /&gt;I spend the most day of today working on the base ruleset and implementing the base values of the NPC and player entities. While the base values were quickly implemented (they're based on components), I'm still working out the handling of the ruleset of the game.&lt;br /&gt;&lt;br /&gt;Today I've also registered the domain names for my game:&lt;br /&gt;&lt;br /&gt;prohibition-online.com&lt;br /&gt;prohibitiononline.com&lt;br /&gt;prohibition-online.net&lt;br /&gt;prohibitiononline.net&lt;br /&gt;prohibition-online.info&lt;br /&gt;prohibitiononline.info&lt;br /&gt;prohibition-online.org&lt;br /&gt;prohibitiononline.org&lt;br /&gt;&lt;br /&gt;At least, no one can pick my game's name website :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-7588585394340268815?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/7588585394340268815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=7588585394340268815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/7588585394340268815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/7588585394340268815'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/about-prohibition.html' title='About Prohibition'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-6558425914660246160</id><published>2008-08-13T07:22:00.000-07:00</published><updated>2008-08-13T07:50:52.004-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marriage'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='templates'/><title type='text'>Stressful life...</title><content type='html'>Gosh... sometimes life can be stressful :) My cousin, who will be my witness (is it called like this?) at my marriage, had some problems with the date. In fact on august 23rd (a saturday) he should have a university exam. Today was the last day I had to confirm the witnesses of my marriage to the major of our town. So... I started asking friends to replace my cousin. Finally, an hour before desk closure at the major hall, my cousin called me to confirm his presence. He managed to move the exam by one week (there are several of those exams and he was pushed into another group). But I can tell you that I had some sleepless nights because of this :)&lt;br /&gt;&lt;br /&gt;Phew... back to work. I had some problems concentrating today (missing sleep) and only managed to get some work done in the afternoon. I've been taking a step back from my source code and the overall layout of the Logic implementation. I'm pleased with most of it. Those who carefully ( :) ) read my blog know that I wasn't pleased with the template stuff in the EntityManager. Also, I didn't like the idea of having the components and entities that might be created by a simple new anywhere in the code. I finally decided to use factories for template, entity and component creation.&lt;br /&gt;&lt;br /&gt;The factory approach also allowed me to reconsider the create functions for the templates. Remember that I had 2 different create functions? One for the entity template and one for the component template. The factory approach led me to the conclusion that only one function is needed for both. Basically I kept the create function for the entity template which uses a type and a name string. Component templates do have those two strings, too, since they're derived from the template class. Component templates just set the type string into the name string (Currently I think that component templates don't have to be named).&lt;br /&gt;&lt;br /&gt;Ok... now I have 2 factories: the template factory and the component factory:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;typedef Template*   (*templateCreator)(Sidema::String _name);&lt;br /&gt;&lt;br /&gt;class TemplateFactory : public Sidema::Singleton&lt;TemplateFactory&gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Template management.&lt;br /&gt; void  registerTemplate( const Sidema::String &amp;_type, templateCreator _func);&lt;br /&gt; void  unregisterTemplate( const Sidema::String &amp;_type );&lt;br /&gt; void  clearAllTemplates();&lt;br /&gt;&lt;br /&gt; Template* createTemplate(const Sidema::String &amp;_type, const Sidema::String &amp;_name );&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Xtructors.&lt;br /&gt; TemplateFactory();&lt;br /&gt; ~TemplateFactory();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; friend class Sidema::Singleton&lt;TemplateFactory&gt;;&lt;br /&gt;&lt;br /&gt; typedef std::map&lt;Sidema::String, templateCreator&gt; TEMPLATECREATORS;&lt;br /&gt; TEMPLATECREATORS m_templateCreateFunctions;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;typedef Component* (*componentCreator)(ComponentTemplate *_template);&lt;br /&gt;&lt;br /&gt;class ComponentFactory : public Sidema::Singleton&lt;ComponentFactory&gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Component creator management.&lt;br /&gt; void  registerComponent( const Sidema::String &amp;_type, componentCreator _func);&lt;br /&gt; void  unregisterComponent( const Sidema::String &amp;_type );&lt;br /&gt; void  clearAllComponents();&lt;br /&gt;&lt;br /&gt; Component* createComponent(const Sidema::String &amp;_type, ComponentTemplate *_template);&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Xtructors.&lt;br /&gt; ComponentFactory();&lt;br /&gt; ~ComponentFactory();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; friend class Sidema::Singleton&lt;ComponentFactory&gt;;&lt;br /&gt;&lt;br /&gt; typedef std::map&lt;Sidema::String, componentCreator&gt; COMPONENTCREATORS;&lt;br /&gt; COMPONENTCREATORS m_componentCreateFunctions;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The fact that I didn't like the management of the templates within the entity manager led me to implement a template manager. There wasn't much to do since I only had to move some functions from the entity manager to the template manager.&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class TemplateManager : public Sidema::Singleton&lt;TemplateManager&gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Template management.&lt;br /&gt; bool loadTemplates(Sidema::String _filename);&lt;br /&gt; void unloadTemplates();&lt;br /&gt; EntityTemplate *getTemplate(Sidema::String _name);&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Xtructors.&lt;br /&gt; TemplateManager();&lt;br /&gt; ~TemplateManager();&lt;br /&gt;&lt;br /&gt; // ----------------------------&lt;br /&gt; // Template management.&lt;br /&gt; bool  addTemplate(const Sidema::String &amp;_name, Template *_template);&lt;br /&gt; void  removeTemplate(const Sidema::String &amp;_name);&lt;br /&gt; void  releaseAllTemplates();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; friend class Sidema::Singleton&lt;TemplateManager&gt;;&lt;br /&gt;&lt;br /&gt; typedef std::map&lt;Sidema::String, Template*&gt;   TEMPLATEMAP;&lt;br /&gt; TEMPLATEMAP   m_templates;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the template manager returns a pointer to a entity template. The component templates aren't stored in the template manager. In fact, since the component templates are stored within the enitity template (remember: each component template is unique to the entity template it belongs to), there was no need to do so. I could have simply returned a pointer to a template instance, but this would lead to confusion about the basic type of the template. One could think that it might be a component template he just got...&lt;br /&gt;&lt;br /&gt;With all this information (in this blog entry and the previous one), I've implemented a translator for the health component. There's only a constructor, a destructor and the create function of the translator (I'm think of renaming the create function to translate or something else because I normally use create to name static functions which create an instance of that very class; nevertheless, the function really creates something: the translated object).&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class HealthTemplateTranslator : public ComponentTemplateTranslator&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; HealthTemplateTranslator() {}&lt;br /&gt; ~HealthTemplateTranslator() {}&lt;br /&gt;&lt;br /&gt; virtual Component *create(ComponentTemplate *_template) const;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Component*&lt;br /&gt;HealthTemplateTranslator::create(ComponentTemplate *_template) const&lt;br /&gt;{&lt;br /&gt; HealthComponent *component = NULL;&lt;br /&gt;&lt;br /&gt; // Check for valid template.&lt;br /&gt; if ( _template &amp;&amp; !_template-&gt;getType().compare(HealthComponentTemplate::TEMPLATE_NAME) )&lt;br /&gt; {&lt;br /&gt;  // Get the health and create the component.&lt;br /&gt;  float maxHealth = 0.0f;&lt;br /&gt;  if ( static_cast&lt;HealthComponentTemplate*&gt;(_template)-&gt;getMaxHealth( maxHealth ) )&lt;br /&gt;  {&lt;br /&gt;   component = static_cast&lt;HealthComponent *&gt;(ComponentFactory::Instance().createComponent(HealthComponent::COMPONENT_NAME, _template));&lt;br /&gt;   if ( component )&lt;br /&gt;   {&lt;br /&gt;    // Set the health values.&lt;br /&gt;    // Note: The current health should be set to the maximum health&lt;br /&gt;    // to have at least living entities, when they startup :)&lt;br /&gt;    component-&gt;setMaxHealth(maxHealth);&lt;br /&gt;    component-&gt;setCurrentHealth(maxHealth);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return component;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Et voila... the returned component is a translated instance of the health component, filled with the data of the health component template.&lt;br /&gt;&lt;br /&gt;The next step is to create an entity from an entity template. While this might sound strange, I still have some problems to pinpoint the differences between a static and a dynamic object. Every difference I can think of can be implemented by components... is it possible that I don't need different specializations of entities?!?&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;br /&gt;&lt;br /&gt;PS: I once again changed a little bit the css of the blog... I still got comments that the font was a) too bright and b) the letters were not far apart enough... Fixed this with another font :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-6558425914660246160?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/6558425914660246160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=6558425914660246160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6558425914660246160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6558425914660246160'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/stressful-life.html' title='Stressful life...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-8636779611171175730</id><published>2008-08-12T07:08:00.000-07:00</published><updated>2008-08-12T08:19:52.260-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='templates'/><category scheme='http://www.blogger.com/atom/ns#' term='Objects'/><title type='text'>Style change and template stuff</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;I had some people tell me that the old style in this blog had some tiny font settings. So I increased it a little bit and cleared up the font colors to actually make it more readable. I hope you have a better reading experience now... Please make a comment if you have any suggestion for improvement.&lt;br /&gt;&lt;br /&gt;Well... that said, let's dig into some code :) As I mentioned in one of my earlier postings, I have some ideas on how to handle the transition from a template to the actual object. But before I tell you about the decision I made (on how to achieve that transition), let me tell you about the components and entities.&lt;br /&gt;&lt;br /&gt;A component, as stated in my earlier posts, represents a piece of code that achieves a given task for an entity. This might be holding the health data, holding the current animation state, holding a list of animations or sounds, holding the current experience points.&lt;br /&gt;&lt;br /&gt;Although I use the word "holding" a lot when talking about components, they're not only about data storing. Components must be able to alter the entity. While this might sound strange to some ears, it makes perfectly sense in my case. Since I want to have a component that is able to hold the current state of an animation, the very same component must be able to make an update to that animation (ie. call an update on it using a time interval). Also, there might be a component that is able to manage buffs or debuffs for a character. Those buffs must be updated and (in most cases) removed if ie. they usage time has expired. For the above mentioned reasons, a component not only holds data, but also has an update function which receives a delta time since the last call to that function.&lt;br /&gt;&lt;br /&gt;The entities store a set of components. This is the very basis of all components. Now, to make my life a little bit easier, I'll have some specialisation for entities: there'll be static entities (those who wont do anything in the world; one might call them decorators) and dynamic entities. Dynamic entities will be (in most cases) NPCs and PCCs (player controlled characters :) ). There will also be dynamic entities representing gfx and sound effects, bullets and other physics driven objects, etc.&lt;br /&gt;&lt;br /&gt;Ok... now that we have a basic sketch about components and entities, I'll write about the templates and how they're going to be "translated" into objects. "Translated" is the right wording at this point. In fact, the templates for ie. a component have to be translated into the class instance of that very component. To achieve this, I decided not to use the template class itself but a seperate class which I call TemplateTranslator. In fact, there are two basis classes: ComponentTemplateTranslator and EntityTemplateTranslator (two since I already made the difference on the template side for the templates). The translator itself on has one basic function: create.&lt;br /&gt;&lt;br /&gt;Here are the interfaces for the component and entity template translators:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class ComponentTemplateTranslator&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; virtual Component *create(const ComponentTemplate *_template) const = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class EntityTemplateTranslator&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; virtual Entity *create(const EntityTemplate *_template) const = 0;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Easy and straight-forward... just as I like it :)&lt;br /&gt;&lt;br /&gt;Now, I don't want to have a bunch of translators hanging around... so I have a small manager who holds the different translators. The interface is small:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class TemplateTranslatorManager : public Sidema::Singleton&lt;TemplateTranslatorManager&gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Translator handling.&lt;br /&gt; void registerComponentTranslator(Sidema::String _type, ComponentTemplateTranslator* _translator);&lt;br /&gt; void registerEntityTranslator(Sidema::String _type, EntityTemplateTranslator* _translator);&lt;br /&gt;&lt;br /&gt; // ----------------------------&lt;br /&gt; // Translator usage.&lt;br /&gt; Component* useTranslator(const ComponentTemplate *_template) const;&lt;br /&gt; Entity*  useTranslator(const EntityTemplate *_template) const;&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; // ----------------------------&lt;br /&gt; // Xtructors.&lt;br /&gt; TemplateTranslatorManager();&lt;br /&gt; ~TemplateTranslatorManager();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; friend class Sidema::Singleton&lt;TemplateTranslatorManager&gt;;&lt;br /&gt;&lt;br /&gt; // ----------------------------&lt;br /&gt; // Translator handling.&lt;br /&gt; void freeAllTranslators();&lt;br /&gt;&lt;br /&gt; typedef std::map&lt;Sidema::String, ComponentTemplateTranslator*&gt; COMPONENTTRANSLATOR;&lt;br /&gt; COMPONENTTRANSLATOR m_componentTranslators;&lt;br /&gt;&lt;br /&gt; typedef std::map&lt;Sidema::String, EntityTemplateTranslator*&gt;  ENTITYTRANSLATOR;&lt;br /&gt; ENTITYTRANSLATOR  m_entityTranslators;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To register a translator, you simply tell the manager, which type (or in case of the entity template determined the name) is handled by the translator. Opposed to component templates which are identified by the type, entity templates are identified by their name. Thus you cannot have a template named "xyz" creating an dynamic entity while another template having the same name would create a static entity.&lt;br /&gt;&lt;br /&gt;To create a component, you simply call the useTranslator() function with the component template, and the according component is created (if a translator has been registered for it).&lt;br /&gt;&lt;br /&gt;I sense that you want to ask me: Why the heck don't you just implement the "translator" into the template itself since you already have a specialisation for the template?&lt;br /&gt;&lt;br /&gt;The answer ist: because the client and the server behave different. While the translators on the client would transfer all information from the template to the object, the translators on the server might want to drop unnecessary information. You don't need gfx information about door on the server, you only need to know if it's open, closed or locked. Also, you might want to have some AI calculations on the server and thus add an ai component to the template, but only create an instance of it on the server.&lt;br /&gt;&lt;br /&gt;If you have any questions, suggestions or if you simply want to discuss about this topic, don't hesitate to post a comment :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-8636779611171175730?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/8636779611171175730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=8636779611171175730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8636779611171175730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/8636779611171175730'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/style-change-and-template-stuff.html' title='Style change and template stuff'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-3942951969703644283</id><published>2008-08-11T08:00:00.001-07:00</published><updated>2008-08-11T08:14:42.673-07:00</updated><title type='text'>Data Inheritance made easy.</title><content type='html'>Yesterday I wrote that the basics for the templates seem to be finished. 'Seemed' is the right word :) In fact, while implementing the inheritance today, I figured out several things:&lt;br /&gt;&lt;br /&gt;1. the ComponentTemplates don't need to know their owner. That information is only interesting for the component that actually wants to alter something to its owner.&lt;br /&gt;&lt;br /&gt;2. Moving the ReferenceCounted Interface from the ComponentTemplates to the Templates is good :) In fact, the templates itself need the interface in order to be able to be referenced to within other interfaces. Some years ago I used reference counting all over the place for my projects. I dropped them when I was working for some clients and I thought that reference counting on my projects might be some kind of overkill. Nevertheless, the way the templates are used in my game make it necessary to ensure that any object is still available as long as another object is referencing to it. While smartpointers might sound interesting here, I did that my own small interface (just 2 functions) is enough for me.&lt;br /&gt;&lt;br /&gt;3. Not cloning... initially I wanted to just hold a pointer to the source template (from which a template inherits), clone the component template and add those clones to the current template. But I decided to not handle the inheritance this way. Why would I want to clone some data that is available and that would not be altered at this point? Inheritance of data only means replacing a component of a given type with a component of the same type (but holding different data). Therefor the only point in the source code to alter would be the point where the new component is added.&lt;br /&gt;&lt;br /&gt;Inheriting from a parent is as simple as this:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;// The basic information about the template has been loaded by the above layer.&lt;br /&gt;// That information has been used to actually create this object.&lt;br /&gt;const TiXmlNode *srctemplate = _pElement-&gt;FirstChild("inherited");&lt;br /&gt;if (srctemplate &amp;&amp; ( TiXmlNode::ELEMENT == srctemplate-&gt;Type() ))&lt;br /&gt;{&lt;br /&gt; const TiXmlElement *element = static_cast&lt;const TiXmlElement *&gt;(srctemplate);&lt;br /&gt; const char* tempType = element-&gt;Attribute("name");&lt;br /&gt; if ( NULL != tempType )&lt;br /&gt; {&lt;br /&gt;  // We have to request the source template from the entitymanager.&lt;br /&gt;  m_inheritedFrom = EntityManager::Instance().getTemplate( tempType );&lt;br /&gt;  if ( NULL == m_inheritedFrom )&lt;br /&gt;  {&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // We got the source template, we have to add the source components to the current template.&lt;br /&gt;  COMPONENTARRAY::iterator it = m_inheritedFrom-&gt;m_components.begin();&lt;br /&gt;  while ( it != m_inheritedFrom-&gt;m_components.end() )&lt;br /&gt;  {&lt;br /&gt;   addComponent( *it );&lt;br /&gt;   ++it;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The addComponent code looks like this:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;bool&lt;br /&gt;EntityTemplate::addComponent(ComponentTemplate *_component)&lt;br /&gt;{&lt;br /&gt; if ( std::find(m_components.begin(), m_components.end(), _component ) != m_components.end() )&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; // Try to find a component of the same type.&lt;br /&gt; COMPONENTARRAY::iterator it = m_components.begin();&lt;br /&gt; while ( it != m_components.end() )&lt;br /&gt; {&lt;br /&gt;  // It's the same type.&lt;br /&gt;  if ( (*it)-&gt;getType() == _component-&gt;getType() )&lt;br /&gt;  {&lt;br /&gt;   // Set the new one.&lt;br /&gt;   m_components.insert(it, _component);&lt;br /&gt;   _component-&gt;addRef();&lt;br /&gt;&lt;br /&gt;   // Release the old one.&lt;br /&gt;   (*it)-&gt;release();&lt;br /&gt;   m_components.erase(it);&lt;br /&gt;&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  ++it;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; m_components.push_back(_component);&lt;br /&gt; _component-&gt;addRef();&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nothing more is needed for inheritance from one parent to another. In the XML code, it looks like this:&lt;br /&gt;&lt;pre name="code" class="xml:nogutter"&gt;&lt;br /&gt;&lt;templates&gt;&lt;br /&gt;  &lt;template name="Goblin1" type="EntityTemplate"&gt;&lt;br /&gt;    &lt;comptemp type="HealthComponentTemplate"&gt;&lt;br /&gt;      &lt;prm name="maxhealth" value="200" /&gt;&lt;br /&gt;    &lt;/comptemp&gt;&lt;br /&gt;  &lt;/template&gt;&lt;br /&gt;  &lt;template name="Goblin2" type="EntityTemplate"&gt;&lt;br /&gt;    &lt;inherited name="Goblin1"/&gt;&lt;br /&gt;    &lt;comptemp type="HealthComponentTemplate"&gt;&lt;br /&gt;      &lt;prm name="maxhealth" value="300" /&gt;&lt;br /&gt;    &lt;/comptemp&gt;&lt;br /&gt;  &lt;/template&gt;&lt;br /&gt;&lt;/templates&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Inheritance is always resolved before the actual component template loading. Thus the overloading magically happens without any problems :)&lt;br /&gt;&lt;br /&gt;As I said: Data Inheritance made easy.&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-3942951969703644283?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/3942951969703644283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=3942951969703644283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/3942951969703644283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/3942951969703644283'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/data-inheritance-made-easy.html' title='Data Inheritance made easy.'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-1059403754999090186</id><published>2008-08-10T06:38:00.001-07:00</published><updated>2008-08-10T10:14:51.510-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entities'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='templates'/><category scheme='http://www.blogger.com/atom/ns#' term='Source code'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><title type='text'>Basis of templates and componenttemplates finished.</title><content type='html'>After a day "off" at my futre mother-in-law's home, and my son getting sick this night, I managed to find some time to work on the template and component template implementation.&lt;br /&gt;&lt;br /&gt;While there might still remain some polishing (I don't yet like the embedding of the factory functions for the templates within my entity manager), the basis seems to be finished. This means that I can load templates and refer to component templates. The code itself is straight forward since I relied on some classes I already used some years ago.&lt;br /&gt;&lt;br /&gt;First of all, I decided to use XML. For the XML loading I embedded &lt;a href="http://www.grinninglizard.com/tinyxml/"&gt;tinyXML&lt;/a&gt; into my source code. tinyXML usage is easy and since I already use it for the SSCXML lib, I didn't see any reason to switch to another reader.&lt;br /&gt;&lt;br /&gt;Second I use some classes I created some years ago: Parameter, ParameterList and Parameterized. Basically those 3 classes allow embedding of parameters of any depth to an object. The interfaces are slim and it was easy to alter the loading code to use tinyXML. Here's a preview of the interfaces:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt; class Parameter : public Parameterized&lt;br /&gt; {&lt;br /&gt; public:&lt;br /&gt;  // ---------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  Parameter();&lt;br /&gt;  Parameter( String &amp;_rsName, const String &amp;_rsValue );&lt;br /&gt;  Parameter( const Parameter *_pParam );&lt;br /&gt;  virtual ~Parameter();&lt;br /&gt;&lt;br /&gt;  // ---------------&lt;br /&gt;  // Data access.&lt;br /&gt;  void setName(const String &amp;_rsName);&lt;br /&gt;  String getName() const;&lt;br /&gt;  String getValue() const;&lt;br /&gt;  void setValue(const String &amp;_rsValue);&lt;br /&gt;  void setValue(const char* _pValue);&lt;br /&gt;&lt;br /&gt;  // ---------------&lt;br /&gt;  // I/O&lt;br /&gt;  virtual bool load( const TiXmlElement *_pElement );&lt;br /&gt;  virtual bool save( TiXmlElement *_pElement );&lt;br /&gt;&lt;br /&gt;  Parameter&amp; operator =(const Parameter&amp; _pParam);&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  // ---------------&lt;br /&gt;  // Data.&lt;br /&gt;  String m_sName;&lt;br /&gt;  String m_sValue;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; class Parameterized&lt;br /&gt; {&lt;br /&gt; public:&lt;br /&gt;  // ---------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  Parameterized();&lt;br /&gt;  Parameterized(const Parameterized *_pElement );&lt;br /&gt;  virtual ~Parameterized();&lt;br /&gt;&lt;br /&gt;  // ---------------&lt;br /&gt;  // Parameter access.&lt;br /&gt;  ParameterList* getParamList() const;&lt;br /&gt;  void   clear();&lt;br /&gt;  void   createParamList();&lt;br /&gt;&lt;br /&gt;  // ---------------&lt;br /&gt;  // I/O&lt;br /&gt;  virtual bool load( const TiXmlElement *_pElement );&lt;br /&gt;  virtual bool save( TiXmlElement *_pElement );&lt;br /&gt;&lt;br /&gt;  Parameterized&amp; operator =(const Parameterized&amp; _pParameterized);&lt;br /&gt;&lt;br /&gt; protected:&lt;br /&gt;  // ---------------&lt;br /&gt;  // Data.&lt;br /&gt;  ParameterList* m_pParamList;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; class ParameterList&lt;br /&gt; {&lt;br /&gt; public:&lt;br /&gt;  // ---------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  ParameterList();&lt;br /&gt;  ParameterList(const ParameterList *_pList );&lt;br /&gt;  virtual ~ParameterList();&lt;br /&gt;&lt;br /&gt;  // ---------------&lt;br /&gt;  // Parameter management.&lt;br /&gt;  void  addParam( const Parameter* _pElement );&lt;br /&gt;  void  removeParam( Parameter* _pElement, bool _bDelete = false );&lt;br /&gt;  void  clear();&lt;br /&gt;  unlong  getNrParams() const;&lt;br /&gt;  Parameter* getParam( unlong _uIndex ) const;&lt;br /&gt;  bool  findParam( const String &amp;_rsName, Parameter **_rpParam ) const;&lt;br /&gt;&lt;br /&gt;  ParameterList&amp; operator =(const ParameterList&amp; _pParamList);&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  // ---------------&lt;br /&gt;  // Data.&lt;br /&gt;  TDynArray&lt;Parameter*&gt; m_apParams;&lt;br /&gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, the interfaces are quite clear.&lt;br /&gt;&lt;br /&gt;Now, I have three base classes: Template, EntityTemplate and ComponentTemplate. While EntityTemplate and ComponentTemplate are derivations of Template, I felt it was necessary to make a difference between a simple templates, an entity template and templates for the components.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt; class Template&lt;br /&gt; {&lt;br /&gt; public:&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  Template() {}&lt;br /&gt;  Template(Sidema::String _type, Sidema::String _name) : m_type(_type), m_name(_name) {}&lt;br /&gt;  Template(const Template &amp;_temp) : m_type(_temp.m_type), m_name(_temp.m_name) {}&lt;br /&gt;  Template(const Template *_temp) : m_type(_temp-&gt;m_type), m_name(_temp-&gt;m_name) {}&lt;br /&gt;  virtual ~Template() {}&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Identify the template.&lt;br /&gt;  Sidema::String getType() const { return m_type; }&lt;br /&gt;  void   setType(Sidema::String _type) { m_type = _type; }&lt;br /&gt;&lt;br /&gt;  Sidema::String getName() const { return m_name; }&lt;br /&gt;  void   setName(Sidema::String _name) { m_name = _name; }&lt;br /&gt;&lt;br /&gt;  // ---------------&lt;br /&gt;  // I/O&lt;br /&gt;  virtual bool load( const TiXmlElement *_pElement ) { return true; }&lt;br /&gt;  virtual bool save( TiXmlElement *_pElement )  { return true; }&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  Sidema::String m_type;&lt;br /&gt;  Sidema::String m_name;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; // An entity template holds the basic components of an entity.&lt;br /&gt; // This can be all elements that are placed within the gaming world, from&lt;br /&gt; // trees and bushes to the NPCs.&lt;br /&gt; class EntityTemplate : public Template&lt;br /&gt; {&lt;br /&gt; public:&lt;br /&gt;  static Sidema::String TEMPLATE_NAME;&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Creator/Destroyer&lt;br /&gt;  static Template* create(Sidema::String _name);&lt;br /&gt;  static void   destroy(Template *_template);&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // I/O&lt;br /&gt;  bool load( const TiXmlElement *_pElement );&lt;br /&gt;  bool save( TiXmlElement *_pElement );&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // An entity has components that define its "look".&lt;br /&gt;  // Components are ie. health, inventory, experience points, gfx, sound, ...&lt;br /&gt;  bool addComponent(ComponentTemplate *_component);&lt;br /&gt;  void removeComponent(ComponentTemplate *_component);&lt;br /&gt;  &lt;br /&gt; protected:&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  EntityTemplate();&lt;br /&gt;  EntityTemplate(const Sidema::String &amp;_name);&lt;br /&gt;  virtual ~EntityTemplate();&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  // Components of this entity.&lt;br /&gt;  typedef std::list&lt;ComponentTemplate*&gt; COMPONENTARRAY;&lt;br /&gt;  COMPONENTARRAY m_components;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; // A component template contains only basic information about the component itself.&lt;br /&gt; // Basically, it holds the initial values. Templates cannot be "updated".&lt;br /&gt; //&lt;br /&gt; class ComponentTemplate : public Template, public Sidema::Parameterized, public Sidema::IReferenceCounted&lt;br /&gt; {&lt;br /&gt; public:&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  virtual ~ComponentTemplate();&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // I/O&lt;br /&gt;  virtual bool load( const TiXmlElement *_pElement );&lt;br /&gt;  virtual bool save( TiXmlElement *_pElement );&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Owner access.&lt;br /&gt;  Template *getOwner() const;&lt;br /&gt;  void  setOwner(Template *_owner);&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Reference counted interface.&lt;br /&gt;  unlong addRef(void);&lt;br /&gt;  unlong release(void);&lt;br /&gt;&lt;br /&gt; protected:&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  ComponentTemplate(Sidema::String _type, Sidema::String _name);&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  unlong   m_refCount;&lt;br /&gt;  Template  *m_owner;&lt;br /&gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;IReferenceCounted is a reference counter interface. Once the reference drops to 0 (due to release) the object is deleted.&lt;br /&gt;&lt;br /&gt;The loading code is easy, too:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;// Load the templates.&lt;br /&gt;const TiXmlNode *node = root-&gt;FirstChild("template");&lt;br /&gt;while ( node )&lt;br /&gt;{&lt;br /&gt; if ( TiXmlNode::ELEMENT == node-&gt;Type() )&lt;br /&gt; {&lt;br /&gt;  const TiXmlElement *element = static_cast&lt;const TiXmlElement *&gt;(node);&lt;br /&gt;&lt;br /&gt;  // Read the name and the type.&lt;br /&gt;  const char* tempName = element-&gt;Attribute("name");&lt;br /&gt;  const char* tempType = element-&gt;Attribute("type");&lt;br /&gt;  if ( NULL != tempType &amp;&amp; NULL != tempName )&lt;br /&gt;  {&lt;br /&gt;   Template *theTemplate = createTemplate( tempType, tempName );&lt;br /&gt;   if ( NULL == theTemplate )&lt;br /&gt;    break;&lt;br /&gt;&lt;br /&gt;   if ( theTemplate-&gt;load(element) )&lt;br /&gt;   {&lt;br /&gt;    if (!addTemplate(tempName, theTemplate))&lt;br /&gt;    {&lt;br /&gt;     destroyTemplate( theTemplate );&lt;br /&gt;     break;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; node = node-&gt;NextSibling("template");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You might have remarked the createTemplate function. Basically this function looks like this:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;// Create a template of a given type.&lt;br /&gt;Template*&lt;br /&gt;EntityManager::createTemplate( const Sidema::String &amp;_type, const Sidema::String &amp;_name )&lt;br /&gt;{&lt;br /&gt; TEMPLATECREATORS::iterator it = m_templateCreateFunctions.find(_type);&lt;br /&gt; if ( it != m_templateCreateFunctions.end() )&lt;br /&gt; {&lt;br /&gt;  return it-&gt;second(_name);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The different templates are registered on class construction:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;EntityManager::EntityManager()&lt;br /&gt;{&lt;br /&gt; registerTemplate(EntityTemplate::TEMPLATE_NAME, &amp;EntityTemplate::create, &amp;EntityTemplate::destroy );&lt;br /&gt; registerComponentTemplate(HealthComponentTemplate::TEMPLATE_NAME, &amp;HealthComponentTemplate::create, &amp;HealthComponentTemplate::destroy);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ok... this is what is basically needed for the templates of the entities and components. I still have to implement the inheritance for the entity templates. But that's quite easy to do, too.&lt;br /&gt;&lt;br /&gt;An XML to create an entity templates looks like this:&lt;br /&gt;&lt;pre name="code" class="xml:nogutter"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;templates&gt;&lt;br /&gt;  &lt;template name="Goblin1" type="EntityTemplate"&gt;&lt;br /&gt;    &lt;comptemp type="HealthComponentTemplate"&gt;&lt;br /&gt;      &lt;prm name="maxhealth" value="200" /&gt;&lt;br /&gt;    &lt;/comptemp&gt;&lt;br /&gt;    &lt;comptemp type="speed"&gt;&lt;br /&gt;      &lt;prm name="maxspeed" value="10.0" /&gt;&lt;br /&gt;    &lt;/comptemp&gt;&lt;br /&gt;  &lt;/template&gt;&lt;br /&gt;&lt;/templates&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ah yes.. I forgot :) The loading code for the health component template looks like this:&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;bool&lt;br /&gt;HealthComponentTemplate::load( const TiXmlElement *_pElement )&lt;br /&gt;{&lt;br /&gt; if ( ComponentTemplate::load(_pElement) )&lt;br /&gt; {&lt;br /&gt;  if ( !getParamList() )&lt;br /&gt;   return false;&lt;br /&gt;&lt;br /&gt;  // Make sure the template vars have been loaded.&lt;br /&gt;  if ( getParamList()-&gt;findParam( "maxhealth", NULL) )&lt;br /&gt;   return true;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;EDIT NOTE: I had to change the param tag to prm in order to display the xml and the rest of the text correctly. I didn't see this problem with IE. I encountered this with FF3.0.&lt;br /&gt;&lt;br /&gt;The ComponentTemplate::load function just contains "return Parameterized::load(_pElement);" and thus loads the param-tags.&lt;br /&gt;&lt;br /&gt;"getParamList()-&gt;findParam( "maxhealth", NULL)" makes sure that the maxhealth param has been loaded (actually the line says: find the maxheath parameter but don't actually return me it's pointer... I just want to know if it exists...).&lt;br /&gt;&lt;br /&gt;Phew... that was a lot of code in this blog today. As you can see, most things are quite simple to implement. The ComponentTemplate class allows for a very flexible parameter definitions. Any derived class "only" has to check, if the parameters it needs are available.&lt;br /&gt;&lt;br /&gt;Entity template composition is made easy by just sticking together several component templates.&lt;br /&gt;&lt;br /&gt;There a three next steps:&lt;br /&gt;&lt;br /&gt;a) implement inheritance for the entity templates.&lt;br /&gt;b) implement the actual classes for the Entities and Components (those which you actually can alter).&lt;br /&gt;c) implement the template to instance code. I have several ideas how to approach this...&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-1059403754999090186?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/1059403754999090186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=1059403754999090186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1059403754999090186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1059403754999090186'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/basis-of-templates-and.html' title='Basis of templates and componenttemplates finished.'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-3538222814315252755</id><published>2008-08-08T05:23:00.000-07:00</published><updated>2008-08-08T05:45:59.150-07:00</updated><title type='text'>I want to show source code from time to time...</title><content type='html'>So this is just a test to see if the code highlighting works.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp:nogutter"&gt;&lt;br /&gt;class ComponentTemplate : public Template, public Sidema::Parameterized, public Sidema::IReferenceCounted&lt;br /&gt; {&lt;br /&gt; public:&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Xtructors.&lt;br /&gt;  ComponentTemplate();&lt;br /&gt;  virtual ~ComponentTemplate();&lt;br /&gt;&lt;br /&gt;  // ---------------&lt;br /&gt;  // I/O&lt;br /&gt;  bool load( const TiXmlElement *_pElement );&lt;br /&gt;  bool save( TiXmlElement *_pElement );&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Owner access.&lt;br /&gt;  Template *getOwner() const;&lt;br /&gt;  void  setOwner(Template *_owner);&lt;br /&gt;&lt;br /&gt;  // ----------------------------&lt;br /&gt;  // Reference counted interface.&lt;br /&gt;  unlong addRef(void);&lt;br /&gt;  unlong release(void);&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  unlong   m_refCount;&lt;br /&gt;  Template  *m_owner;&lt;br /&gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I also have adjusted a little bit the css for the page so that it fits to you actual browser window size :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;br /&gt;&lt;br /&gt;PS: The code is a glimpse at my ComponentTemplate code... I'm working on that right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-3538222814315252755?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/3538222814315252755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=3538222814315252755' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/3538222814315252755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/3538222814315252755'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/i-want-to-show-source-code-from-time-to.html' title='I want to show source code from time to time...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-242402334173224040</id><published>2008-08-07T07:38:00.000-07:00</published><updated>2008-08-07T08:25:28.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Data driven'/><category scheme='http://www.blogger.com/atom/ns#' term='Objects'/><title type='text'>Objects, Entities and other things</title><content type='html'>Well... I now spent almost two days on researching which way I possibly could use to a) make most (all) of my game objects entirely data driven and b) keep it in a simple way to use.&lt;br /&gt;&lt;br /&gt;Let's develop the two points:&lt;br /&gt;&lt;br /&gt;When I say "Entirely data-driven", I'm not just talking about having some key values defined within a human-readable file format. I'm more into: how to handle data and object configuration. This includes the way specific tasks are handled.&lt;br /&gt;&lt;br /&gt;Example: You have to implement 2 different things in your game: a tree and an enemy. While the tree can more or less be interpreted as being a static object, the enemy definitely is not. The enemy move, has to search for you, attacks you, etc.&lt;br /&gt;&lt;br /&gt;Both have some information such as graphical representation, sound information, etc. In most cases, one would implement two different classes to handle those two types of game objects: a static game object and an entity game object. Each of those two game objects would have distinct functions and distinct variables. You would implement those functions and variables specifically for each class.&lt;br /&gt;&lt;br /&gt;My target was/is to be able to define from within a human-readable text file the composition of the different game objects. After some skipping through the books on my shelves I stumbled upon two interesting articles: "Component Based Object Management" by &lt;span id="SPELLING_ERROR_0" class="blsp-spelling-error"&gt;Bjarne&lt;/span&gt; Rene (Game Programming Gems 5) and "Flexible Object-Composition Architecture" by Sergio &lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;Garces&lt;/span&gt; (AI Game Programming Wisdom 3).&lt;br /&gt;&lt;br /&gt;Both articles take almost the same approach: Instead of implementing the different capabilities of the game objects directly into some kind of specialized class, they use the component based approach. In this approach, the different capabilities are components which can be added to a game object dynamically. The health of an entity is one of those components (interestingly both articles just pick up this example, too :) ).&lt;br /&gt;&lt;br /&gt;Rene introduces a (IMO) rather complicated way to handle and maintain the components. Via additional interfaces between the component interface and the final implementation of the component, the access to different parts of the component itself are "hidden". IE. the interface for the health component only has one function called "&lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;GetHealth&lt;/span&gt;()". There's nothing else. This implies that the interface itself keeps things easy.&lt;br /&gt;&lt;br /&gt;Now, the component interface introduces another idea: messaging. If one wants to alter the content of the health component (IE. increase/decrease the health), one must inject a message into the component. The idea is tempting: Define a new message and only the component which is really interesting by the message, will receive and handle it. Unfortunately, this means, that you have to create, update and maintain an ever growing list of messages.&lt;br /&gt;&lt;br /&gt;&lt;span id="SPELLING_ERROR_3" class="blsp-spelling-error"&gt;Garces&lt;/span&gt; on the other side (in addition to the component based idea) uses the idea of archetypes. I would call this "Templates", but whatever :) Basically, you can define a template for a game object containing some component templates. Only if a game entity of a specific template type is needed, the template is "transformed" into a real entity. I like this idea because it let's you define and maintain a rather small list of templates to which any entity which is placed in the world might reference to for creation. &lt;span id="SPELLING_ERROR_4" class="blsp-spelling-error"&gt;Garces&lt;/span&gt; uses the fact, that this approach easily enables the developer to "overload" any component. IE. you can use three times the same template for IE. an archer and specify for one of those three archers that his firing rate is twice as high as the normal one.&lt;br /&gt;&lt;br /&gt;What I like in the Sergio &lt;span id="SPELLING_ERROR_5" class="blsp-spelling-error"&gt;Garces&lt;/span&gt;' approach is the way he handles the interaction between the components. Instead of having a messaging system to alter data within the components, he implicitly states that some components "know" how to handle other ones. IE. a component of a weapon knows about the health component implementation and thus directly can use the functions of that health component. This makes the usage of the component approach slightly easier.&lt;br /&gt;&lt;br /&gt;Now, for my implementation I was shuffling around a bit the two approaches. Remember: I like easy to use interfaces. I finally came up with a system that is template based as Sergio &lt;span id="SPELLING_ERROR_6" class="blsp-spelling-error"&gt;Garces&lt;/span&gt; introduced it. I also used the Rene's idea of components (I consider Rene as the originator since the &lt;span id="SPELLING_ERROR_7" class="blsp-spelling-error"&gt;GPG&lt;/span&gt;5 first ed. has been printed in 2004 while AI &lt;span id="SPELLING_ERROR_8" class="blsp-spelling-error"&gt;GPW&lt;/span&gt;3 has been printed in 2006). Specific templates know about other specific templates but still can handle the lack of those (means, they're doing nothing or reporting/logging an error). Templates hold basic information thus pure data in text form and can transform them into "real" instances once it's needed. This kept the templates &lt;span id="SPELLING_ERROR_9" class="blsp-spelling-corrected"&gt;themselves&lt;/span&gt; quite slim (and stupid) while still holding all data they should hold.&lt;br /&gt;&lt;br /&gt;The component system as I currently have it in mind is able to define everything from simple properties such as health, &lt;span id="SPELLING_ERROR_10" class="blsp-spelling-error"&gt;xp&lt;/span&gt; points distribution, &lt;span id="SPELLING_ERROR_11" class="blsp-spelling-error"&gt;gfx&lt;/span&gt; information, sound information etc. But also is able to define components which can hold AI information (my game &lt;span id="SPELLING_ERROR_12" class="blsp-spelling-error"&gt;ai&lt;/span&gt; is based upon my &lt;span id="SPELLING_ERROR_13" class="blsp-spelling-error"&gt;SCXML&lt;/span&gt; implementation).&lt;br /&gt;&lt;br /&gt;What's also interesting is the fact that you easily can hold 2 sets of data: one for the game client and one for the game server. In most cases the game server doesn't need to know about the &lt;span id="SPELLING_ERROR_14" class="blsp-spelling-error"&gt;gfx&lt;/span&gt; or sound stuff, so you simple "export" your data from whichever DB you have without exporting the data the server doesn't need.&lt;br /&gt;&lt;br /&gt;Well... I'll talk more deeply about my implementation (with some examples) another time.&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-242402334173224040?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/242402334173224040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=242402334173224040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/242402334173224040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/242402334173224040'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/objects-entities-and-other-things.html' title='Objects, Entities and other things'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-1058818817288565072</id><published>2008-08-06T00:28:00.000-07:00</published><updated>2008-08-06T00:51:15.341-07:00</updated><title type='text'>I had to...</title><content type='html'>print this to a sheet of paper and stick it above my desk. It's a sentence John Carmack said in this years Quakecon8: "[...] there's a very finite amount of time, and you just can't do everything, so you really have to prioritize and pick the things that you want to do, that you're going to be good at, where you're going to make a difference."&lt;br /&gt;&lt;br /&gt;This resume quite effectively my current state: SO much things I would like to do, so little time to actually realize them.&lt;br /&gt;&lt;br /&gt;I have so much different ideas of projects and what I would like to do that it's true that I have to make a choice between all this. I think I know what I'm good at (does one really know what he's good at?) and what my business partners appreciate. I like to think of myself being a very good all round-programmer. At least, that's what I've been told and that's where people are seeking my expertize. In a recent (game development) project the lead programmer pushed me from one area of expertize to another one: core development, AI, network, logic, ... Mostly I've done preparation work; making things usable for the other programmers. I was quite astonished when I was assigned being the lead for a group of 5 AI programmers. It's quite an unusual position for a freelance programmer on a project.&lt;br /&gt;&lt;br /&gt;Along the above mentioned statement by John Carmack I like this phrase (I can't remember who originally said it): "Nothing is impossible, it's just a matter of time and money." That's what I mostly stick to. There's always a solution or a compromise for a problem. I like to dig into development problems (of whatever kind) and to try to find the "right" solution to the problem. I like easy-to-use solutions. Those, where only a few lines of code empower you to achieve a lot of things. I also like the idea of plug-in technology and working with interfaces. But this is not always the right solution, especially if your project is on a tight schedule and it's more important to finish things (and make them work) rather than make them reusable.&lt;br /&gt;&lt;br /&gt;Well... we'll see what life brings on :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;br /&gt;&lt;br /&gt;PS: Ah yes... I almost forgot: I'll marry the woman I'm with since 16 years now on august the 23rd...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-1058818817288565072?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/1058818817288565072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=1058818817288565072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1058818817288565072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/1058818817288565072'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/i-had-to.html' title='I had to...'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6934491.post-6610315010350194683</id><published>2008-08-05T13:29:00.000-07:00</published><updated>2008-08-05T13:49:03.497-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SCXML'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='SSCXML'/><title type='text'>Restart</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;although I have this account since 2006, I did not really post any entries. Hopefully this will change since I would like to share some of my experiences I make during the development of my spare time applications and games.&lt;br /&gt;&lt;br /&gt;To give you some backstory: I've been in games business since 12 years now. Throughout this time span I was a simple programmer, translator (german-&gt;french), senior developer, lead developer, project manager, head of technology and freelance developer. I had the fortune to work with some of the best German game developers and some of the most talented German graphic and sound artists you might encounter. It was (mostly) a pleasure working with them although I managed to upset one person to a point he won't even talk with me anymore (at least one of whom I know).&lt;br /&gt;&lt;br /&gt;The game genres I worked on were wide spread: from turn based strategy games through sports games up to casual games. The only thing I never programmed was an FPS.&lt;br /&gt;&lt;br /&gt;In the recent years I sometimes turned away from game development to jump into the area which is called "serious applications" by the game developers. In fact, I made some quite interesting experiences there. I had the chance to contribute to the research and development of embedded hardware, wrote (mostly as a sole developer) the voice recognition, client-server based picking solution for one of the biggest spare part warehouses of Europe and contributed and still contribute to the development of a business application for a German music label and the planning and maintenance of an industrial CAD software.&lt;br /&gt;&lt;br /&gt;Some month ago I published my own lib called &lt;a href="http://www.sscxml.com/"&gt;SSCXML &lt;/a&gt;which is the first publicly available implementation of the &lt;a href="http://www.w3.org/TR/scxml/"&gt;SCXML draft &lt;/a&gt;(state chart XML) by the W3C.&lt;br /&gt;&lt;br /&gt;In my spare time I started working on a small game called "Prohibition". It'll be a turn-based strategy game where the player must lead a police squad in it's fight against organized crime in the early 20th century. Since I'm working all alone on this project, progress is slow. I also tend to research and experience some programming ideas I have with this project. The game itself will be fully multiplayer targeted. Currently I'm working on the very base of the game: network layer, client-server structure, object management, ...&lt;br /&gt;&lt;br /&gt;I think I'll post some of the things I do in this project in this blog :)&lt;br /&gt;&lt;br /&gt;Have fun,&lt;br /&gt;Stefan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6934491-6610315010350194683?l=smaton.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smaton.blogspot.com/feeds/6610315010350194683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6934491&amp;postID=6610315010350194683' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6610315010350194683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6934491/posts/default/6610315010350194683'/><link rel='alternate' type='text/html' href='http://smaton.blogspot.com/2008/08/restart.html' title='Restart'/><author><name>SMaton</name><uri>http://www.blogger.com/profile/02428149949261560628</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
