BEHIND THE SCENES IN KRABBITWORLD

- Summary - History - Evolution - Transition -

We're coming out of an interminable dark tunnel at long last. After 10 full-time years of content development on my part and 5 years full-time (5 years part-time) of tech, programming, animation etc. on Dean's part, over several Krabbit games we are going into hobby dev mode. No longer are we hardcore, full-time, heads down sacrificial, slaves in 24/7 crunch mode. Farewell pasty-faced cave dwelling self! Gym and sunshine, here I come!

Wearing all the hats, we two journeyed through several ambitious projects, learning as we went, and effectively completed a worthy game, though not entirely what was hoped it would become. We had, after all, as my Mom would have said, “chosen the hardest row to hoe” in making the game we wanted to play.

With too much time invested extending hobby engines and the real ones out of reach, we've finally made the leap to build our own. No longer shall we be held hostage by network or performance limitations or inaccessible source code! Thus the birth of iCauldron3D.

Depleted resources and bridled visibility for KWO have forced our hand but it's a good thing. No more isolation, new opportunities and a more healthy balanced life await. Fitness, friends and family will reclaim their proper place! Future Krabbit content will be released at a pace more relaxing for two people in their spare time. In Engrish: we're getting day jobs and all the benefits that come with! Hobby dev mode, here we come! :)



KRABBIT PREVIOUS PROJECTS LIST:

KrabbitWorld
2D multiplayer Krabbit RPG for MacOSX and Windows abandoned in 2000 for 3D, partly ported to Java for web in 2010 now online

KrabbitWorld Labyrinth
3D Peer2Peer multiplayer game for MacOSX, Windows and Linux released in 2006 with incomplete tutorial, now free to download from our web site

Krabbit Fighter
3D high poly Krabbit Fighter Game, content began development in 2007, never released
Krabbits, terrain and multiplay networking deployed to Xbox 360 and PSP

KrabbitOnline
3D online multiplayer Krabbit game partly developed in 2008 for MacOSX and Windows featuring our Attitude System now offline

KrabbitWorld Origins
Single player Action Adventure RPG for MacOSX and Windows featuring streaming content and our own DRM released in 2009 with updates



CONTENT IN DEVELOPMENT (never released)

Karrellica, the Floating Island
Heightmap used to create 3D mesh of the Floating Island. Object done. Texturing in progress. Can be used as a level and for screens and video clips.












English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

iCauldron3D Week 3  

Lots of progress was made over the past few weeks. The first week went fast, as I already had a number of things in place; mesh format, loader, animation format and loader along with complete skeleton based skinned mesh animation system. Along with the mesh loader I had already built in zip7 support for compression. The final step in adding in mesh support was to make them VBOs. I have to say I really enjoy programming on the iPhone. I've always loved embedded devices and the challenges they bring.

Week two I didn't get as much done, as I was away for 3 days, but still managed to get some things done and keep on track. During the second week it was time for base camera controls and frustum culling. I was able to use most of the camera code from previous projects so it helped to speed things along. I then implemented a 6DOF camera. Next was calculating the frustum and storing it for culling and adding support in for bounding box, spherical and simple box culling. I chose to use spherical culling for scene objects keeping the checks light and fast. Now with frustum culling in place, next was a need for scene management, in which I chose to use an Octree system. Scene objects are loaded into an Octree and just a simple box culling method can be used on the Octree to see if it's visible or not. If not visible then any objects inside assigned to it do not need to be checked for culling, again saving some CPU time. With this in place a scene of 60,000 polys was easy to handle. This is one of the levels for iKrabbit that has been seen in previous screen shots, it's a 2.5D view with enemy AI, animated main character and mounted weapons. On generation 1 device iPod I was getting 45 FPS and on generation 3 60FPS.

Next came sound. Instead of re-inventing the wheel, I was really enjoying using CocosDenshion previously, so I brought that over from Cocos2D which was written by Steve Oldmeadow. Great lightweight objective-c wrapper around openAL. As well João Caxaria supplied a SimpleAudioEngine to use with it. Next was a memory manager written by Paul Nettle. Great tool and excellent for watching memory and keeping those nasty leaks away. It's only enabled during debug builds.

