<?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-9181939064927126715</id><updated>2012-01-10T02:04:01.721-08:00</updated><category term='linux'/><category term='story'/><category term='overview'/><category term='apk'/><category term='centos'/><category term='javascript'/><category term='java'/><category term='erlang'/><category term='erlang rabbitmq development linux'/><category term='development'/><category term='perl'/><category term='status'/><category term='mac os x'/><category term='rm2k'/><category term='editor'/><category term='android'/><category term='battle'/><category term='diagram'/><category term='rpg'/><category term='wxwidgets'/><category term='g1'/><category term='mmorpg'/><category term='features'/><category term='chat'/><category term='rabbitmq'/><category term='team'/><category term='fun'/><category term='screenshot'/><category term='release'/><category term='c++'/><category term='developmentt'/><category term='non-technical'/><title type='text'>Miguel's Dreams Factory</title><subtitle type='html'>On my journey of building a 2D MMORPG for Android.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-6383657263175966839</id><published>2011-10-11T14:24:00.000-07:00</published><updated>2011-10-11T14:24:37.508-07:00</updated><title type='text'>More Fun Shots</title><content type='html'>I'm pretty excited as my graphic artist is now finished with most of the tileset work and now it's time to do backgrounds and monsters!&lt;br /&gt;&lt;br /&gt;Slowly but surely, the story seems to progressing. &amp;nbsp;I know have tons of ideas for little quests, it's just a matter of implementing them and herding the player through the global story.&lt;br /&gt;&lt;br /&gt;Anyway, here's some more screenshots. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-q5LzqQk7UdY/TpSz-lkaOeI/AAAAAAAAAb4/PlweK3yzgOQ/s1600/dark_cavern_map1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://3.bp.blogspot.com/-q5LzqQk7UdY/TpSz-lkaOeI/AAAAAAAAAb4/PlweK3yzgOQ/s320/dark_cavern_map1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-miXHTkpOTMo/TpSz_In0dzI/AAAAAAAAAcA/TI74Knmn1ZE/s1600/desert_map1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-miXHTkpOTMo/TpSz_In0dzI/AAAAAAAAAcA/TI74Knmn1ZE/s320/desert_map1.png" width="319" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Vhe_ZGspuF4/TpSz_aqfcjI/AAAAAAAAAcI/u9gHpK1Eacc/s1600/device_landscape_battle_screenshot1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-Vhe_ZGspuF4/TpSz_aqfcjI/AAAAAAAAAcI/u9gHpK1Eacc/s320/device_landscape_battle_screenshot1.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Lvm8azmFzcI/TpSz_hDjlqI/AAAAAAAAAcQ/wk9IY1fRjko/s1600/device_portait_battle_screenshot1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-Lvm8azmFzcI/TpSz_hDjlqI/AAAAAAAAAcQ/wk9IY1fRjko/s320/device_portait_battle_screenshot1.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-rCzJVj905qE/TpS0AJ38dPI/AAAAAAAAAcY/zW-YEemEAxw/s1600/forest_map.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://2.bp.blogspot.com/-rCzJVj905qE/TpS0AJ38dPI/AAAAAAAAAcY/zW-YEemEAxw/s320/forest_map.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-IUJ-uEBih3U/TpS0AdP3gcI/AAAAAAAAAcg/mq_EOvZy7TA/s1600/forest_map2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="274" src="http://2.bp.blogspot.com/-IUJ-uEBih3U/TpS0AdP3gcI/AAAAAAAAAcg/mq_EOvZy7TA/s320/forest_map2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-n9C_hPiuKHk/TpS0AjhzovI/AAAAAAAAAco/ioHQ_EFTc8Y/s1600/marsh_map1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-n9C_hPiuKHk/TpS0AjhzovI/AAAAAAAAAco/ioHQ_EFTc8Y/s320/marsh_map1.png" width="319" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DsmwmIfnxLo/TpS0AwCJnjI/AAAAAAAAAcw/riYLn0slXhE/s1600/mash_map2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://1.bp.blogspot.com/-DsmwmIfnxLo/TpS0AwCJnjI/AAAAAAAAAcw/riYLn0slXhE/s320/mash_map2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2T8yvU3tUNI/TpS0BIRzteI/AAAAAAAAAc4/7UlJuDNHOK8/s1600/rocky_mountains1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://4.bp.blogspot.com/-2T8yvU3tUNI/TpS0BIRzteI/AAAAAAAAAc4/7UlJuDNHOK8/s320/rocky_mountains1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mzjqADH8_Vg/TpS0BWFV_1I/AAAAAAAAAdA/d7UxqTcQoFM/s1600/rocky_mountains2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://3.bp.blogspot.com/-mzjqADH8_Vg/TpS0BWFV_1I/AAAAAAAAAdA/d7UxqTcQoFM/s320/rocky_mountains2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-JEOYoS1NdbM/TpS0B6_U1aI/AAAAAAAAAdI/Rp52QlpuR48/s1600/rocky_mountains3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://4.bp.blogspot.com/-JEOYoS1NdbM/TpS0B6_U1aI/AAAAAAAAAdI/Rp52QlpuR48/s320/rocky_mountains3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-6383657263175966839?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/6383657263175966839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2011/10/more-fun-shots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6383657263175966839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6383657263175966839'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2011/10/more-fun-shots.html' title='More Fun Shots'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-q5LzqQk7UdY/TpSz-lkaOeI/AAAAAAAAAb4/PlweK3yzgOQ/s72-c/dark_cavern_map1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-7331623882213747883</id><published>2011-09-09T23:10:00.000-07:00</published><updated>2011-09-09T23:10:38.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rm2k'/><category scheme='http://www.blogger.com/atom/ns#' term='features'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='story'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Fun Shot - #?</title><content type='html'>Hi All,&lt;br /&gt;&lt;br /&gt;Working on adding static background images to the game.&lt;br /&gt;Because I used OpenGL, scaling came free!&lt;br /&gt;Here's some snapshots.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-i7-NjyLsg78/Tmr_NOxfmLI/AAAAAAAAAbo/I6NfkzRZn6E/s1600/device-2011-09-09-040716.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-i7-NjyLsg78/Tmr_NOxfmLI/AAAAAAAAAbo/I6NfkzRZn6E/s320/device-2011-09-09-040716.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-aKNzqbNh7d0/Tmr_NvYORgI/AAAAAAAAAbs/XB9AmkZ1ps4/s1600/device-2011-09-09-225755.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-aKNzqbNh7d0/Tmr_NvYORgI/AAAAAAAAAbs/XB9AmkZ1ps4/s320/device-2011-09-09-225755.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3zX2-VQJ9xA/Tmr_OI8ARWI/AAAAAAAAAbw/c25HQfqU0hk/s1600/device-2011-09-09-230529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-3zX2-VQJ9xA/Tmr_OI8ARWI/AAAAAAAAAbw/c25HQfqU0hk/s320/device-2011-09-09-230529.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-7331623882213747883?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/7331623882213747883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2011/09/fun-shot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7331623882213747883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7331623882213747883'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2011/09/fun-shot.html' title='Fun Shot - #?'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-i7-NjyLsg78/Tmr_NOxfmLI/AAAAAAAAAbo/I6NfkzRZn6E/s72-c/device-2011-09-09-040716.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-9104548993377405045</id><published>2011-06-02T19:42:00.000-07:00</published><updated>2011-06-02T19:42:49.944-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rm2k'/><category scheme='http://www.blogger.com/atom/ns#' term='features'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='diagram'/><category scheme='http://www.blogger.com/atom/ns#' term='story'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='team'/><title type='text'>The Art of Storytelling</title><content type='html'>It's been a while since my last post and that's mostly because I've been working a full time job.&lt;br /&gt;I thank God that I got this sweet gig as a mobile app developer.&lt;br /&gt;This gives me the chance to learn and develop for iPhone/iPad and BlackBerry.&amp;nbsp; Which means more potential clients for the game.&lt;br /&gt;That, however, is in the distant future.&amp;nbsp; I've still got to get the Android release out there.&lt;br /&gt;What's even better is that the job doesn't require insane hours.&amp;nbsp; I've still got plenty of time to work on SolomonRPG.&lt;br /&gt;&lt;br /&gt;So, toward the goal of releasing the first version, I've slowed down development of the game engine and am now focusing on the art and storyline.&amp;nbsp; This doesn't mean the engine has stalled, I just feel that it's at a point where it's good enough and has enough features that I can start concentrating on other critical aspects of the game.&lt;br /&gt;&lt;br /&gt;Believe it or not the programming is not the most important aspect of a game.&lt;br /&gt;At least for what I've had in mind since the beginning.&lt;br /&gt;I really hate many of the MMORPGs out there for a few reasons.&lt;br /&gt;&amp;nbsp;For example, Pocket Legends, has great gameplay and graphics but I have no idea what the story is.&lt;br /&gt;Granted I've only seriously played it for a few days.&amp;nbsp; There is no insentive to play beside just leveling up and collecting items.&lt;br /&gt;What's even worse is how you can actually buy items and powers using real money.&lt;br /&gt;I hate this.&amp;nbsp; It cheapens the game and feels like a sell-out move.&lt;br /&gt;Another thing is the story, or lack of story.&lt;br /&gt;&lt;br /&gt;What I love about RPGs are the stories.&amp;nbsp; I remember the good old days when I played the greats. &amp;nbsp;Breathe of Fire, Chronno Trigger, YS 1&amp;amp;2, Secret of Mana, Zelda, Final Fantasy, etc.&lt;br /&gt;&lt;br /&gt;These games ruled in the story telling aspect.&amp;nbsp; They introduced characters and story lines that progressed and changed, climaxed and concluded.&amp;nbsp; Some of the characters would even die.&lt;br /&gt;Now in most modern MMORPGs this notion is gone.&amp;nbsp; They are not true to their ancestors and have become nothing more than a cheap quest fill system to make some quick cash without actually making a game.&lt;br /&gt;&lt;br /&gt;I'm not saying that I think the story line that SolomonRPG has is any better.&amp;nbsp; In fact, it might be worse because I'm not a professional writer.&amp;nbsp; I haven't written a story for a long time&lt;br /&gt;&lt;br /&gt;I'm saying it is a unique challenge to have a few races/classes and develop stories around them.&lt;br /&gt;These stories have to be cohesive to build/narrate the story of the virtual world.&amp;nbsp; They have to drive to a point and a conclusion.&amp;nbsp; There is drama and conflict in the middle.&lt;br /&gt;&lt;br /&gt;At the same time, you must keep in mind the constraints of the virtual world. &lt;br /&gt;For example, the engine was designed to use a magic battle system.&amp;nbsp; So you have to give a good background/narrative has to how or why the characters are able to use magic.&lt;br /&gt;You have to motivate them to continue to level up and interact with the virtual world.&lt;br /&gt;You also have to keep it simple enough where casual users don't have to read through tons of text to be able to pick up the game and play.&lt;br /&gt;&lt;br /&gt;These and other factors make story telling challenging.&amp;nbsp; These are the types of questions that forced me to really examine the story:&lt;br /&gt;&lt;br /&gt;What am I doing here?&lt;br /&gt;What is my goal?&amp;nbsp; What is my history?&lt;br /&gt;Why is this town here, why are the other towns there?&lt;br /&gt;Why are those monsters there?&amp;nbsp; Where did they come from?&lt;br /&gt;Why do I have to fight them?&amp;nbsp; Why do they fight?&lt;br /&gt;Why should I do a quest?&lt;br /&gt;&lt;br /&gt;Furthermore, the idea of having to write a bunch of brain-dead short quests that don't really tie into anything was not acceptable.&lt;br /&gt;&lt;br /&gt;Back to the things I hate about most MMORPGs.&amp;nbsp; You may have noticed that in the Android market you'll see that most MMORPGs are crappy website type 'games' that don't even have any moving graphics.&amp;nbsp; You click on a button and you see some text change.&amp;nbsp; Boring!&lt;br /&gt;To top it off these games don't offer anything in terms of story telling either.&lt;br /&gt;They usually consist of the same old: Go here, get me X of these, and I'll reward you with this.&lt;br /&gt;&lt;br /&gt;This is why I never play World of Warcraft, what's the point?&lt;br /&gt;I don't care about the characters, and I don't care about leveling up for the sake of leveling up.&lt;br /&gt;I guess the only real motivation there is the end-game.&amp;nbsp; Where you can battle against other players and do party raids.&amp;nbsp; That's the real fun in leveling up.&lt;br /&gt;&lt;br /&gt;SolomonRPG doesn't have a raid system, or even PvP yet.&amp;nbsp; So, I had to come up with a concept that'll motivate players to co-operate and level up.&amp;nbsp; To continue playing toward something.&lt;br /&gt;However, in there lies yet another issue.&amp;nbsp; What to do once the story 'ends'? &lt;br /&gt;I guess at some point I'll have to implement PvP and raiding of a king. &lt;br /&gt;&lt;br /&gt;This is the reason I have been so quiet for the past few months.&lt;br /&gt;This adds yet another challenge to making SolomonRPG possible. &lt;br /&gt;&lt;br /&gt;In the coming months I'll keep you updated on any progress I make. &lt;br /&gt;So far I have the world story premise but I'll hold off on telling it for now until I polish it a bit more.&lt;br /&gt;I'm also in the progress of making character lists and dialog for each one. &lt;br /&gt;Creating an end-story that will be where all the sub-plots lead to.&lt;br /&gt;&lt;br /&gt;These are all new aspects for me, but thankfully God's been giving me the chance to meet some really smart people who have helped give me tips and advice on how I should tackle this.&lt;br /&gt;&lt;br /&gt;Anyway, for now I'll just post some random art for the game.&amp;nbsp; These are all still concepts.&lt;br /&gt;Wish me luck, and don't forget: Jesus is King! &lt;br /&gt;&lt;br /&gt;P.S.&lt;br /&gt;Here are some snapshots of some of the custom art and maps that I've gathered so far.&lt;br /&gt;None of this is final, in the end I'll probably use tons of pixel art for the old school feel.&lt;br /&gt;Also, thanks a bunch to &lt;a href="http://kinougames.com/"&gt;Kinou Games&lt;/a&gt;&amp;nbsp;for being awesome. &amp;nbsp;They've done a bunch of custom tilesets and character sets. &amp;nbsp;They've also been helping me with the art style and map concepts. &amp;nbsp; All in all, I HIGHLY recommend them for anyone who needs good game art at decent prices.&lt;br /&gt;(The first hand drawing is by a personal friend of mine.)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vx7F3Dr8n1o/TehJuwZYdTI/AAAAAAAAAZA/8dwDWorHGCI/s1600/bull1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-vx7F3Dr8n1o/TehJuwZYdTI/AAAAAAAAAZA/8dwDWorHGCI/s1600/bull1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-cIykBDYHfb8/TehJwC5DC2I/AAAAAAAAAZE/E--qomuyAxY/s1600/chibitaurenfinal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-cIykBDYHfb8/TehJwC5DC2I/AAAAAAAAAZE/E--qomuyAxY/s1600/chibitaurenfinal.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yEqYM6Ql6OM/TehJw8fJpZI/AAAAAAAAAZI/NGqjWFM0OBA/s1600/jezioro.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="139" src="http://2.bp.blogspot.com/-yEqYM6Ql6OM/TehJw8fJpZI/AAAAAAAAAZI/NGqjWFM0OBA/s320/jezioro.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PYyNlJxLGCY/TehJxtQbWOI/AAAAAAAAAZM/XQAlICgS4f8/s1600/Screen+shot+2011-06-02+at+7.31.15+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="237" src="http://4.bp.blogspot.com/-PYyNlJxLGCY/TehJxtQbWOI/AAAAAAAAAZM/XQAlICgS4f8/s320/Screen+shot+2011-06-02+at+7.31.15+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Q2S28Kyavpc/TehJ01g_3BI/AAAAAAAAAZQ/EFzdl2nUkeE/s1600/Screen+shot+2011-06-02+at+7.31.48+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="306" src="http://4.bp.blogspot.com/-Q2S28Kyavpc/TehJ01g_3BI/AAAAAAAAAZQ/EFzdl2nUkeE/s320/Screen+shot+2011-06-02+at+7.31.48+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SGJtzw0uQ40/TehJ2Fg774I/AAAAAAAAAZU/hLapA67FfJ8/s1600/Screen+shot+2011-06-02+at+7.32.32+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="309" src="http://3.bp.blogspot.com/-SGJtzw0uQ40/TehJ2Fg774I/AAAAAAAAAZU/hLapA67FfJ8/s320/Screen+shot+2011-06-02+at+7.32.32+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-9104548993377405045?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/9104548993377405045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2011/06/art-of-storytelling.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/9104548993377405045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/9104548993377405045'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2011/06/art-of-storytelling.html' title='The Art of Storytelling'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-vx7F3Dr8n1o/TehJuwZYdTI/AAAAAAAAAZA/8dwDWorHGCI/s72-c/bull1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-3763545941084619792</id><published>2011-01-12T16:24:00.000-08:00</published><updated>2011-01-14T13:55:02.654-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developmentt'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android: Canvas Frame by Frame Animation Tutorial</title><content type='html'>&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In this tutorial I will outline how to play an animation on a canvas on &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Android&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;As you may already know, the canvas is the standard way of drawing on &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Android&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Drawing to a canvas is fairly straightforward.&amp;nbsp; You typically extend a View class and override the onDraw method.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In this case we will override ImageView for the sake of simplicity.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I will be using Eclipse for this tutorial.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;First, create a new &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Android&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; project with Eclipse.&amp;nbsp; You can use 1.5 as the target.&amp;nbsp; I've named the application &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;animationtest&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Also, make sure you create a default activity, I call mine 'DefaultActivity.'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The package name I'll be using is com.solrpg.animationtest.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;After you have created your &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Android&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; project, create a new class named MyAnimationView. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This class will extend ImageView and we'll do our drawing here.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;MyAnimationView.java:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://github.com/therevoltingx/android_animation_test/blob/master/src/com/solrpg/animationtest/MyAnimationView.java"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;http://github.com/therevoltingx/android_animation_test/blob/master/src/com/solrpg/animationtest/MyAnimationView.java&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Now, your view is ready to use.&amp;nbsp; Because DefaultActivity simply sets the activity layout to R.layout.main we'll need to modify it.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;So, open up res/layout/main.xml and remove the TextView entry and replace it with your custom view using this xml:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://github.com/therevoltingx/android_animation_test/blob/master/res/layout/main.xml"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;http://github.com/therevoltingx/android_animation_test/blob/master/res/layout/main.xml&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Now we're ready to display our animation.&amp;nbsp; I have prepared a set of &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;png&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; images from a &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;gif&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;You can see the original &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;gif&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; here:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://solrpg.com/resources/attacks/2/2.gif"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;http://solrpg.com/resources/attacks/2/2.gif&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Then I imported them into res/drawables/ naming them shark_0.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;png&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; shark_1.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;png&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; shark_2.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;png&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; and so on.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Where each number is the frame, all together this animation is 16 frames.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Now it's time to go back to MyAnimationView and add our animation code.&amp;nbsp; Basically, android calls onDraw every time the view needs to be drawn.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Typically this only happens once when the activity view is being set up.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;After that, we have to call invalidate() on the view to have Android call onDraw().&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;First, we have to load the resource drawables into an array of bitmaps which can be drawn on the canvas.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;So, we add a loadAnimation() method to MyAnimationView.&amp;nbsp; This method simply loads the frames from the res/drawables/ folder into a list of bitmaps.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In the example, we load the bitmaps when the default activity is created.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Once all the bitmaps are loaded, the animation is ready to be drawn.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Now, back to our onDraw method. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;First we have two private state variables called mIsPlaying and mStartPlaying.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Every time onDraw is called we check wether either one of these is set and draw the bitmap frame accordingly.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In order to start an animation we simply set mStartPlaying to true and call invalide() to have Android call onDraw().&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;When an animation is playing the variable mIsPlaying is set to true it checks which frame it has to draw.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In order to know which frame to play we need two variables play_frame and last_tick.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;play_frame is set to the frame index of the animation that we're about to draw.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;last_tick is set to a system time stamp.&amp;nbsp; This time stamp is set every time a frame changes.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This lets us calculate how long the current frame has been drawing. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Once a specified amount of time has passed it increases the play_frame counter and calls invalidate()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Now you're ready to draw the animation.&amp;nbsp; We add a method called playAnimation() which simply sets mStartPlaying to true, then it calls invalidate().&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In the tutorial application I added a button that when pressed calls playAnimation().&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;That's it!&amp;nbsp; Drawing an animation this way is fairly easy, I hope someone finds this helpful.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Project link:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://github.com/therevoltingx/android_animation_test"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;http://github.com/therevoltingx/android_animation_test&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-3763545941084619792?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/3763545941084619792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2011/01/android-canvas-frame-by-frame-animation.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3763545941084619792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3763545941084619792'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2011/01/android-canvas-frame-by-frame-animation.html' title='Android: Canvas Frame by Frame Animation Tutorial'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-1793037419732101672</id><published>2010-12-19T11:58:00.000-08:00</published><updated>2010-12-19T20:11:51.965-08:00</updated><title type='text'>A Holiday Release - SolomonRPG:Alpha 0.3</title><content type='html'>&lt;div&gt;&lt;b&gt;&lt;u&gt;SIGN UP NOW - ALPHA&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Download the client:&amp;nbsp;&lt;a href="http://solrpg.com/SolomonRPG.apk"&gt;SolomonRPG.apk&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Signup here:&amp;nbsp;&lt;a href="http://solrpg.com/"&gt;http://solrpg.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;OVERVIEW&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;It's been a few months since I last made a release.&lt;br /&gt;With the restlessness of the holidays, and finally achieving some sort of stability I've decided to make another alpha test release.&lt;br /&gt;Here's a breakdown of the issues and notices for this release:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;HOSTING&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Because I am unemployed at the moment, I can't afford to keep my linode running without any sort of income. &amp;nbsp;I've gone ahead and shutdown the previous Linode I had setup so I don't waste money. &lt;br /&gt;As with the previous release, I'm hosting the server on my home server so things will be noticeably slow.&lt;br /&gt;I've made the http://solrpg.com point to my home server as well. &amp;nbsp;Because I'm sort of at a feature freeze I hope that I won't be messing with the server that much.&lt;br /&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ANDROID CLIENT&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;I've gone ahead and spent some time polishing the client code. &amp;nbsp;Making sure it'll work in various resolutions and just polishing up the lifecycle of the application. &amp;nbsp;I've tested it on a few G1s running Android 1.5 and Android 2.2 and it works just fine. &amp;nbsp;I also tested it in the emulator with larger screens and it seemed to work just fine although it's unusably slow in the emulator.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;u&gt;ERLANG SERVER&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;This whole project has been centered around learning Erlang. &amp;nbsp;These past few days I took the time to learn about the Erlang OTP application setup. &amp;nbsp;Creating an .app file, bootstrapping the application when the VM starts, creating a proper application supervisor, and updating the various sub servers to die and restart more gracefully. &amp;nbsp;I also added things like database connection pooling. &amp;nbsp;This was very fun and I learned a lot about the Erlang ecosystem. &amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;u&gt;SCRIPTING SERVER&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I finally added the concept of switches and created my first real 'quest'. &amp;nbsp;A switch, can hold any given value. &amp;nbsp;Anything from a string, to a boolean, to an integer, or float. &amp;nbsp;Each switch is defined by a name, and needs to be defined with an NPC. &amp;nbsp;Once it's defined, you can use it globally in other events. &amp;nbsp;Here's how my first quest looks like. &amp;nbsp;This is real game scripting code:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Generic person NPC:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;importPackage(com.solrpg.solomon_scripting)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;var PENDANT_SWITCH = 'village_pendant_quest';&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Solomon.defineSwitch(PENDANT_SWITCH);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;if (Solomon.getSwitch(PENDANT_SWITCH))&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Solomon.message("Thanks!");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;describeQuest();&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;function describeQuest()&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;var MessageStr = "Hey, if you find a pendant in the forest, please bring it to me. \&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;My mother gave it to me, and it's not of much value, but I'd be happy to pay a \&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;small reward for it.";&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Solomon.message(MessageStr);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Dropped pendant NPC:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;importPackage(com.solrpg.solomon_scripting)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;var PENDANT_SWITCH = 'village_pendant_quest';&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Solomon.defineSwitch(PENDANT_SWITCH);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;if (Solomon.getSwitch(PENDANT_SWITCH))&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Solomon.message("It's empty.");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Solomon.setSwitch(PENDANT_SWITCH, true);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Solomon.message("You've found a pendant");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;I've also added support for catching errors and when the script fails to load. &amp;nbsp;A message is simply sent to the player, so the creator has to make sure there are no mistakes in the scripting code by constantly testing them in the client. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;u&gt;The Future&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Certainly the most time consuming aspect of the game seems to be the story development and map making. &amp;nbsp;My girlfriend is helping me create maps for the games and she's really good at it, so that's a load off for me. &amp;nbsp;Now I'm just concentrating on coming up stories, making maps, fixing bugs, and stabilizing all the features.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;However, there are a couple of features I'd like to implement sometime next year:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;HTML Tileset Editor&lt;/li&gt;&lt;li&gt;NPC Auto Walking&lt;/li&gt;&lt;li&gt;Compress data sent over network&lt;/li&gt;&lt;/ul&gt;None of these features are critical to the game. &amp;nbsp;The NPC autowalking is something I'd like to see soon. &amp;nbsp;Right now all you see are moving water, moving players, but I'd like to have the option for the NPCs to move as well.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Compressions of data is sort of important, this is actually just needed at a couple of critical points. &amp;nbsp;When teleporting from area to area and when first logging in. &amp;nbsp;Not a priority.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;There are also plenty of lesser features I have to implement before releasing the game, but those are the big ones&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;u&gt;WORKING ON NOW&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Mainly just brainstorming with my girlfriend on the world map. &amp;nbsp;She's making the maps on RMXP and then I select whichever tiles she used and compact the tilesets and import them into the game. &amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I'm also polishing the battle system.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I also had to implement leveling curves which was pretty fun.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Basically, it's a way to keep track of how many experience points are needed to get a certain level.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Each class has the following attributes:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;level, exp, hp, mp, attack, defense, speed, and critical_hit_chance.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Each class has a certain algorithm to calculate how many exp points are needed to reach a certain level and what to set the attributes to when the player reaches those levels. &amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Then I used a jQuery chart library to generate some tables to visualize it better. &amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I still have a bunch of story related work to do, here's my TODO list for the release:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Full concurrent world map&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;4 races with full story lines&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;All races and content up to level 20&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Monster and monster parties for all world areas&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Integrated multiplayer communication and party management&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Fully working multiplayer battle system with stats&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SOLRPG.COM -&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Full documentation of game overview and gameplay&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Fully working site with minimal feature set, doesn't have to be perfect&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; font-weight: normal;"&gt;&lt;b&gt;&lt;u&gt;SCREENSHOTS&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lFtcd_eI/AAAAAAAAAIA/VAKUIgrJu5Q/s1600/emulator_login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="318" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lFtcd_eI/AAAAAAAAAIA/VAKUIgrJu5Q/s320/emulator_login.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lH890BCI/AAAAAAAAAIE/FKWhzvyShYA/s1600/emulator_signup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="318" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lH890BCI/AAAAAAAAAIE/FKWhzvyShYA/s320/emulator_signup.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lLF2onrI/AAAAAAAAAII/KOBoTf-yQBU/s1600/emulator_ingame.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="318" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lLF2onrI/AAAAAAAAAII/KOBoTf-yQBU/s320/emulator_ingame.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lM3GxmLI/AAAAAAAAAIM/bkevqgAxMlY/s1600/player_home.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lM3GxmLI/AAAAAAAAAIM/bkevqgAxMlY/s320/player_home.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lOahg-NI/AAAAAAAAAIQ/IEdkTZUZyeY/s1600/player_add_area.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lOahg-NI/AAAAAAAAAIQ/IEdkTZUZyeY/s320/player_add_area.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lQJdgWhI/AAAAAAAAAIU/nhU2aWlZPIU/s1600/player_edit_area.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lQJdgWhI/AAAAAAAAAIU/nhU2aWlZPIU/s320/player_edit_area.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lRcF6yCI/AAAAAAAAAIY/9dn7RXothhk/s1600/class_leveling_chart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lRcF6yCI/AAAAAAAAAIY/9dn7RXothhk/s320/class_leveling_chart.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lT5WWefI/AAAAAAAAAIc/agCMSjcuy1c/s1600/edit_event.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lT5WWefI/AAAAAAAAAIc/agCMSjcuy1c/s320/edit_event.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;u&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; font-weight: normal;"&gt;&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-1793037419732101672?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/1793037419732101672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/12/holiday-release-solomonrpgalpha-03.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1793037419732101672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1793037419732101672'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/12/holiday-release-solomonrpgalpha-03.html' title='A Holiday Release - SolomonRPG:Alpha 0.3'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Vtq6sCdzyKs/TQ5lFtcd_eI/AAAAAAAAAIA/VAKUIgrJu5Q/s72-c/emulator_login.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-5825748354376368712</id><published>2010-11-20T14:41:00.000-08:00</published><updated>2010-11-20T14:41:19.515-08:00</updated><title type='text'>The Erlang Game Loop</title><content type='html'>After my last blog post I took the time to signup for Linode and setup my application there.&lt;br /&gt;After running a few tests it was apparent my initial game loop was flawed.&lt;br /&gt;Even with the beefy hardware the erlang beam process was hitting 300% after around 50 areas.&lt;br /&gt;&lt;br /&gt;My initial approach to the game loop was a bit naive.&amp;nbsp;&lt;br /&gt;When loading each area I would spawn an erlang process with a game loop that would grab all the players in that area and process any new move flags, pathfinding, checking collisions, updating character positions, etc.&lt;br /&gt;&lt;br /&gt;I figured that even though this was CPU intensive it shouldn't be too much of a problem.&amp;nbsp; I was wrong.&lt;br /&gt;&lt;br /&gt;However, if you pay attention you'll notice I can easily improve this by having a global game loop, and processing all the players regardless of their area.&lt;br /&gt;&lt;br /&gt;So, the old was was something like this in pseudo-code:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foreach (areas)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; load_layout_into_memory()&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootstrap_ets_tables()&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start_game_loop(area_id)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;end&lt;/div&gt;&lt;br /&gt;It took me no longer than 30 minutes to update the code.&amp;nbsp; Now it looks like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foreach (areas)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; load_layout_into_memory()&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootstrap_ets_tables()&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; end &lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;start_global_game_loop()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I then ran some tests on my Linode, first I had to set my &lt;span class="code"&gt;ERL_MAX_ETS_TABLES to 7000.&lt;/span&gt;&lt;br /&gt;&lt;span class="code"&gt;I was able to load over 3000 areas with the beam process hovering around 10%.&amp;nbsp; Great!&lt;/span&gt;&lt;br /&gt;&lt;span class="code"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="code"&gt;It now seems like SolomonRPG should handle well for a good while.&amp;nbsp; There are a few things that need to be smoothed out, but for the most part everything seems to work.&lt;/span&gt;&lt;br /&gt;&lt;span class="code"&gt;With all these areas the only issue is now running out of memory but Linode has some good plans for adding more memory.&amp;nbsp; And although I haven't done much testing, thanks to Erlang, I think I can just add more nodes and have them process sets of players.&lt;/span&gt;&lt;br /&gt;&lt;span class="code"&gt;For example, have node1 process players 1 - 1000, node2 1001 - 2000, node 3....&lt;/span&gt;&lt;br /&gt;&lt;span class="code"&gt;Or perhaps separate them by area.&amp;nbsp; Either way should be easy to implement, damn Erlang rocks.&lt;/span&gt;&lt;br /&gt;&lt;span class="code"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-5825748354376368712?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/5825748354376368712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/11/erlang-game-loop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/5825748354376368712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/5825748354376368712'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/11/erlang-game-loop.html' title='The Erlang Game Loop'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-5420739332836088238</id><published>2010-11-19T02:30:00.000-08:00</published><updated>2010-11-19T11:35:30.511-08:00</updated><title type='text'>On The Road to Release - Part: 1</title><content type='html'>After having ported the map editor to HTML and Javascript, I also took the time to setup a domain and implement the player's website.&lt;br /&gt;&lt;br /&gt;The final url for the game is: &lt;a href="http://solrpg.com/"&gt;solrpg.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is still a lot of work to do, though, before I release the client in the Android Market and enable signups.&lt;br /&gt;Here's a breakdown of what's needed or being worked on.&lt;br /&gt;&lt;br /&gt;For reference, here is the hardware I'm developing the SolomonRPG server on:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1 Core CPU - AMD Duron(tm) 1.2GHz&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1GB -&amp;nbsp; DDR RAM&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;80GB - PATA Hard Drive&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Cent OS 5 - x86&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Hosting - Linode&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;At the moment, the domain is hosted on my only spare computer at home.&lt;br /&gt;Obviously, I can't release the game because my upload speed is pathetic.&lt;br /&gt;&lt;br /&gt;Linode has a hosting plan that starts at $20 a month.&amp;nbsp; I've been hearing good things about them, and I'm excited to try them out.&lt;br /&gt;Here's what the basic hosting plan includes:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;4 Core CPU - Intel(R) Xeon(R) CPU L5420 @ 2.50GHz&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;512MB - RAM&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16GB - Hard Drive&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Cent OS 5 x86_64&lt;/div&gt;&lt;br /&gt;The Solomon server holds a lot of small bits in memory ram, such as player credential, player location, status, tileset layouts, etc.&lt;br /&gt;Simply storing a player and area definitions in memory can be a scaling issue&lt;br /&gt;However, from preliminary tests reveal the real wall seems to be the game loop for each area.&lt;br /&gt;&lt;br /&gt;Each area has a process that handles all the game logic for that area.&amp;nbsp; Each game loop runs at a variable 60FPS. &lt;br /&gt;This is fairly CPU intensive, and my development machine starts giving out at barely 20 areas.&lt;br /&gt;&lt;br /&gt;At the moment, I'm not sure if I can optimize this.&amp;nbsp; Perhaps by having a game loop for each Erlang node and try to squeeze the game logic there, but I haven't given it much thought.&lt;br /&gt;I want to do some tests on the Linode host itself to see if its worth my time to optimize.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Content Creation&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;The fun part is creating content for the game.&amp;nbsp; Creating tilesets using Gimp and constantly testing them out and choosing which tiles to use.&lt;br /&gt;I have choose carefully because tilesets have to be as small as possible.&amp;nbsp; The bigger the tileset, the longer it takes to load in a mobile phone.&lt;br /&gt;&lt;br /&gt;Mapping out areas is also quite fun, I have to first map out the world on grid paper with a pencil.&lt;br /&gt;Then, mapping out each area using the new editor.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Story making is another challenging aspect.&amp;nbsp; For that, I'm turning to my favorite book in the world, The Bible.&amp;nbsp; In the coming months, I hope to continue carefully reading the Bible and implementing some of the cool stories into the game.&amp;nbsp; I want people to know that I'm Christian and that God was the only one who helped me make this game, I never would have been able to get this far by myself.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Polish, Polish, Polish&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Continue to refine the SolomonRPG codebase and try to fix as many bugs as possible.&lt;br /&gt;Make the client not drain the phone battery.&lt;br /&gt;Lower the SolomonRPG CPU requirements.&lt;br /&gt;Implement scripting in Erlang using erlang_js (MAYBE)&lt;br /&gt;Make teleporting from area to area as smooth as possible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Funds and Revenue&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;If I am unable to lower the CPU requirements, it'll be very expensive to release the website for the game.&amp;nbsp; Ideally, I'd like players to create as many areas as they'd like for free.&lt;br /&gt;I will have advertisement in both the client and the website, but I'm not sure if it'll be enough.&lt;br /&gt;I don't have a budget for the game at all, and I'm trying to save up enough to sign up for the Android Market and the first month of hosting.&amp;nbsp; Anyway, I'm thinking of adding a donation button to the blog.&amp;nbsp; We'll see though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-5420739332836088238?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/5420739332836088238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/11/on-road-to-release-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/5420739332836088238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/5420739332836088238'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/11/on-road-to-release-part-1.html' title='On The Road to Release - Part: 1'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-8501698825668710347</id><published>2010-10-20T00:24:00.000-07:00</published><updated>2010-10-20T00:25:50.571-07:00</updated><title type='text'>New Puppy!!</title><content type='html'>For the longest I've been wanting a dog.&amp;nbsp; Finally, this weekend I went down to the animal shelter and picked up a Staffordshire mix.&amp;nbsp; Here are some pictures, it's sooo awesome!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TL6ZEHd8nnI/AAAAAAAAAGw/vhW7T7uycrU/s1600/dog_photo.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TL6ZEHd8nnI/AAAAAAAAAGw/vhW7T7uycrU/s200/dog_photo.JPG" width="148" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-8501698825668710347?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/8501698825668710347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/10/new-puppy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/8501698825668710347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/8501698825668710347'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/10/new-puppy.html' title='New Puppy!!'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vtq6sCdzyKs/TL6ZEHd8nnI/AAAAAAAAAGw/vhW7T7uycrU/s72-c/dog_photo.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-1149875439059692347</id><published>2010-10-13T02:53:00.000-07:00</published><updated>2010-10-25T00:15:58.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='features'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='g1'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Player Map Making in the Browser</title><content type='html'>After spending some time creating maps and thinking about story telling, quest designing, and map making I've decided to move the map making process to the browser.&lt;br /&gt;&lt;br /&gt;For one, it'll help speed up the flow of the development of content for the game. &lt;br /&gt;I've decided to use jQuery for this. &lt;br /&gt;&lt;br /&gt;Since the beginning I've thought about the ability of players to be able to create the story and world around them. &amp;nbsp;The infrastructure was set up with the thought in the back of my head. &lt;br /&gt;&lt;br /&gt;So, now that I've decided to port the map maker to a web interface I've also decided to add the ability for players to make the world.&lt;br /&gt;&lt;br /&gt;Here's a break down of this new feature-set:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;== Player Web Interface + Web Map Maker ==&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Each player has a login to the web interface.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; One can create maps using existing &lt;span style="text-decoration: underline;"&gt;tilesets&lt;/span&gt;.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; In each map one can create events/&lt;span style="text-decoration: underline;"&gt;npcs&lt;/span&gt;.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="text-decoration: underline;"&gt;Npcs&lt;/span&gt; are &lt;span style="text-decoration: underline;"&gt;javascript&lt;/span&gt; driven.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px; min-height: 15px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; World is empty except for current areas&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Player creates account either in web or in client (&lt;span style="text-decoration: underline;"&gt;pre&lt;/span&gt;-allocates X scripting switches)&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Player can then create areas. &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set Name, Select a &lt;span style="text-decoration: underline;"&gt;tileset&lt;/span&gt;.&amp;nbsp; Width and height are 20x20.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Area Settings:&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Name&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Troops (if empty, non-battle area)&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Encounter Rate&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; The area is automatically added to the system. &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Player can add event and script them as necessary&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Regular players cannot modify &lt;span style="text-decoration: underline;"&gt;stats&lt;/span&gt;.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Only an &lt;span style="text-decoration: underline;"&gt;admin&lt;/span&gt; can link the outside world to you.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; You can ask to be &lt;span style="text-decoration: underline;"&gt;teleport&lt;/span&gt; into your created areas.&amp;nbsp; When done you can ask to be returned to your previous position.&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Needed Features:&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Upload character sets. (OPTIONAL)&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Create item&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; For fast scripting:&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A list of switches (filter by 'created_by_you', 'system_switches')&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A list of items (filter by 'created_by you', 'system_generic_items', 'created_by_others'&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Areas must be able to be deleted!!!&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px; min-height: 15px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Scripting (Pseudo-code):&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /*********************************************************************************************************************/ &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;//&lt;span style="text-decoration: underline;"&gt;Merch&lt;/span&gt; Area Trader - 10x Small Wolf Claw Quest&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;//Go to the forest, collect 10 wolf claws and come back and i'll give you a red pin&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px; min-height: 15px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;if (checkSwitch(25)) //quest_finished_yn&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;{&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; //player already finished this quest&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; message("Hey, how u liking that pin?");&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; return;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;}&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px; min-height: 15px;"&gt;&lt;br /&gt;&amp;nbsp;if (checkSwitch(24)) //10x wolf claw quest&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;{ &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; //player has accepted this quest, check the status...&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="text-decoration: underline;"&gt;var&lt;/span&gt; nWolfClaws = getItemCount(1005); //number of &lt;span style="text-decoration: underline;"&gt;walf&lt;/span&gt; claws collected&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if (nWolfClaws &amp;gt;= 10) //small wolf claw&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //the player has collected the necessary amount of claws...&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setSwitch(25, true); //quest_finished_yn&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addItem(1006, 1); //add 1 red pin item, created by me&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; message("Well done!&amp;nbsp; You've earned this pin!");&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;}&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;else&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;{&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; //player has NOT accepted this quest...&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; message("Man I need me some wolf claws, go fetch me 10 claws and I'll give you this shiny ribbon!");&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="text-decoration: underline;"&gt;var&lt;/span&gt; response = choice("Do you accept this quest");&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if (response == true)&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//player has accepted the quest....&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setSwitch(24, 10); //10x_wolf_quest&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;message("Great!&amp;nbsp; Good luck!");&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//player didn't accept the quest...&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;message("Fine then...");&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style="font: 11px Monaco; margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /*********************************************************************************************************************/ &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I want to make map making as easy as possible. &amp;nbsp;Event/NPC making will be way more difficult. &amp;nbsp;It'll be scripting based. &amp;nbsp;The cool thing is you should be able to create areas, modify, and test them using the master server with the android client. &amp;nbsp;Once approved these areas can become part of the larger world and story.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The scripting will be very RM2K/RMXP inspired and powered by Javascript, so hopefully it'll be easy to use. &amp;nbsp;I'm guessing the most challenging aspects will be the new territory such as scripting in a multiplayer context.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With this detour there is going to be a significant delay in the release of the game, however there should be no reason this can't be achieved in a reasonable amount of time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'd be interested to hear any thoughts on this!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;br /&gt;Here's some snapshots of the work in progress:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TMUub_v3L9I/AAAAAAAAAG4/MvKs9JNXXjg/s1600/map_editor_2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TMUub_v3L9I/AAAAAAAAAG4/MvKs9JNXXjg/s320/map_editor_2.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TMUuiGOtX2I/AAAAAAAAAG8/fLtGAHa398I/s1600/map_editor_3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TMUuiGOtX2I/AAAAAAAAAG8/fLtGAHa398I/s320/map_editor_3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&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/9181939064927126715-1149875439059692347?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/1149875439059692347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/10/player-map-making-in-browser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1149875439059692347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1149875439059692347'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/10/player-map-making-in-browser.html' title='Player Map Making in the Browser'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Vtq6sCdzyKs/TMUub_v3L9I/AAAAAAAAAG4/MvKs9JNXXjg/s72-c/map_editor_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-6264753034298569932</id><published>2010-10-11T11:07:00.000-07:00</published><updated>2010-10-13T02:31:37.588-07:00</updated><title type='text'>FunShot, Making Maps</title><content type='html'>For the next few months or so I'll mainly be working on adding some content to the game.&lt;br /&gt;Mainly making tilesets, prototyping the maps in RPG Maker XP, creating the maps in my own custom editor.&lt;br /&gt;After that I have to work on adding quests and adding more features to the scripting system for this.&lt;br /&gt;Getting close to a release. &amp;nbsp;Stay Tuned.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TLNSHlqNNpI/AAAAAAAAAGc/sAvraic4jsc/s1600/Picture+2.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TLNSHlqNNpI/AAAAAAAAAGc/sAvraic4jsc/s320/Picture+2.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TLNSrFpI-0I/AAAAAAAAAGg/eR34ex9RGQA/s1600/device.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TLNSrFpI-0I/AAAAAAAAAGg/eR34ex9RGQA/s320/device.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-6264753034298569932?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/6264753034298569932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/10/funshot-making-maps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6264753034298569932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6264753034298569932'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/10/funshot-making-maps.html' title='FunShot, Making Maps'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Vtq6sCdzyKs/TLNSHlqNNpI/AAAAAAAAAGc/sAvraic4jsc/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-2100308084843659682</id><published>2010-10-08T04:54:00.000-07:00</published><updated>2010-10-08T05:02:19.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rabbitmq'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='diagram'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Technical Diagram 1A</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;I was bored so I thought I'd map out the game's network architecture. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Each component in itself is complex. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;This is the most basic diagram with the server running in a single machine. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;However, it should be fairly easy to decouple each component into separate servers and scale as necessary. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Anyway, now I'm working on creating tilesets to continue mapping the game.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The SolomonRPG game engine is at version 0.3. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;It's solid and stable enough where I can finally concentrate on adding and creating the content!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TK8Fooqqt9I/AAAAAAAAAGY/AdcMq7zxYUA/s1600/solomon_single_server.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TK8Fooqqt9I/AAAAAAAAAGY/AdcMq7zxYUA/s320/solomon_single_server.png" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-2100308084843659682?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/2100308084843659682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/10/technical-diagram-1a.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/2100308084843659682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/2100308084843659682'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/10/technical-diagram-1a.html' title='Technical Diagram 1A'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Vtq6sCdzyKs/TK8Fooqqt9I/AAAAAAAAAGY/AdcMq7zxYUA/s72-c/solomon_single_server.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-796482623771403258</id><published>2010-10-05T03:20:00.000-07:00</published><updated>2010-10-08T05:29:01.873-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><category scheme='http://www.blogger.com/atom/ns#' term='battle'/><title type='text'>Fun Shot, 3 A.M.</title><content type='html'>Just working on the battle system...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TKr741XZ7NI/AAAAAAAAAGU/4ABLXeNUBQ0/s1600/shark_attack.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TKr741XZ7NI/AAAAAAAAAGU/4ABLXeNUBQ0/s320/shark_attack.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-796482623771403258?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/796482623771403258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/10/fun-shot-3-am.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/796482623771403258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/796482623771403258'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/10/fun-shot-3-am.html' title='Fun Shot, 3 A.M.'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TKr741XZ7NI/AAAAAAAAAGU/4ABLXeNUBQ0/s72-c/shark_attack.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-6676009199745057507</id><published>2010-08-03T09:59:00.000-07:00</published><updated>2010-08-04T04:41:53.412-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang rabbitmq development linux'/><title type='text'>Setting Up a Queue Consumer with RabbitMQ's Erlang Client</title><content type='html'>Ok, so in this post I will outline how to set up a consumer using the rabbitmq erlang client.&lt;br /&gt;&lt;br /&gt;We'll start with a basic chat server in which clients can post and listen for messages.&lt;br /&gt;Continuing from my last post: &lt;a href="http://developingthedream.blogspot.com/2009/10/rabbitmq-erlang-client-yay.html"&gt;http://developingthedream.blogspot.com/2009/10/rabbitmq-erlang-client-yay.html&lt;/a&gt;&lt;br /&gt;You now have a basic project skeleton to start building your server.&amp;nbsp; We'll call the project chat_server.&lt;br /&gt;&lt;br /&gt;I followed this blog post &lt;a href="http://mutlix.blogspot.com/2007/10/amqp-in-10-mins-part3-flexible-routing.html"&gt;http://mutlix.blogspot.com/2007/10/amqp-in-10-mins-part3-flexible-routing.html&lt;/a&gt; for a visual representation of the AMQP specs, &lt;br /&gt;although it's outdated the basics are the same.&lt;br /&gt;&lt;br /&gt;So, the project would look like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="background-color: #f3f3f3;"&gt;chat_server/&lt;br /&gt;chat_server/db&lt;br /&gt;chat_server/deps&lt;br /&gt;chat_server/ebin&lt;br /&gt;chat_server/include&lt;br /&gt;chat_server/src&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now inside the src/ directory, we'll create these files:&lt;br /&gt;&amp;nbsp;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;src/master.erl&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;src/chat_server.erl&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;src/test_client.erl&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I made a mistake in my last blog post regarding how to properly symlink the rabbitmq dependencies.&lt;br /&gt;Unlink any previously created symlinks:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;unlink /usr/lib/erlang/lib/rabbitmq_common&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;unlink /usr/lib/erlang/lib/rabbitmq_erlang_client&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now create some symlinks in the deps folder:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;cd deps&lt;/span&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;ln -s rabbitmq-server/ rabbit_common&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;ln -s rabbitmq-erlang-client/ rabbitmq_erlang_client&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's the content of the Makefile we'll be using.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;.SUFFIXES: .erl .beam&lt;br /&gt;&lt;br /&gt;.erl.beam:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; erlc -W $&amp;lt;&lt;br /&gt;&lt;br /&gt;ARGS = -pa ebin \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -pa deps/rabbit_common/ebin \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -pa deps/rabbitmq_erlang_client/ebin \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -boot start_sasl -s rabbit&lt;br /&gt;&lt;br /&gt;ERL = erl ${ARGS}&lt;br /&gt;ERLC = erlc -I . -I deps +debug_info -o ebin&lt;br /&gt;&lt;br /&gt;MODS = src/master.erl src/chat_server.erl src/test_client.erl&lt;br /&gt;&lt;br /&gt;all: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ${ERLC} ${MODS}&lt;br /&gt;&lt;br /&gt;run: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ${ERL}&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm -rf *.beam ebin/*.beam src/*.beam erl_crash.dump&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;       &lt;/span&gt;&lt;br /&gt;We'll start with the master.erl file which basically sets up the exchange, queues, etc. &lt;br /&gt;Mainly bootstraps the server.&lt;br /&gt;Here is the content of master.erl:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;-module(master).&lt;br /&gt;-include_lib("deps/rabbitmq_erlang_client/include/amqp_client.hrl").&lt;br /&gt;&lt;br /&gt;-export([start/0]). &lt;br /&gt;&lt;br /&gt;start() -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RID = amqp_connection:start_direct(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channel = amqp_connection:open_channel(RID),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; X = &amp;lt;&amp;lt;"global_chat_exchange"&amp;gt;&amp;gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Q = &amp;lt;&amp;lt;"global_message_queue"&amp;gt;&amp;gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Key = &amp;lt;&amp;lt;"global_message_queue_publish_key"&amp;gt;&amp;gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %%our routing key, all clients have this&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:call(Channel, #'exchange.declare'{exchange = X, type = &amp;lt;&amp;lt;"topic"&amp;gt;&amp;gt;, nowait = true}),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:call(Channel, #'queue.declare'{queue = Q}),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:call(Channel, #'queue.bind'{queue = Q, exchange = X, routing_key = Key}),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io:fwrite("bound queue: ~p to exchange: ~p using key: ~p~n", [Q, X, Key]),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:close(Channel),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_connection:close(RID).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;    &lt;/span&gt;&lt;br /&gt;Here's the breakdown of the start() function. &lt;br /&gt;I'm not doing any sort of error checking, take a look at deps/rabbitmq_erlang_client/test/test_util.erl&lt;br /&gt;for more complete code.&lt;br /&gt;&lt;br /&gt;First, we connect to rabbitmq.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;RID = amqp_connection:start_direct(),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We simply call start_direct in the amqp_connection module and receive the connection id.&amp;nbsp; (this is just the id of an erlang process)&lt;br /&gt;Next, we open a channel which is pretty straightforward.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Channel = amqp_connection:open_channel(Pid),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Afterward, we bind the queue to the exchange using a routing key.&lt;br /&gt;&lt;br /&gt;So here's our names:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;X = &amp;lt;&amp;lt;"global_chat_exchange"&amp;gt;&amp;gt;, &lt;br /&gt;Q = &amp;lt;&amp;lt;"global_message_queue"&amp;gt;&amp;gt;, &lt;br /&gt;Key = &amp;lt;&amp;lt;"mysecret"&amp;gt;&amp;gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %%our routing key, all clients have this&lt;br /&gt;&lt;br /&gt;amqp_channel:call(Channel, #'exchange.declare'{exchange = X, type = &amp;lt;&amp;lt;"topic"&amp;gt;&amp;gt;, nowait = true}),&lt;br /&gt;amqp_channel:call(Channel, #'queue.declare'{queue = Q}),&lt;br /&gt;amqp_channel:call(Channel, #'queue.bind'{queue = Q, exchange = X, routing_key = RoutingKey}),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Here we tell the erlang rabbitmq client to declare the exchange. &lt;br /&gt;You can look at the file: deps/rabbit_common/include/rabbit_framing.hrl for all the record definitions.&lt;br /&gt;You can specify things such as the exchange type and other things.&lt;br /&gt;&lt;br /&gt;Now, first we'll start by compiling this module manually to go over the erlang shell.&lt;br /&gt;Run '&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;make run&lt;/span&gt;&lt;/span&gt;' to start the rabbitmq server.&amp;nbsp; You'll be greeted with the shell.&lt;br /&gt;Compile the master module by typing:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;c('src/master').&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can now run the code like so:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;master:setup().&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we're ready to start consuming messages.&amp;nbsp; So, the content of the first draft of chat_server.erl is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;-module(chat_server).&lt;br /&gt;-include_lib("rabbitmq_erlang_client/include/amqp_client.hrl").&lt;br /&gt;-compile(export_all).&lt;br /&gt;&lt;br /&gt;start() -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RID = amqp_connection:start_direct(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channel = amqp_connection:open_channel(RID),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Queue = &amp;lt;&amp;lt;"global_message_queue"&amp;gt;&amp;gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spawn( fun() -&amp;gt; consume_loop(RID, Channel, Queue) end ),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self().&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;consume_loop(RID, Channel, Q) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:subscribe(Channel, #'basic.consume'{queue = Q}, self()),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; receive&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #'basic.consume_ok'{} -&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; io:fwrite("subscribed to queue: ~p listening for messages...~n", [Q])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; receive&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {#'basic.deliver'{delivery_tag=Tag}, Content} -&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; amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),&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; handle_message(RID, Channel, Content),&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; consume_loop(RID, Channel, Q);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unknown -&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; io:fwrite("unknown message: ~p tearing down~n", [Unknown]),&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; teardown(RID, Channel)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end.&lt;br /&gt;&lt;br /&gt;handle_message(RID, Channel, Content) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io:fwrite("got message: ~p from pid: ~p on channel: ~p ~n", [RID, Channel, Content]),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; todo.&lt;br /&gt;&lt;br /&gt;teardown(RID, Channel) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:close(Channel),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_connection:close(RID).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;   &lt;/span&gt;&lt;br /&gt;Here we open a channel and spawn a process to consume messages from the 'global_message_queue' queue.&lt;br /&gt;You've seen the start of the code in master.erl.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Queue = &amp;lt;&amp;lt;"global_message_queue"&amp;gt;&amp;gt;,&amp;nbsp;&amp;nbsp; %%Here we declare the queue name to be passed around&lt;br /&gt;spawn( fun() -&amp;gt; consume_loop(RID, Channel, Queue) end ),&amp;nbsp;&amp;nbsp;&amp;nbsp; %%spawn a process and return immediately&lt;br /&gt;self().&amp;nbsp; %%return our process id (unused)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;Here we spawn a process that loops forever consuming messages from the 'global_message_queue'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;consume_loop(RID, Channel, Q) -&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:subscribe(Channel, #'basic.consume'{queue = Q}, self()),&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; receive&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #'basic.consume_ok'{} -&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; io:fwrite("subscribed to queue: ~p listening for messages...~n", [Q])&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;Here, we start the loop by telling the server that we're ready to consume on the queue 'Q' by calling amqp_channel:subscribe.&lt;br /&gt;We immediately recieve a confirmation message and continue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp; receive&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {#'basic.deliver'{delivery_tag=Tag}, Content} -&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We wait for an erlang type message which contains a valid amqp message.&lt;br /&gt;We save the payload to the variable 'Content' and the delivery tag to 'Tag'.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We immediately acknowledge that we've received the message.&lt;br /&gt;You may wish to move this after you've processed the message.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;handle_message(RID, Channel, Content),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; consume_loop(RID, Channel, Q);&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;We send the content to the handle_message() function and then loop again to wait for messages again.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt; Unknown -&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; io:fwrite("unknown message: ~p tearing down~n", [Unknown]),&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; teardown(RID, Channel)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If we get an unknown message for any reason we exit and tear down the channel and connection.&lt;br /&gt;The&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;handle_message()&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;function simply prints the content of the message to the screen.&lt;br /&gt;&lt;br /&gt;Now you can compile the module like so:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;c('src/chat_server').&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Start the consumer process by typing:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;chat_server:start().&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we can start publishing messages, this is the content of test_client.erl:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;-module(test_client).&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;-include_lib("deps/rabbitmq_erlang_client/include/amqp_client.hrl").&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;-export([say/1]). &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;say(Msg) -&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RID = amqp_connection:start_direct(),&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channel = amqp_connection:open_channel(RID),&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; X = &amp;lt;&amp;lt;"global_chat_exchange"&amp;gt;&amp;gt;,&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Key = &amp;lt;&amp;lt;"global_message_queue_publish_key"&amp;gt;&amp;gt;,&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Packet = list_to_binary(Msg),&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Publish = #'basic.publish'{exchange = X, routing_key = Key, mandatory=true, immediate=false},&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:call(Channel, Publish, #amqp_msg{payload = Packet}),&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:close(Channel),&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_connection:close(RID).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First we turn the message into a binary for delivery:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Packet = list_to_binary(Msg),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here we simply turn the message to a binary.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt; Publish = #'basic.publish'{exchange = X, routing_key = Key, mandatory=true, immediate=false},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amqp_channel:cast(Channel, Publish, #amqp_msg{payload = Packet}),&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;First, we declare a variable 'Publish' which sets up the publish options.&lt;br /&gt;Then we call 'cast' instead of 'call' simply because we WANT to wait for the message to be published.&lt;br /&gt;The reason we want to wait is because we immediately close the channel.&lt;br /&gt;&lt;br /&gt;Now you can compile the module by running:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;c('src/test_client').&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And test it by running:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;test_client:say("hello world!").&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You should now see the output from your consumers which have read the message.&lt;br /&gt;&lt;br /&gt;This concludes this introduction to using the rabbitmq-erlang client. &lt;br /&gt;You can find the full test project available at: &lt;a href="http://github.com/therevoltingx/chat_server"&gt;http://github.com/therevoltingx/chat_server&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Any comments, questions, etc are welcomed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-6676009199745057507?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/6676009199745057507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/08/setting-up-queue-consumer-with.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6676009199745057507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6676009199745057507'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/08/setting-up-queue-consumer-with.html' title='Setting Up a Queue Consumer with RabbitMQ&apos;s Erlang Client'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-7875200016219418687</id><published>2010-07-28T19:53:00.000-07:00</published><updated>2010-08-12T04:28:35.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='story'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Fun Shot! #2</title><content type='html'>Hi all, here's a snapshot of notes on the battle system UI flow.&lt;br /&gt;&lt;br /&gt;Enjoi!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TFDs3er5z0I/AAAAAAAAAGE/1IAM5calTsQ/s1600/2010-07-28+19.46.42.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TFDs3er5z0I/AAAAAAAAAGE/1IAM5calTsQ/s200/2010-07-28+19.46.42.jpg" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-7875200016219418687?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/7875200016219418687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/07/fun-shot-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7875200016219418687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7875200016219418687'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/07/fun-shot-2.html' title='Fun Shot! #2'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Vtq6sCdzyKs/TFDs3er5z0I/AAAAAAAAAGE/1IAM5calTsQ/s72-c/2010-07-28+19.46.42.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-3332413325933741737</id><published>2010-07-22T09:18:00.000-07:00</published><updated>2010-07-23T03:31:41.381-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rm2k'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='team'/><category scheme='http://www.blogger.com/atom/ns#' term='chat'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><category scheme='http://www.blogger.com/atom/ns#' term='battle'/><title type='text'>As The Grind Continues</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;After releasing a super alpha version of the game so far, I've just been grinding along.&lt;br /&gt;Nothing entirely interesting has happened in the last month, here are some of the things improved and/or added:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stabilized name display and tile animation&lt;/li&gt;&lt;li&gt;Added team functionality&lt;/li&gt;&lt;li&gt;Added personal messaging functionality&lt;/li&gt;&lt;li&gt;Battle against monsters [Draft]&lt;/li&gt;&lt;/ul&gt;The most tedious part was starting the battle system, i turned to rpg maker 2000 again for inspiration.&lt;br /&gt;Fusing together its old school battle system with my own vision of the game (and with the limitations of man power and working with Android.)&lt;br /&gt;Battling is turn based, like an animated card game. &lt;br /&gt;Each player or monster takes a turn. (Attack, Defend, Special Attack, etc)&lt;br /&gt;Everyone takes turns, according to different stats, damage is dealt and players are chosen for attack. &amp;nbsp;(Level, Speed, Defense, etc)&lt;br /&gt;An animation is played for each attack and players can attack or do things like defend or use items.&lt;br /&gt;&lt;br /&gt;At this point many things are finished, but the battle system is still in a rough stage.&lt;br /&gt;I've gone to pains to keep a clean code base though, so I can tweak the settings as I see fit.&lt;br /&gt;So far, for the battle system I've written:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Erlang:&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;A single module/process handles all the battle systems such as creating the message queues.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Periodically stores to global database and keeps track of handling turns&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Stores and executes monster battling action patterns&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Waits and notifies players when a turn is taken&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; (566 lines of code.)&lt;/li&gt;&lt;li&gt;Java/Android:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;A dialog activity is launched when it's notified a battle has started&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Bootstraps battle UI, downloads resources accordingly&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Listens for events and displays battle animations&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Have the player select a monster and take attack, etc. (TODO)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;The main class is 481 lines of code so far, but a lot of code is in its own class, and I'm lazy.&lt;/li&gt;&lt;li&gt;Perl/HTML/SQL:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Add data schemas for new battle system components (attacks, teams, monsters, battles, etc)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Add to the existing admin functionality the necessary components&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;This includes a web UI for managing: monsters, parties, attacks, backdrops, etc.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;The Client-&amp;gt;Server Battle module is only 63 lines so far.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;The Admin-&amp;gt;Monster Management module is 263 lines, (fairly complete.)&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;There is still plenty of work to be done, no one said it would be easy. &amp;nbsp;I think the battle system is one of the most challenging aspects of making any game. &amp;nbsp;I hate math :p&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TEhtXxM4YUI/AAAAAAAAAD0/eRrVqetT6Ko/s1600/Picture+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TEhtXxM4YUI/AAAAAAAAAD0/eRrVqetT6Ko/s200/Picture+3.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TEhtoi2pNTI/AAAAAAAAAEE/nvR7ygPtqRg/s1600/Picture+6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://2.bp.blogspot.com/_Vtq6sCdzyKs/TEhtoi2pNTI/AAAAAAAAAEE/nvR7ygPtqRg/s200/Picture+6.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TEht1uW3PDI/AAAAAAAAAEM/XE5lmMYJQeI/s1600/Picture+7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TEht1uW3PDI/AAAAAAAAAEM/XE5lmMYJQeI/s200/Picture+7.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TEht8GqGIMI/AAAAAAAAAEU/gkytSX-8Yh4/s1600/battle_alpha2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TEht8GqGIMI/AAAAAAAAAEU/gkytSX-8Yh4/s200/battle_alpha2.png" width="133" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TEhxqENu8rI/AAAAAAAAAEc/Gd3ovSAdg9I/s1600/looking_left.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TEhxqENu8rI/AAAAAAAAAEc/Gd3ovSAdg9I/s200/looking_left.png" width="133" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEhx4NKc6ZI/AAAAAAAAAEk/-tvPpV0Eqps/s1600/send_message_draft.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEhx4NKc6ZI/AAAAAAAAAEk/-tvPpV0Eqps/s200/send_message_draft.png" width="133" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TEhztIyRtbI/AAAAAAAAAE0/oaZXHQN4Bnw/s1600/Picture+9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TEhztIyRtbI/AAAAAAAAAE0/oaZXHQN4Bnw/s200/Picture+9.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&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/9181939064927126715-3332413325933741737?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/3332413325933741737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/07/as-grind-continues.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3332413325933741737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3332413325933741737'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/07/as-grind-continues.html' title='As The Grind Continues'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vtq6sCdzyKs/TEhtXxM4YUI/AAAAAAAAAD0/eRrVqetT6Ko/s72-c/Picture+3.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-1587303657620182865</id><published>2010-06-21T23:36:00.000-07:00</published><updated>2010-10-24T14:59:08.767-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='features'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='apk'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='g1'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Super Alpha Test (Tech Demo)</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TCFK5n1_uWI/AAAAAAAAADY/bxAhRsRHPLY/s1600/ingame.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5485748174922430818" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/TCFK5n1_uWI/AAAAAAAAADY/bxAhRsRHPLY/s200/ingame.png" style="cursor: pointer; float: right; height: 200px; margin: 0pt 0pt 10px 10px; width: 134px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TCFKucWLi_I/AAAAAAAAADQ/J9IzAneHPoI/s1600/login.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5485747982857636850" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/TCFKucWLi_I/AAAAAAAAADQ/J9IzAneHPoI/s200/login.png" style="cursor: pointer; float: right; height: 200px; margin: 0pt 0pt 10px 10px; width: 134px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TCFKp5I8LTI/AAAAAAAAADI/-4q5aHVxUTc/s1600/signup.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5485747904687385906" src="http://3.bp.blogspot.com/_Vtq6sCdzyKs/TCFKp5I8LTI/AAAAAAAAADI/-4q5aHVxUTc/s200/signup.png" style="cursor: pointer; float: right; height: 200px; margin: 0pt 0pt 10px 10px; width: 134px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt;&amp;nbsp; Due to major updates in the server, this client no longer works.&amp;nbsp; Stay tuned for further releases!&lt;br /&gt;&lt;br /&gt;Hi all,&lt;br /&gt;Today I am releasing a super alpha version of the game so far.&lt;br /&gt;However, it's still not much of a game.  This is more like a tech demo.&lt;br /&gt;This is mainly to get some very early feedback on what I've got so far,&lt;br /&gt;to gauge the interest in it.&lt;br /&gt;I also hope to pull in a bunch of testers to help me further develop the multiplayer aspect of the game.&lt;br /&gt;&lt;br /&gt;Please note that it's still really buggy and unpolished, I also don't have a production server and am using my development server.&lt;br /&gt;So expect plenty of downtimes and broken server communication.  &lt;br /&gt;Also, the game was developed with an Android 1.5 (stock G1) and doesn't fully work with 2.0+ just yet.&lt;br /&gt;Make sure you have TasKiller ready, you'll need it.&lt;br /&gt;&lt;br /&gt;So with that said:&lt;br /&gt;You can download the latest alpha apk &lt;a href="http://diastrofunk.com/downloads/SolomonRPG-debug.apk"&gt;here&lt;/a&gt;.&lt;br /&gt;Use the signup word: '&lt;b&gt;douchebag&lt;/b&gt;'&lt;br /&gt;&lt;br /&gt;Features so far:&lt;br /&gt;Signing up for an account&lt;br /&gt;Camera movement via trackball&lt;br /&gt;Touch based movement, click on the tile where you want to move to.&lt;br /&gt;Area to area teleportation, just step over some of the NPCs and you'll get teleported.  (not polished)&lt;br /&gt;NPC/Event/Player activation.  Long touch a player or npc for the player menu to come up.&lt;br /&gt;Tile animation, check out the water move.&lt;br /&gt;Remote player display and movement (not fully polished)&lt;br /&gt;Character name display (though it hurts FPS, it'll be optional)&lt;br /&gt;Zone chat&lt;br /&gt;All multiplayer enabled&lt;br /&gt;&lt;br /&gt;Feedback, Comments, Questions, Testers, etc:&lt;br /&gt;therevoltingx@gmail.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-1587303657620182865?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/1587303657620182865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/06/super-alpha-test-tech-demo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1587303657620182865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1587303657620182865'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/06/super-alpha-test-tech-demo.html' title='Super Alpha Test (Tech Demo)'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Vtq6sCdzyKs/TCFK5n1_uWI/AAAAAAAAADY/bxAhRsRHPLY/s72-c/ingame.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-7322797980324591537</id><published>2010-05-21T14:59:00.000-07:00</published><updated>2010-07-23T03:29:10.351-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='g1'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Fun Shot!</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/S_cEd5ywlHI/AAAAAAAAACc/mHwT4gdsdhQ/s1600/device.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5473848783868564594" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/S_cEd5ywlHI/AAAAAAAAACc/mHwT4gdsdhQ/s200/device.png" style="cursor: hand; cursor: pointer; float: right; height: 200px; margin: 0 0 10px 10px; width: 134px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/S_cEda7td7I/AAAAAAAAACU/TMGS1nBvoX8/s1600/breathedit.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5473848775584610226" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/S_cEda7td7I/AAAAAAAAACU/TMGS1nBvoX8/s200/breathedit.png" style="cursor: hand; cursor: pointer; float: right; height: 125px; margin: 0 0 10px 10px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;Pressing forward, I've added a few features to my custom map editor for my game.  &lt;br /&gt;Including:&lt;br /&gt;* Better toolbar icons (for the meantime)&lt;br /&gt;* Muti-tile select/paint&lt;br /&gt;* Eraser&lt;br /&gt;* Area/Layer Clear&lt;br /&gt;* Layer VIew Toggling - Alpha blending support in wxWidgets is weak :-( &lt;br /&gt;* Toggle view grid and tile indexing/numbers information&lt;br /&gt;&lt;br /&gt;This will help me make maps for the game.  &lt;br /&gt;I've also started to use the excellent &lt;a href="http://rpg-palace.com/downloads/details.php?id=102"&gt;Inquisitor RMXP tileset&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's a couple of shots of a map I designed using that tileset and the new features I've added.  &lt;br /&gt;Enjoi!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-7322797980324591537?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/7322797980324591537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/05/fun-shot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7322797980324591537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7322797980324591537'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/05/fun-shot.html' title='Fun Shot!'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Vtq6sCdzyKs/S_cEd5ywlHI/AAAAAAAAACc/mHwT4gdsdhQ/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-6082984650462470791</id><published>2010-05-14T23:48:00.000-07:00</published><updated>2010-07-23T03:28:20.331-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rm2k'/><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='features'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><title type='text'>On The Road to an RPG</title><content type='html'>During the past couple of weeks I've been thinking how I wanted to handle the RPG aspect of the game. &lt;br /&gt;Since I come from an RPG Maker background, I'm familiar with the event/switch system it implements.&lt;br /&gt;However, bringing this into an MMO aspect was a bit of a puzzle.  The answer turned out to be simple, and once I got all the details together I set forth into making a scripting engine for the game.&lt;br /&gt;&lt;br /&gt;The scripting engine uses JavaScript and it aims to resemble an RPG Maker functionality in script form.  &lt;br /&gt;It was also challenging figuring out how it could handle many players at once, from the rough tests it seems that i can handle the load just fine, but only time will tell.&lt;br /&gt;I'm not sure I should even be blogging about this, since it's part of the backend server and the project is not open source.&lt;br /&gt;However, I find it too exciting not to talk about.  &lt;br /&gt;&lt;br /&gt;So, now that I'm able to sew together an RPG I've started 'prototyping' the game using RPG Maker XP.&lt;br /&gt;The graphics that RMXP uses are pretty much identical to the ones I've designed to be used by my game.  This will make finding an artist and transferring ideas much easier.  &lt;br /&gt;&lt;br /&gt;There is a mountain of work to do with the software, but I'm working on it.  However, it would be great to get some help with mapping, scripting, quest designing and story brain storming.  I'm also in talks with some artists that have offered to make the art (tilesets, character sets, sprites, etc.) for the game, but nothing too serious yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-6082984650462470791?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/6082984650462470791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/05/on-road-to-rpg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6082984650462470791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/6082984650462470791'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/05/on-road-to-rpg.html' title='On The Road to an RPG'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-2742372428041095664</id><published>2010-04-22T15:18:00.000-07:00</published><updated>2010-07-23T03:25:04.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='g1'/><category scheme='http://www.blogger.com/atom/ns#' term='chat'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Let's Chat!</title><content type='html'>&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5463092938841445714" src="http://2.bp.blogspot.com/_Vtq6sCdzyKs/S9DOFUqW1VI/AAAAAAAAACM/6jsGL0P4X3o/s320/device.png" style="cursor: hand; cursor: pointer; float: right; height: 320px; margin: 0 0 10px 10px; width: 214px;" /&gt;&lt;a href="http://1.bp.blogspot.com/_Vtq6sCdzyKs/S9DM6TShx2I/AAAAAAAAACE/5ypm90dikoE/s1600/device.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5463091649982875490" src="http://1.bp.blogspot.com/_Vtq6sCdzyKs/S9DM6TShx2I/AAAAAAAAACE/5ypm90dikoE/s320/device2.png" style="cursor: hand; cursor: pointer; float: right; height: 320px; margin: 0 0 10px 10px; width: 214px;" /&gt;&lt;/a&gt;&lt;br /&gt;After taking a brief vacation, I'm back working on my game. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;I was heavily inspired by the Android game 'Pocket Empires' which I think is brilliantly designed.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Integrating the chat involved working with Perl, Erlang, and Java all at once, but I got it mostly done in less than a week.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Most of the time was wasted fiddling with the Android UI toolkit.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here's a screenshot of the rough results, of course multiplayer enabled!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-2742372428041095664?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/2742372428041095664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/04/lets-chat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/2742372428041095664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/2742372428041095664'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/04/lets-chat.html' title='Let&apos;s Chat!'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vtq6sCdzyKs/S9DOFUqW1VI/AAAAAAAAACM/6jsGL0P4X3o/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-3492871225141631785</id><published>2010-03-17T22:37:00.000-07:00</published><updated>2010-07-23T03:24:16.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='g1'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>New Client Screenshot</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_Vtq6sCdzyKs/S6G8l5sIcpI/AAAAAAAAABY/Qf1iSS7l5SQ/s1600-h/device.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5449844383422116498" src="http://3.bp.blogspot.com/_Vtq6sCdzyKs/S6G8l5sIcpI/AAAAAAAAABY/Qf1iSS7l5SQ/s320/device.png" style="cursor: hand; cursor: pointer; float: right; height: 320px; margin: 0 0 10px 10px; width: 214px;" /&gt;&lt;/a&gt;&lt;br /&gt;After a lot of work on the game's multi-player code, I've seemed to have wrapped up most things regarding real-time movement.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Though it's not perfect, it's working quite well, so I'm posting a screenshot with 3 players on the screen at the same time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Videos should be coming as soon as I get some time.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-3492871225141631785?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/3492871225141631785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/03/new-client-screenshot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3492871225141631785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3492871225141631785'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/03/new-client-screenshot.html' title='New Client Screenshot'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Vtq6sCdzyKs/S6G8l5sIcpI/AAAAAAAAABY/Qf1iSS7l5SQ/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-8761958193419077917</id><published>2010-02-19T12:24:00.000-08:00</published><updated>2010-07-23T03:23:52.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='features'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Status Report 2/19/10</title><content type='html'>So, after a good 6 months of development for my game it seems that things are coming along nicely.&lt;br /&gt;&lt;br /&gt;So here's a status of how things are going:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Android 2d Engine (Completed Features):&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Loading areas and displaying rendering to screen&lt;/li&gt;&lt;li&gt;Independent frame-rate animated tiles/sprites&lt;/li&gt;&lt;li&gt;Pixel based camera movement&lt;/li&gt;&lt;li&gt;Character/Object loading/rendering&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Android 2d Engine (Upcoming Features):&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pixel based character/movement inside the area (DONE!)&lt;/li&gt;&lt;li&gt;Character idle animation&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;Render strings. (i.e. player names/levels/status)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;C++ Area Editor (Completed Features)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Loading previously saved areas.&lt;/li&gt;&lt;li&gt;Editing and saving areas.&lt;/li&gt;&lt;li&gt;Editing tileset properties (Tileset Editor).&lt;/li&gt;&lt;li&gt;Works on Mac OS X, Linux, and Windows.&lt;/li&gt;&lt;li&gt;No immediate upcoming features.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Master Server &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;(Completed Features)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Validating users&lt;/li&gt;&lt;li&gt;Pathfinding character movement&lt;/li&gt;&lt;li&gt;Track object/character positions/status/collisions&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Master Server &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;(Upcoming Features)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Save player information&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-8761958193419077917?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/8761958193419077917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2010/02/status-report-21910.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/8761958193419077917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/8761958193419077917'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2010/02/status-report-21910.html' title='Status Report 2/19/10'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-3844457399924601835</id><published>2009-12-30T22:16:00.000-08:00</published><updated>2010-07-23T03:22:51.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='story'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Fun Shot!</title><content type='html'>Haha, here's a picture of my notes for handling movement in the game....&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/SzxCG3Ha_WI/AAAAAAAAAAc/bkalj0u6vd4/s1600-h/2009-12-30+22.14.29.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5421280737088961890" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/SzxCG3Ha_WI/AAAAAAAAAAc/bkalj0u6vd4/s320/2009-12-30+22.14.29.jpg" style="cursor: hand; cursor: pointer; float: left; height: 320px; margin: 0 10px 10px 0; width: 240px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-3844457399924601835?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/3844457399924601835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2009/12/fun-shot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3844457399924601835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3844457399924601835'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2009/12/fun-shot.html' title='Fun Shot!'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Vtq6sCdzyKs/SzxCG3Ha_WI/AAAAAAAAAAc/bkalj0u6vd4/s72-c/2009-12-30+22.14.29.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-4846497338980961330</id><published>2009-12-30T22:09:00.000-08:00</published><updated>2010-07-23T03:22:30.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='wxwidgets'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Game Editor Screenshots</title><content type='html'>And now some shots of the game editor in action....&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Vtq6sCdzyKs/SzxATQb0fpI/AAAAAAAAAAU/h6TndLVA0Nc/s1600-h/snapshot2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5421278751020580498" src="http://4.bp.blogspot.com/_Vtq6sCdzyKs/SzxATQb0fpI/AAAAAAAAAAU/h6TndLVA0Nc/s320/snapshot2.png" style="cursor: hand; cursor: pointer; float: left; height: 200px; margin: 0 10px 10px 0; width: 320px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-4846497338980961330?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/4846497338980961330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2009/12/game-editor-screenshots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/4846497338980961330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/4846497338980961330'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2009/12/game-editor-screenshots.html' title='Game Editor Screenshots'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Vtq6sCdzyKs/SzxATQb0fpI/AAAAAAAAAAU/h6TndLVA0Nc/s72-c/snapshot2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-7944971861969402731</id><published>2009-12-23T13:52:00.000-08:00</published><updated>2010-07-23T03:22:09.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><category scheme='http://www.blogger.com/atom/ns#' term='g1'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>First Client Screenshot</title><content type='html'>The first screenshot I'm uploading of my game running on an android device.  More to come soon!&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Vtq6sCdzyKs/SzKRXdKcyrI/AAAAAAAAAAM/_qBBSwTR7-s/s1600-h/device.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5418553133831604914" src="http://2.bp.blogspot.com/_Vtq6sCdzyKs/SzKRXdKcyrI/AAAAAAAAAAM/_qBBSwTR7-s/s320/device.png" style="cursor: hand; cursor: pointer; float: left; height: 320px; margin: 0 10px 10px 0; width: 214px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-7944971861969402731?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/7944971861969402731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2009/12/first-client-screenshot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7944971861969402731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7944971861969402731'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2009/12/first-client-screenshot.html' title='First Client Screenshot'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vtq6sCdzyKs/SzKRXdKcyrI/AAAAAAAAAAM/_qBBSwTR7-s/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-7986591361780768933</id><published>2009-12-22T13:34:00.000-08:00</published><updated>2010-07-23T03:21:41.178-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='g1'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android/T-Mobile G1 + Cent OS 5</title><content type='html'>Fix for udev:&lt;br /&gt;http://code.google.com/p/android/issues/detail?id=1586&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-7986591361780768933?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/7986591361780768933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2009/12/androidt-mobil-g1-cent-os-5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7986591361780768933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/7986591361780768933'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2009/12/androidt-mobil-g1-cent-os-5.html' title='Android/T-Mobile G1 + Cent OS 5'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-3335033050564337481</id><published>2009-10-09T10:25:00.000-07:00</published><updated>2010-07-23T03:20:58.628-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='non-technical'/><category scheme='http://www.blogger.com/atom/ns#' term='rm2k'/><category scheme='http://www.blogger.com/atom/ns#' term='overview'/><category scheme='http://www.blogger.com/atom/ns#' term='story'/><category scheme='http://www.blogger.com/atom/ns#' term='mmorpg'/><title type='text'>WTF Am I Doing? (Non-Technical)</title><content type='html'>Growing up as a kid I always loved T.V. shows like Pokemon, Digimon, Monster Rancher, Yu-Gi-Oh! and many others.&lt;br /&gt;&lt;br /&gt;Although I was never into the card games, I dreamed of really being able to battle monsters.&lt;br /&gt;&lt;br /&gt;So now that I'm all grown up, I haven't forgotten about my childhood dreams.  I am now a computer software developer, and it seems that I finally have the chance to make my dreams come true.&lt;br /&gt;&lt;br /&gt;With the rising of mobile computing devices it seems like the time is ripe.&lt;br /&gt;So this is what I imagine.  A digital world like Digimon, filled with 'monsters'  that people can battle against each other at any place and any time.&lt;br /&gt;&lt;br /&gt;I also envision a single (expandable) digital world, where everyone can interact with everyone else.  Where monsters roam free, and can be truly unique.  A self-sustaining world.&lt;br /&gt;&lt;br /&gt;So, how do I achieve this?  Well, I'll use the tools that are at my disposal.&lt;br /&gt;I'm choosing google's Android platform to develop the actual game.  For simplicity it's going to be 2D.  I already have the prototype ready, and am now in the process of integrating it with all the other parts.&lt;br /&gt;&lt;br /&gt;Of course I'm going to need a server side program, or God.&lt;br /&gt;The God is being written in erlang, it controls the world.  However, it really knows nothing about it.  It simply takes data in and spits data out.&lt;br /&gt;This is truly the brains of the program.&lt;br /&gt;&lt;br /&gt;I'll also need a designing program or Architect.  This is heavily inspired by programs like RPG Maker.  I remember building my own custom battle system for RM2K back in the days.  But I digress.&lt;br /&gt;&lt;br /&gt;I've already finished the prototype for the Architect as well, but there is a lot of work yet to be done.  Since this isn't particularly exciting I've only programmed it for what I need so far, but I need do add a lot more.&lt;br /&gt;&lt;br /&gt;So, I've gotten some of the basics done.  However, as some of you will know, developing a MMORPG type game is a lot of work.&lt;br /&gt;So, in the hopes of gaining a bit of extra cash I've started this blog to detail my journey.&lt;br /&gt;&lt;br /&gt;If anyone is interested in helping you can e-mail me at therevoltingx(@)gmail.com.&lt;br /&gt;I plan on making the game open-source so it can continue living when I move on to other projects. (Robots!)&lt;br /&gt;&lt;br /&gt;Don't worry, I will retro-blog all my progress so far going back to the beginning with setting up a solid 2D game engine with android.&lt;br /&gt;However, I'm concentrating on the God program at the moment, so most likely any new blog posts will be about that.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Miguel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-3335033050564337481?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/3335033050564337481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2009/10/wtf-am-i-doing-non-technical.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3335033050564337481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/3335033050564337481'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2009/10/wtf-am-i-doing-non-technical.html' title='WTF Am I Doing? (Non-Technical)'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181939064927126715.post-1708352150139727753</id><published>2009-10-07T21:33:00.000-07:00</published><updated>2010-08-03T21:43:48.733-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rabbitmq'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>RabbitMQ + Erlang Client = Yay!</title><content type='html'>&lt;b style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;UPDATE&lt;/b&gt;&lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;: Read the second part at:&amp;nbsp; &lt;/span&gt;&lt;a href="http://developingthedream.blogspot.com/2010/08/setting-up-queue-consumer-with.html" style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;http://developingthedream.blogspot.com/2010/08/setting-up-queue-consumer-with.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creating a new erlang project based on the rabbitmq erlang client.&lt;br /&gt;Please take these instructions with a giant grain of salt as I am still an erlang noob.&lt;br /&gt;This is how I got started on my CentOS 5 machine.&lt;br /&gt;I installed erlang via yum.&lt;br /&gt;Everything else is installed manually.&lt;br /&gt;&lt;br /&gt;First, create a proper folder structure for the new project.  This seems to be pretty standard in some of the erlang projects I've seen so far:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;project/&lt;br /&gt;project/db/&lt;br /&gt;project/deps/&lt;br /&gt;project/ebin/&lt;br /&gt;project/include/&lt;br /&gt;project/src/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then install the latest version of rabbitmq and the rabbitmq erlang client like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd deps&lt;br /&gt;hg clone http://hg.rabbitmq.com/rabbitmq-server&lt;br /&gt;hg clone http://hg.rabbitmq.com/rabbitmq-codegen&lt;br /&gt;hg clone http://hg.rabbitmq.com/rabbitmq-erlang-client&lt;br /&gt;cd rabbitmq-server &amp;amp;&amp;amp; make &amp;amp;&amp;amp; cd ..&lt;br /&gt;cd rabbitmq-erlang-client &amp;amp;&amp;amp; make &amp;amp;&amp;amp; cd ..&lt;br /&gt;ln -s /path/to/project/deps/rabbitmq-server/ /usr/lib/erlang/lib/rabbitmq_common&lt;br /&gt;ln -s /path/to/project/deps/rabbitmq-server/ /usr/lib/erlang/lib/rabbitmq_erlang_client&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This downloads and builds rabbitmq and the erlang client to the project's deps/ directory.&lt;br /&gt;Then it links it to erlang's lib directory.&lt;br /&gt;&lt;br /&gt;Now it's time to create a makefile to simplify building the code.&lt;br /&gt;&lt;br /&gt;Makefile.am&lt;br /&gt;&lt;pre&gt;.SUFFIXES: .erl .beam &lt;br /&gt;.erl.beam:  &lt;br /&gt;erlc -W $&amp;lt; &lt;br /&gt;&lt;br /&gt;ERL = erl -pa ebin -boot start_sasl -s rabbit -mnesia dir 'db' &lt;br /&gt;ERLC = erlc -o ebin &lt;br /&gt;MODS = src/consumer.erl &lt;br /&gt;all:  &lt;br /&gt;${ERLC} ${MODS} &lt;br /&gt;run:  &lt;br /&gt;${ERL} &lt;br /&gt;clean:  &lt;br /&gt;rm -rf ebin/*.beam erl_crash.dump &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now we're ready to go and write a consumer using the erlang client, coming up next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181939064927126715-1708352150139727753?l=developingthedream.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developingthedream.blogspot.com/feeds/1708352150139727753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://developingthedream.blogspot.com/2009/10/rabbitmq-erlang-client-yay.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1708352150139727753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181939064927126715/posts/default/1708352150139727753'/><link rel='alternate' type='text/html' href='http://developingthedream.blogspot.com/2009/10/rabbitmq-erlang-client-yay.html' title='RabbitMQ + Erlang Client = Yay!'/><author><name>Miguel Morales</name><uri>http://www.blogger.com/profile/01917683791439081788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Vtq6sCdzyKs/TEocgT6phRI/AAAAAAAAAFk/aiER9Q7bC18/S220/Photo+11.jpg'/></author><thr:total>2</thr:total></entry></feed>
