<?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-1352089011077275678</id><updated>2011-11-27T19:09:01.069-05:00</updated><category term='script'/><category term='xml'/><category term='RTTI'/><category term='PoP'/><category term='metacritic'/><category term='Prince of Persia'/><category term='game architecture'/><category term='game'/><category term='AI'/><category term='c++'/><category term='game AI'/><category term='programming'/><title type='text'>Real World Programming</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-6548121128385875515</id><published>2010-10-24T16:47:00.005-04:00</published><updated>2010-10-24T18:30:48.768-04:00</updated><title type='text'>And one year later...</title><content type='html'>I have finished my work on Assassin Creed Brotherhood, the next game on the series. A challenging project (developed in less than 10 months with teams all around the world) that I think will please the fans.&lt;br /&gt;&lt;br /&gt;But that also means that now I will have some free time to work on some personal projects, being the first a small c++ challenge, a delegate/functor class with no runtime cost (in the optimized build), apart from the fact that as soon as you use the addres of a function it can't be inlined by the compiler. My target is to eliminate the additional level of indirection that all the delegates/functors I've seen add to the call.&lt;br /&gt;I have it working on MSVC, but now I want to port it to GCC (ouch!), as I intend to use it on PC / 360 and PS3 platforms.&lt;br /&gt;&lt;br /&gt;It's good to be back...&lt;br /&gt;&lt;br /&gt;Have fun!&lt;br /&gt;&lt;br /&gt;J.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-6548121128385875515?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/6548121128385875515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=6548121128385875515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/6548121128385875515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/6548121128385875515'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2010/10/and-one-year-later.html' title='And one year later...'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-7723991146880193838</id><published>2009-11-16T22:11:00.002-05:00</published><updated>2009-11-16T22:23:41.340-05:00</updated><title type='text'>Assassins Creed 2</title><content type='html'>It's been awhile since the last time I wrote anything, but I've been quite busy working at the biggest project I've ever been working at, the new Assassins Creed 2.&lt;br /&gt;&lt;br /&gt;So far I'm happy with the result, working on such a huge team (with more than 400 people working in parallel in several countries with different timezones) it's been both a challenge and a nice experience (you have to live something like this to understand how really simple things become a problem on such a big team and how good and practical people help on that situations).&lt;br /&gt;&lt;br /&gt;Apart from that, I have played the game until the end during the last couple of weeks, and I like it a lot more than the first one. I'm waiting for both the magazines and players reviews to see if they think the same.&lt;br /&gt;&lt;br /&gt;Now a couple of weeks of code cleaning and some holidays to get back some energy for the next game I will start working on January.&lt;br /&gt;&lt;br /&gt;Happy to be here again, but not for long I guess ;)&lt;br /&gt;&lt;br /&gt;Cheers!&lt;br /&gt;&lt;br /&gt;Jaime&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-7723991146880193838?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/7723991146880193838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=7723991146880193838' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/7723991146880193838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/7723991146880193838'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2009/11/assassins-creed-2.html' title='Assassins Creed 2'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-3140810086691107226</id><published>2008-12-27T12:24:00.003-05:00</published><updated>2008-12-27T13:52:07.196-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metacritic'/><category scheme='http://www.blogger.com/atom/ns#' term='Prince of Persia'/><category scheme='http://www.blogger.com/atom/ns#' term='PoP'/><title type='text'>Mixed feelings about the new Prince of Persia</title><content type='html'>Hi everyone,&lt;br /&gt;&lt;br /&gt;Now that the work it's over and I got my holidays, it's the time to recap and think about what went good and what went wrong about the game.&lt;br /&gt;&lt;br /&gt;For one side, I really like the look of the game while playing it, the models, the animations, how fluid is the movement, it's almost hipnotic. Also, I think it is the first time I play with one NPC on my side that actually I feel it's helping me to progress rather than being an obstacle most of the time.&lt;br /&gt;&lt;br /&gt;On the other hand, I think we went too far on making it easy for the casual player (so all the hardcore fans hate us with the heat of two hundred suns) and I can almost play with just one hand, both the acrobatics and the fight. I think that a bit less of autotargetting and limiting the amount of times that Elika is able to save you would have added that bit of challenge that I feel is missing while playing (but I'm an old guy that played too many crazy difficult games).&lt;br /&gt;Being one of the creators of the first first Commandos games (some of the most difficult games on the market but with great success) I think that PoP missed it just by few inches, but anyway, we feel that we made a good game, maybe not one for the hardcore audience, but one that you can play and enjoy.&lt;br /&gt;&lt;br /&gt;So, what's the final score for the game?&lt;br /&gt;The metacritics got us an 82% on 360 and 85% on PS3, with a mix of really high and few really low scores (I think that the game doesn't deserve a 100%, nor a 60%, as some magazines reviewed after the launch).&lt;br /&gt;&lt;br /&gt;Now, we'll have to wait and see how well it sells over the next few months, as PoP always have a longer sales life than the average game. In the meantime, I will start on January on my new assignment, that will be another challenging project.&lt;br /&gt;&lt;br /&gt;Take care all, and see you around.&lt;br /&gt;&lt;br /&gt;Jaime&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-3140810086691107226?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/3140810086691107226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=3140810086691107226' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/3140810086691107226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/3140810086691107226'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2008/12/mixed-feelings-about-new-prince-of.html' title='Mixed feelings about the new Prince of Persia'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-7706536941288130386</id><published>2008-08-21T00:01:00.004-04:00</published><updated>2008-08-21T01:37:21.265-04:00</updated><title type='text'>Simple and fun</title><content type='html'>One of my team mates sent me yesterday the link of a small physics based game:&lt;br /&gt;&lt;br /&gt;http://FantasticContraption.com&lt;br /&gt;&lt;br /&gt;Solve the different puzzles is really fun (after #12 get's harder), but compare your own solutions with your friends it's just awesome.&lt;br /&gt;&lt;br /&gt;After solving the #13 compare your solution with mine (as a feature, it allows to save the solution and gives you a link you can send to your friends):&lt;br /&gt;&lt;br /&gt;#13 - http://FantasticContraption.com/?designId=684627&lt;br /&gt;&lt;br /&gt;Edited:&lt;br /&gt;#14 - http://FantasticContraption.com/?designId=686419&lt;br /&gt;#16 - http://FantasticContraption.com/?designId=687704&lt;br /&gt;&lt;br /&gt;I have to say that it's not easy to catch my attention right now, but this game it's so fun, I couldn't avoid playing it and sending the link to my friends.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;J.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-7706536941288130386?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/7706536941288130386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=7706536941288130386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/7706536941288130386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/7706536941288130386'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2008/08/simple-and-fun.html' title='Simple and fun'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-4771187956920849150</id><published>2008-07-21T23:15:00.004-04:00</published><updated>2008-07-21T23:30:23.159-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='RTTI'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='game AI'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Working at Prince of Persia</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Hi all,&lt;br /&gt;&lt;br /&gt;As some of you know, I am in the final development stage of the Prince of Persia project, and as result of it, I am quite busy right now (and I will be until it is released).&lt;br /&gt;&lt;br /&gt;I like the last months of the projects, I usually work like crazy, but it´s the moment when you see everything coming together for the first time since the start of the project, and it is really beautiful.&lt;br /&gt;&lt;br /&gt;There are some cool Prince of Persia videos in GameTrailers, even if it´s not your type of game, I think it does worth a click to see them.&lt;br /&gt;&lt;br /&gt;Check it here : &lt;a href="http://www.gametrailers.com/game/6739.html"&gt;http://www.gametrailers.com/game/6739.html&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That´s it, just a quick post to show signs of life!!!&lt;br /&gt;&lt;br /&gt;J.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-4771187956920849150?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/4771187956920849150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=4771187956920849150' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/4771187956920849150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/4771187956920849150'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2008/07/working-at-prince-of-persia.html' title='Working at Prince of Persia'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-754095949241703386</id><published>2008-03-16T20:06:00.002-04:00</published><updated>2008-03-19T00:30:22.593-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>XML based script for use in tools</title><content type='html'>&lt;p&gt;Some months ago, I was asked to find a way to store user profiles and other internal application data so it could be saved for later use and shared between the application users, not a big amount of information, but enough to avoid standard .ini files.&lt;/p&gt; &lt;p&gt;I had been using TinyXml in the past, but I do not really like the interface to access or store information (not really a problem of TinyXml but the xml itself), so I decided to use it but also to implement a small layer over it, to have a better interface from the application and at the same time hide as much as possible the standard xml usage.&lt;/p&gt; &lt;p&gt;Some small issues appeared though, as I had to encode regional characters into the xml files, so UTF-8 was selected as the xml encoding. I created a couple of functions to convert from ansi to utf8 and from utf8 to ansi, so save standard local text was possible (this is not intended to be a unicode universal conversion tool, but with few changes it can be used with any language and codepage).&lt;/p&gt; &lt;p&gt;Once the encoding problem was solved, I started to work on the intermediate layer, to enable the applications to store and retrieve data without any xml knowledge and doing it with the less possible amount of effort (the objective was to allow users to store and retrieve data, not to force then to learn the xml internals).&lt;/p&gt; &lt;p&gt;The result is a small class called DataScript (the name clearly indicates the intended use, it is not a script for decision making, it is just for data storage).&lt;/p&gt; &lt;p&gt;As a small example of use, look at this code to store and load some bits of information:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;lt;code&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;****** SAVE ******&lt;/p&gt; &lt;p&gt;DataScript root;&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataScript usersDataSection = root.addSection("USERS_DATA");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i=0; i&amp;lt;mNumUsers; i++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataScript userSection = usersDataSection.addSection("USER"); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userSection.setString("NAME", mUserData[i].mName.c_str());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userSection.setUInt("ID", mUserData[i].mId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;} &lt;/p&gt; &lt;p&gt;root.saveFile("DataScriptTest.sb"); &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;******* LOAD *******&lt;/p&gt; &lt;p&gt;DataScript root;&lt;br&gt;if (root.loadFile("DataScriptTest.sb"))&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataScript usersSection = root["USERS_DATA"];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int numUsers = usersSection.count();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i=0; i&amp;lt;numUsers; i++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataScript userData = usersSection[i]; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sUserData * user = mUserData.addUser(); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; user-&amp;gt;mName = userData.getString("NAME", "");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; user-&amp;gt;mId = userData.getUInt("ID", 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;} &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;****** XML File generated *******&lt;/p&gt; &lt;p&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;br&gt;&amp;lt;Root&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;USERS_DATA&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;USER&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;NAME Str="Jaico" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ID UInt="1001" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/USER&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;USER&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;NAME Str="Cherno" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ID UInt="2002" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/USER&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/USERS_DATA&amp;gt;&lt;br&gt;&amp;lt;/Root&amp;gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;lt;code/&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Feel free to contact me if you need something like this, I will be happy to help in any way my limited free time allows me. I still have to search a place to store it and post a link to it, but in the meantime I can send it by email to anyone interested, just send me an email to cherno.olivares at the google mail system. &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;And this is all for this weekend, I have a really busy months in the horizon, but I will do my best to continue writing some articles.&lt;/p&gt; &lt;p&gt;Have a great day!&lt;/p&gt; &lt;p&gt;J.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-754095949241703386?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/754095949241703386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=754095949241703386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/754095949241703386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/754095949241703386'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2008/03/xml-based-script-for-use-in-tools.html' title='XML based script for use in tools'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-8206301861643453208</id><published>2008-03-10T20:42:00.001-04:00</published><updated>2008-03-19T00:33:29.587-04:00</updated><title type='text'>Test with windows writer</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I've just downloaded windows writer with the last messenger update and I'm testing it to see if I can avoid the pain of editing the blog online.&lt;/p&gt; &lt;p&gt;If this works will publish a couple of articles I have ready on my computer (waiting for a decent blog editor) in the following days (or maybe weekend, as I am a bit busy during the week).&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Edited : Looks like editing the blog it is much easier using Windows Writer, try it if you have not yet (do not expect miracles though) .&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Jaime&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-8206301861643453208?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/8206301861643453208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=8206301861643453208' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/8206301861643453208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/8206301861643453208'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2008/03/test-with-windows-writer.html' title='Test with windows writer'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-7778469298788535417</id><published>2007-11-12T21:22:00.000-05:00</published><updated>2007-11-14T23:38:20.948-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='RTTI'/><title type='text'>RTTI : How to import and export interfaces from classes in a cheap and easy way</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;I have been working on this for some time and tried different solutions but this one I am posting here is the one I like the most. It has some problems tho, as it does not work for DLL's unless you ask the DLL itself for the interface you are requesting, but in the general case, it is very simple to use and does not add any runtime cost (apart from a small amount of memory for each interface type).&lt;br /&gt;&lt;br /&gt;Here is the code (I have formatted it a bit to fit into the blog, but I can send you the original file upon request to my email address)&lt;br /&gt;&lt;br /&gt;That's all for now!&lt;br /&gt;&lt;br /&gt;Cheers!&lt;br /&gt;&lt;br /&gt;J.&lt;br /&gt;&lt;br /&gt;//****************************************************************************&lt;br /&gt;// Templatized RTTI&lt;br /&gt;// Date(dd/mm/yyy): 22/06/2007&lt;br /&gt;// Author: Jaime C. Olivares - cherno.olivares#gmailDOTYOUKNOW&lt;br /&gt;//****************************************************************************&lt;br /&gt;&lt;br /&gt;#ifndef _NW_RTTI_H_&lt;br /&gt;#define _NW_RTTI_H_&lt;br /&gt;&lt;br /&gt;typedef intptr_t NWRttiTypeId;&lt;br /&gt;&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;// The RTTI itself&lt;br /&gt;// It is a simple idea:&lt;br /&gt;// The address of a static member of a templatized class&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;template '&lt;'class T'&gt;' class NWRtti&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;  static inline NWRttiTypeId getTypeId();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;         static int mDummyVar;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template '&lt;'class T'&gt;' /*static*/ int NWRtti'&lt;'T'&gt;'::mDummyVar = 0;&lt;br /&gt;&lt;br /&gt;template '&lt;'class T'&gt;' /*static*/ inline NWRttiTypeId NWRtti'&lt;'T'&gt;'::getTypeId()&lt;br /&gt;{&lt;br /&gt;   // avoids compiler to optimize and return same addr for all types&lt;br /&gt;      ++mDummyVar;&lt;br /&gt;&lt;br /&gt;  // return the address of this member fn as RTTI&lt;br /&gt;    return (NWRttiTypeId)&amp;getTypeId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define RTTI_TYPE_ID(T) static inline NWRttiTypeId getTypeId() \&lt;br /&gt;{return NWRtti'&lt;'T'&gt;'::getTypeId();} // use this macro to have TypeId in classes&lt;br /&gt;&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;// Helper class to inherit from by classes exporting interfaces&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;class NWInterfaceProvider&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; NWInterfaceProvider() {}&lt;br /&gt; virtual ~NWInterfaceProvider() {}&lt;br /&gt;&lt;br /&gt; template '&lt;'class T'&gt;' inline T * getInterface();&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;//derived classes must implement   this fn&lt;br /&gt;virtual void * getInterfaceFromID(NWRttiTypeId _typeId)=0;&lt;br /&gt;&lt;br /&gt;template '&lt;'class T'&gt;' inline T * NWInterfaceProvider::getInterface()&lt;br /&gt;{&lt;br /&gt; return (T *) getInterfaceFromID(NWRtti'&lt;'T'&gt;'::getTypeId());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#endif //_NW_RTTI_H_&lt;br /&gt;&lt;br /&gt;//****************************************************************************&lt;br /&gt;// Example&lt;br /&gt;//****************************************************************************&lt;br /&gt;&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;// Some interfaces we want share&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;//struct IEncoder&lt;br /&gt;//{&lt;br /&gt;//        virtual unsigned int getEncodingCaps()=0;&lt;br /&gt;//    ...&lt;br /&gt;//&lt;br /&gt;//        RTTI_TYPE_ID(IEncoder)&lt;br /&gt;//};&lt;br /&gt;//&lt;br /&gt;//struct IVideoEncoder&lt;br /&gt;//{&lt;br /&gt;//        virtual unsigned int getVideoEncoderCaps()=0;&lt;br /&gt;//    ...&lt;br /&gt;//&lt;br /&gt;//        RTTI_TYPE_ID(IVideoEncoder)&lt;br /&gt;//}&lt;br /&gt;//&lt;br /&gt;//struct IVideoEncoderH264&lt;br /&gt;//{&lt;br /&gt;//        virtual int getVideoCodecH264KeyFramePeriod()=0;&lt;br /&gt;//    ...&lt;br /&gt;//&lt;br /&gt;//        RTTI_TYPE_ID(IVideoEncoderH264)&lt;br /&gt;//}&lt;br /&gt;&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;// The exporter (or it's base class if any) inherits from NWInterfaceProvider&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;//class VideoEncoderDicasH264 : public NWInterfaceProvider&lt;br /&gt;//{&lt;br /&gt;//public:&lt;br /&gt;//    ...&lt;br /&gt;//&lt;br /&gt;//protected:&lt;br /&gt;//         virtual void * getInterfaceFromID(NWRttiTypeId _iid); &lt;br /&gt;//                                                                     // Implement this fn to provide the valid interfaces&lt;br /&gt;// //private:&lt;br /&gt;// ...&lt;br /&gt;//}; &lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;// Exporter class fn (this class inherits from the interface): //----------------------------------------------------------------------------&lt;br /&gt;// /*virtual*/ void * VideoEncoderDicasH264::getInterfaceFromID(NWRttiTypeId _iid)&lt;br /&gt;//{&lt;br /&gt;//        if(_iid == IVideoEncoderH264::getTypeId())&lt;br /&gt;//        {&lt;br /&gt;//                return static_cast'&lt;'IVideoEncoderH264*'&gt;'(this);&lt;br /&gt;//        }&lt;br /&gt;//        else if(_iid == IVideoEncoder::getTypeId())&lt;br /&gt;//        {&lt;br /&gt;//                return static_cast'&lt;'IVideoEncoder*'&gt;'(this);&lt;br /&gt;//        }&lt;br /&gt;//        else if(_iid == IEncoder::getTypeId())&lt;br /&gt;//        {&lt;br /&gt;//                return static_cast'&lt;'IEncoder*'&gt;'(this);&lt;br /&gt;//        }&lt;br /&gt;//&lt;br /&gt;//        return NULL; // if no base class just return NULL or&lt;br /&gt;//        //return Inherited::getInterfaceFromID(_iid); // if base class has other interfaces&lt;br /&gt;//}&lt;br /&gt;&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;// External use&lt;br /&gt;//----------------------------------------------------------------------------&lt;br /&gt;//void test()&lt;br /&gt;//{&lt;br /&gt;//        VideoEncoderDicasH264 encoderObj;&lt;br /&gt;//&lt;br /&gt;//        encoderObj.init();&lt;br /&gt;//&lt;br /&gt;//        IEncoder * encoder = encoderObj.getInterface&lt;iencoder&gt;();&lt;br /&gt;//        if(encoder)&lt;br /&gt;//        {&lt;br /&gt;//                unsigned int caps = encoder-&gt;getEncodingCaps();&lt;br /&gt;//        }&lt;br /&gt;//&lt;br /&gt;//        IVideoEncoder * videoEncoder = encoderObj.getInterface'&lt;'IVideoEncoder'&gt;'();&lt;br /&gt;//        if(videoEncoder)&lt;br /&gt;//        {&lt;br /&gt;//                unsigned int caps = videoEncoder-&gt;getVideoEncoderCaps();&lt;br /&gt;//        }&lt;br /&gt;//&lt;br /&gt;//        IVideoEncoderH264 * encH264 = encoderObj.getInterface'&lt;'IVideoEncoderH264'&gt;'();&lt;br /&gt;//        if(videoEncoderH264)&lt;br /&gt;//        {&lt;br /&gt;//                int keyFramePeriod = videoEncoderH264-&gt;getVideoCodecH264KeyFramePeriod();&lt;br /&gt;//        }&lt;br /&gt;//&lt;br /&gt;//        encoderObj.shutdown();&lt;br /&gt;//}&lt;br /&gt;&lt;br /&gt;&lt;/iencoder&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-7778469298788535417?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/7778469298788535417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=7778469298788535417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/7778469298788535417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/7778469298788535417'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2007/11/rtti-how-to-import-and-export.html' title='RTTI : How to import and export interfaces from classes in a cheap and easy way'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-5295971259882558951</id><published>2007-11-12T21:17:00.000-05:00</published><updated>2007-11-12T21:21:34.867-05:00</updated><title type='text'>Relocated to Canada, back to business</title><content type='html'>Hi there,&lt;br /&gt;&lt;br /&gt;Here I am, back from some months of virtual absence due to the new job I got at Montreal (Canada).&lt;br /&gt;&lt;br /&gt;But now that I have arrived and got my new intertnet connection I am ready to start some posts.&lt;br /&gt;&lt;br /&gt;First one to come... RTTI&lt;br /&gt;&lt;br /&gt;See u around!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;J.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-5295971259882558951?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/5295971259882558951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=5295971259882558951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/5295971259882558951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/5295971259882558951'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2007/11/relocated-to-canada-back-to-business.html' title='Relocated to Canada, back to business'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1352089011077275678.post-5084404175987732016</id><published>2007-07-02T16:56:00.000-04:00</published><updated>2007-07-09T07:31:38.939-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='game AI'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>This blog is starting... be patient</title><content type='html'>Dear bloggers,&lt;br /&gt;&lt;br /&gt;During the following weeks I'm going to write a bit about real c++ projects I'm working on.&lt;br /&gt;I will cover different programming areas, from GUI to game AI or game architecture.&lt;br /&gt;Some examples that will come soon are :&lt;br /&gt;- A good coding standard&lt;br /&gt;- User resistant init/done pattern&lt;br /&gt;- Dynamic software architecture and tools needed to implement it :&lt;br /&gt;..........- Cheap RTTI&lt;br /&gt;..........- Interfaces, exporting and importing functionality with no type dependencies (apart from the interface itself)&lt;br /&gt;..........- State based machines : Easy and versatile implementation&lt;br /&gt;..........- State stack&lt;br /&gt;..........- Messaging systems, channel or message oriented&lt;br /&gt;..........- Script system for in-game use (to allow data driven designs)&lt;br /&gt;-Some FrontEnd tools&lt;br /&gt;..........- XML based script : A fast and easy script for tools&lt;br /&gt;..........- Class delegates, or how to store and call class member pointers from other classes&lt;br /&gt;..........- Property based Frontend / Gui&lt;br /&gt;..........- Remote Frontend for use at diverse software applications&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Try to enjoy the reading as much as I'm going to enjoy writing it!&lt;br /&gt;&lt;br /&gt;Some feedback would be appreciated if you are interested on any subject.&lt;br /&gt;&lt;br /&gt;Cheers!&lt;br /&gt;&lt;br /&gt;Cherno&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1352089011077275678-5084404175987732016?l=realworldprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realworldprogramming.blogspot.com/feeds/5084404175987732016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1352089011077275678&amp;postID=5084404175987732016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/5084404175987732016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1352089011077275678/posts/default/5084404175987732016'/><link rel='alternate' type='text/html' href='http://realworldprogramming.blogspot.com/2007/07/this-blog-is-starting-be-patient.html' title='This blog is starting... be patient'/><author><name>Jaime Cifuentes Olivares</name><uri>http://www.blogger.com/profile/14427270037139599868</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://bp2.blogger.com/_NYYl9L6djq0/R-2B2mo97fI/AAAAAAAAAlE/uadmQPlnu4g/S220/P1010055.JPG'/></author><thr:total>0</thr:total></entry></feed>