Week 3. First I brought over our SQLite3 tools, used for saved games, player stats and a prefab system currently in the works. These routines have been used over the years in various projects I've worked on and are at the heart of our Database File System. I haven't decided whether to bring the DBFS into iCauldron3D yet, but it's still early.

Now it was time to go 3D. First I needed an environment in which I could drop a character in, attach a 3rd person camera to and run about. So I figured let's use that Octree to create a terrain system. So for the past two days I've been playing with the terrain system, enabling collision, character control and so forth. I tested using TRIANGLE_STRIP terrain and just TRIANGLES based terrain. Reading a heightmap is straight forward and even creating a VBO terrain. As you can imagine a straight TRIANGLES based terrain renders quite slow - around 20 FPS for a 512x512 heightmap. TRIANGLE_STRIP renders quite fast and I can just brute force render the entire terrain stored as a VBO. A 512x512 heightmap only took up 1M of RAM and rendered fast at 50 FPS on a generation 1 device, using a step of 16. This means the terrain is generated every 16th pixel of the heightmap. At a step of 8 the FPS was down to 40 and at 4 the FPS dropped to about 20 - 30. This seemed like a bit of waste though, as you can only see sections of the terrain at any one time. So the next step was to put the terrain into an Octree system. Since TRIANGLE_STRIP is a little more tricky when dealing with slicing it up into an Octree system, I went with TRIANGLES first.



This is a 512x512 heightmap with a single 1024x1024 PVR texture. The yellow lines are debugging lines to see the Octree in action. The octree can be set to a maximum poly limit per oct node, as well the maximum allowable splits. This shows 200 poly limit with a maximum split of 4. Now a straight TRIANGLES based terrain was just as fast as a TRIANGLE_STRIP based terrain. This is using a step of 8 and yields 42FPS.





English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

Why iCauldron3D?

This is a good question. Why create another iPhone / iPod touch game engine when there seems to be a number of good ones out there. Well I started by looking at iTorque3D the price is right, you get the source and it comes with an editor. It also comes with a lot of source code that you will need to familiarize yourself with. This is not a problem for one such as I... I read code better then English. To be honest I was tempted, but then I saw it was a pre-order price. Later, when talking to a colleague whose studio currently uses this for iPhone games, he assured me that you do get it right away. It's just your part of their beta. That's fair enough and I'd still be tempted if I had not started to travel down another path already.

So next I looked at SCIO2.. Great little engine. 3D has some good games out in it.. and looks nice. However it's so reliant on Blender3D for everything and being so closely tied to Blender3D, this was a turn off as we use Lightwave currently. This would mean writing a Lightwave layer and stripping out all the Blenderness.

So next on the list was Oolong. Nice engine again. Pretty bare bones. The demos are good they show up to 60,000 polys rendering at speeds of over 50 FPS. The engine is all in C++ with some Objective-C++, of course (.mm files instead of .m). It's pretty bare bones and is good to look at to learn different specifics about iPhone OpenGLES development. Documentation is lacking which isn't really a problem. Examples are good but there seems to be some core simple things missing. For example; device orientation. Most of the examples run from a left rotated device orientation, and yet this is not set in the application. You just need to tilt your device. It left me wondering why and what sort of other stuff was like this. One of the examples that attempts to use VBOs in an expensive way (uploading every draw cycle) left me wondering what else was like this. Honestly I can't complain about this engine, but I really didn't want to review all the code.

The engine which will remain nameless.. Price is insane for what it is, you must by a pro license for the main desktop engine and THEN buy a pro license for the iPhone. In Canadian dollars this will run you about 4K. The two license requirement is ridiculous, if all you want to do is iPhone development. Also you get no support and no source code. Well after my experience with our desktop game that uses this engine, I will NEVER get into an engine again where we don't have access to the source code. Memory leaks, performance problems in which I have no control over and no support to get fixed, things that if I did have access to the source I could fix easily. As well it's based on a bloated library in which they blame ALL their problems on. Well in my day as a developer, we just didn't have the excuse of blaming a library or SDK for our problems. Business side would just say "You chose it, no one held a gun to your head, so take responsibility for it and fix it". Beyond the fact this library is opensource, they can't be bothered to take responsibility for it and just shrug their shoulders and focus on PR propaganda to say how great they are. Personally if they spent that time, effort and money just improving their product it'd be much better and benefit their current customers that they ignore. Enough said...

Next I looked into Cocos2D, an excellent 2D engine, all in Objective-C, great clean coding, easy to follow, good documentation and great community. However the name says it all - Cocos"2D" and we wanted to be able to do 3D or at least 2.5D. So we thought maybe 2D would be better. So off we went. Creating sprite sheets was easy, I could use our current 3D models and export key frames to a single image and generate a sprite sheet. Though looking at all the angles we wanted, quality and so forth, we saw that it would take up less space and less memory to simply use the 3D models directly. As well creating the sprite sheets would leave some fringies which Teri had to clean up. To do all our characters in all their positions, including monsters would be time consuming and texture-wise take of up a lot of space. So down this path with Cocos2D we went. I brought in our 3D skeleton based skin meshed animation system. Next I had to bring in zip 7 compression to keep the mesh files and animation files small. So initially we were at a 30M install and with zip7 down to a 6.7M install. However this is a 2D engine, which doesn't have support for 3D transparent meshes. Sure I could hack something in and own the source code that way. But why? There are many features within Cocos2D that we just wouldn't use and re-architect Cocos2D to support 3D just started to make less sense. One of the pains I started to run into, is I had to maintain two sets of world coordinates; one for Cocos2D features and one for the 3D world. Cocos2D sets the the 2D images very far away from the camera view, which is ok if your not using lighting. But once you start introducing lighting and shaders for 3D objects it may look great on the emulator but on the device itself it looked terrible.

Now we come to iCauldron3D. None of the above engines really fit our needs and requirements to the exact specifications for the game we wish to make. As well we wanted to offer modding to our customers to extend gameplay. I've always wanted a game engine in C, no C++ no C# just the straight pure speed and power you can get from well written C code. I've been programming in C for 29 years and not just as a job but as a hobby as well. A lot of great things are made in C today, and when dealing with embedded devices you really want to get as much out of that little processor as possible. Secondly I though about other developers who do iPhone / iPod touch games more as a hobby. What if they could edit their game and levels right on the device? So while commuting to work or school or standing in a shopping mall, you could work on your game. Sure it would be lovely to have XCode right on the device, but now we're just getting a little crazy. Over the past 5 years I've developed and built on a solid custom mesh format, custom animation file format and skeleton based skinned mesh animation system. It was written all in C with the intention for cross platform development. Most of our games have focused around the features within this system; up to 32 mount points per character and 200 bones on average with up to 400 bones for high poly characters with little impact on speed performance. As an animator and programmer it as given me a unique perspective on this process and pipeline. As well I've had to write and maintain exporter plugins, converts and so on.


iCauldron3D was born. When I described the types of features we were looking at, the image of a melting pot or Cauldron came to Teri's mind and since it's aimed at iPhone / iPod and eventually iPad devices it only seemed logical to call it iCauldron3D. It's a mixing pot for game developers, to put in their ingredients for their game, light the fires of imagination, boil it up and presto like magic have a game. We decided to opensource the engine under zlib license since we have benefited from opensource projects over the years ourselves.

Being a maintainer of Irrlicht for OSX some have asked why not Irrlicht? Well to start with the person who did the initial port to iphone, sat on the code for over a year promising to contribute it back. When they finally did the code is broken. Sure I could dig though the code and fix it and deal with any other issues that may come up. But why? Sure irrlicht offers many features loads many file formats, but those are not features we want for our iPhone game. Also it's all in C++ which is fine, but does have some overhead costs. Certain performance issues would have to be dealt with (needless tight loops and too many of them). Irrlicht is great for desktop and anything that has power to run it. But it lacks in an Editor, irrEdit which seems to be dead, just doesn't cut it. And it's also Windows only, kinda pointless with iPhone developed on OSX. So to use Irrlicht would mean stripping it down and rebuilding parts specifically for iPhone in mind. But as I said before I always wanted a C based engine.


Once we launch iKrabbit we'll be uploading the source for iCauldron to SourceForge, the page is already setup, domain is already registered http://www.icauldron3d.org. Be expecting to see this launch within the next month.




English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

The Challenges of Marketing on a Zero Budget


So you made this great game, invested your life, health, pennies, and future. Now to let people know it exists. Easier said than done, my friend. Here's what we've learned so far and what we're doing about it.


Reviews & Interviews

The game industry's best kept dirty little secret

Seems the reviews and interviews done by the big sites are paid for by the game's publishers! What!!!?? We were shocked to find this out. Why does no one talk about this? It should be illegal. It's down to the power of the big publishers. Corporate corruption. The almighty dollar.


Heh! Yep, I know. And here, as a gamer you thought the reviews and interviews were real. So did we. Well somewhat. We were sure that the reviewers were doing their jobs but it wasn't until we were solicited by an online distributor for a paid video review just how much of a paid job it was. And it was a fairly small site at the fairly modest price of $500.00 USD. And if we didn't like the review we'd receive $250.00 back! Fine if you have a marketing budget.


Here's a good test. Go to a major site, read the site review for a highly positive reviewed game and look around for advertising images on that site. Are they all over the background? Is the game featured in multiple spots? Are there little animated ads popping up all over the site? Now read the site review for a similar level game but less positive reviews. Compare the purchased ad space. No contest.


Then a conversation with a games recruiter friend clued us in on the high profile site interviews. You know those interviews you see on game sites where the site journalists interview game company developers and executives? Those are also paid for by the game companies and their publishers. Kind of eliminates the idea of fair publishing and any chance for an independent team to get any visibility on a zero marketing budget. Especially with all the paid for noise out there. Apparently it's known only to industry insiders, not the little indie like us.


Had we known this was common practice we would have gone about our plan in a different way. Having begun our game and IP development journey 10 years ago, we could have started with a game review site and done real reviews. In those 10 years we'd have created our own visibility and our own platform.


Visibility is the key most important factor in the success of video games. Visibility is an expensive commodity. The passionate game developer with zero marketing budget has to get creative and super industrious to find ways to viral market.


The Game

Knowing when to stop

That's the hardest thing with an ambitious project. When is it really finished? When is there enough gameplay? Is it optimized enough? Can we get one more feature in? Should we freeze it now and make the next features downloadable content or an expansion? Problem is, once the game is done, you need 4X the amount of time it took to make it, to market it. So stop making it and start marketing it, and if you can't stop making it, at least set aside marketing time and lots of it.


Web Site

To get people interested in your game you need a web site. Gamers, reviewers and game sites all need a place to easily find out about your game. The friendlier the better. Taking the time out to build the site might not come easy so it may take a few tries.


In between game development passes we'd set aside a weekend to build a web site. We secured the domain krabbitonline.com last year to be the home site for our new Krabbit game. In a weekend we put together our first Drupal site and had a PHPBB forum hooked into it. The site was a big step up from the old KrabbitWorld site but was a bit confusing for signups.


After switching engines and going for more of the game we wanted in the first place, we tried Drupal site #2. It was closer to what we wanted but not dynamic enough. It wasn't a 'designed site' so to speak, it was really just content hacked together. This time we had videos and screenshots and character profiles accessible from the front page but it didn't show enough about the characters at a glance. And KrabbitWorld Origins is about the characters.


We then tried a new approach, following some other game site examples and put up a background with the two main characters blown up to giant size behind the latest video. And that's what it looked like. A video on top of a giant picture. Even though there was a dynamic menu at the top it still just looked like a video on top of a picture. Not inviting whatsoever.


After getting the game out, bugs fixed, new demo etc. we alloted some actual web site design time instead of just hacking content together. Thus the new dynamic web site featuring a host of custom characters, social platform and forum links, blogs, featured content, etc, etc.. Finally a more gamey web site. Improvements are still coming, including more share widgets and polls which will encourage player feedback. Now when potential gamers and reviewers visit they can easily find what they are looking for.


Page 2




English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

Creativity can be very draining.

We all love to dream, day dream, think big. And most of us love being creative. One thing we've found doing a project of this size, is being creative all the time can be very draining. And more so when it's something new, for me it's while doing these cut scenes.

To figure out each scene Teri and I discuss it, map it out. Figure out the story we want to tell in each one and how it hooks together. We even map out what happens at each stage and she helps me to get an idea for the initial camera angles. However as soon as implementation starts and I begin setting up the scene, first thing I have to do is set the first intro camera. It has to be exciting, it has to set the premise for the rest of the scene and capture the player. This is a new ability to me and takes some trial and error.

I've watched a lot of cut scenes, anime, movies, etc. I try to learn by watching those how to cut the camera angles. How long each piece should be. And most importantly how to tell a story. I play, replay, watch and finally when I'm happy with it, I move onto the next piece. I try to string a few pieces together to get a flow and feeling going. Timing it to music, key events going off to make it more dramatic. Once it's started then Teri comes in as director to see if it fits. If things linger too long or if something feels like it's missing.

I really enjoy this creative process. It's a lot of fun and a great way to express oneself. But doing it all the time can get very draining. When I feel like this, I try to watch movie, one that pulls me out of this world and into it's. We've been finding alot of foreign horror films especially can do this. Like Dead Snow, Thirst, The Abandoned, Night Watch / Day Watch, Let the Right One In, and The Host to name a few. Great films! I think we watched Dead Snow 2 or three times. Best comedy we've seen in ages is My Life in Ruins, that was just great!! Really makes me want to go to Greece.

How ever when you don't have time to take a break there are a few things I use to trug my way through it.

1) Go for walk
2) Put the mechanics of each piece together. (Setup each actor and what they need to do)
3) Go through the motions of making the scene. (Just get any old camera angle setup)
4) Listen the music for each scene over and over.
5) Watch what you have done a few times over.
6) Take a shower.

Usually by the time I've done all these steps the creatively starts to flow again and one can get the best out of each scene.





English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

New Advanced Demo and Tutorial

Being an independent studio and team of 2 people, anything we create, we try to use it for multiple things. Art assets are an easy call, as they can all be reused for advertising the product. But in creating a demo, we also wanted to use it for a tutorial in the main game. After our first two attempts at creating a demo, we decided to go back to the drawing board and see what we could come up with.

Step 1) Downloaded and reviewed many current demos, like Wet, Devil May Cry 4, etc.
Step 2) Made notes on the various demos then compared the notes for each demo.

Looking at the various demo Teri came up with the quote "Advanced Demo" and "throw you in front of the bus" factor. The current successful demos advance you into the middle of the game, at the height of the excitement factor, to really give you a good idea what you can get in the game. The other part they do is throw you into the heat of danger and force you to react, while giving you simple graphical instructions and rewards.

After seeing this in game demos, we then looked at what each game is about. What the fun factor is. In most games, it's about the game play itself or scenarios they put you in. Our game being character focused, the fun factor is playing a character in a story and playing your part. So we needed the players to experiance each character, what makes them unique, fun and cool.

So we followed the new format and created a new advanced demo and tutorial, giving the player simple instructions, time to learn some of the deep game play and then throw you into the heat of it to see how you do. As well you get a level 92 character to play, to really feel the full power of each character.

Here is a preview of what to expect! Click on the image to play the video.







English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

KWO AD The new advanced demo and how we came to the decision. It started with our regular business meeting by walking around the block.

What went wrong?

- Teri Thom

Dean had been wracking his brain trying to think how to make our demo better. We were getting terrabytes of demo downloads but not enough for decent conversion.

Frustration was mounting. Marketing on a zero budget is hard enough without your efforts falling painfully short of getting the point across. What was wrong with our current demo? So we talked about it and realized we had catered to the beginner, the casual gamer and even the indie developer of casual games because those were the communities we had been relying on for feedback.

Big mistake. True, the built in tutorial is great for new gamers but we missed the point. Our target market, the people we have designed this game for, the seasoned, hard core gamer, don't get to see anything deep or exciting about the game. So why should it hold their interest? KrabbitWorld Origins is about the characters, the Krabbits. The glimpse you get in the current demo falls grievously short.

Awesomely, I get to take credit for the direction KWO Advanced Demo has taken. :) It hit me, as we walked and talked. We need an advanced demo with basic instructions. Throw the players in front of the bus so to speak. Give them the excitement of playing a high level character, uber equipped, fully charged spells, customized with personality, deep in combat, yet provide easy and obvious instructions between the interactive segments.

Dean loved it. It had been so obvious, staring us in the face, yet we missed it. He then came up with telling the story with cut scenes preceding each interactive segment. Wouldn't take too many custom animations. We had so much already in place we could use. We're almost done. On the last scene, the last final tweaks. Can't wait to release. It's such a smashing success we're going to integrate the gameplay into the game. Extend it.





English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

I'm Dean aka Varmint, gamer of 30 years, programmer, animator, sound engineer and mix master for KrabbitWorld.

Over the years I've played many games.. First time I ever created a Varmint character was in 1981 in Might and Magic 1. My characters consisted of Varmint, Teella, Drake and Cleria. Since then I've always re-created these characters in pretty much any game I've ever played.
My game list on GameSpot
For along time I used to draw Varmint in many mini comics which can probably still be found in my old high school math books :P

Some other games where these characters have existed. Unfortunately I don't have my old Might and Magic character screens. :(


ShadowBane - Varmint


Sims 2 - Teella


Guild Wars - Teella


City of Villians - Teella


ShadowBane - Teella


Fable 2 - Teella


So it seemed only fitting when making a game, to put these characters into the game we were making.



Some people have asked me were I got my nick name from, and I've always said my mom and they of course would laugh, thinking of a mother nick naming their son Varmint. :P Well I just never told the whole story, it did come from my mom, but it's origin is from a poster she got when when visiting Disneyland as child :D Which can be seen in the poster to the right above.





English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

Who are these Krabbit bastages anyway?

Well.. there's just the two of us and we wear a lot of hats.


Google KrabbitWorld and see we've been around awhile, made a 2D KW, struggled through some indie-level 3D game engines, made 3D KWL and now 3D KWO. But that's another blog. :)

Who are we?

- Teri Thom

Hi! I'm Teri Thom. AKA Krabbo, Turbo, Krabbity, Empress-Turbo, depending on nic availability on a given dev, gamer or social forum. I do the art for KrabbitWorld and KrabbitSoft.

Just about anything you look at. 2D, 3D, GUI, models, textures, web, terrain, character design and technical - weightmapping, uvmapping, heightmaps. Pretty much an art slave, but cool thing is I get to make decisions on look and feel - lighting, color, sound, animation, game design etc. It's a pretty sweet opportunity, especially when there's time to fully implement my concepts. :)

As for XP, this winter hen has spent nigh on 10 years devving Krabbit IP, content, and promotion. Spread thin, self taught, self funded. Before KrabbitSoft I had my own graphic design company for four years. Recent months I've delved into press releases and promotional content working to get the word out about KrabbitWorld Origins.

I love ferrets and riding my bike though there's been little time for anything but Krabbits for as long as I can remember.

We've got a great story here in a fun game and we're working hard to show you just how deep and fun it is. That's our goal. Hope you stick around, join in and enjoy KrabbitWorld!





English     简体中文版     Nederlands     Français     Deutsch     Ελληνικά     Italiano     日本語     한국어     Português     По-русски    Español

KrabbitSoft Studios Inc. Copyright © 2000-2009 all rights reserved

kria's blog

Syndicate content