Wednesday, December 26, 2012
Defend Your Nuts 2 is sponsored
Defend Your Nuts 2 has been exclusively sponsored and released to the web by Nickelodeon - AddictingGames.com! Play it here!
AddictingGames is a great sponsor and I have worked with them a few times in the past. They assisted me in the final stages of the production process to ensure the game is fully playable without any major issues. Go play the game on their site, and then discover many others that they have!
Wednesday, December 19, 2012
OneGameAMonth.com
I will be participating in onegameamonth.com for all of 2013! It is a year-long event to encourage rapid and consistent creation of games basically with no rules. Currently my games consist of two-month development cycles followed downtime to test new ideas and technologies. I'd like to change all that and force myself to succeed in one game a month, potentially licensed out in Flash format, or put up in the app store.
The previous game jam taught me how to properly use placeholder art while adding and revising features at a rapid pace. Otherwise with no time pressure, I tend to conservatively revert to my traditional methods when it comes to design. Hmmm, probably this is why already I have a sequel for some of my most successful Flash games? I may resort to previous Ludum Dare themes for each month; somehow being limited by a particular theme makes me more creative.
On a related note, I am absolutely overwhelmed by the number of indie game developers that I have discovered in the midst of the recent Ludum Dare, and now this OneGameAMonth year-long event. I must have added at least a hundred developers to my Twitter, and about a dozen blogs to my Google Reader. I am so thankful to be part of this community.
Here is a clip from a documentary recently made on indie game developers. I got to watch an early showing in Asheville, North Carolina earlier this year. The DVD is available so go buy it!
Here is a clip from a documentary recently made on indie game developers. I got to watch an early showing in Asheville, North Carolina earlier this year. The DVD is available so go buy it!
Tuesday, December 18, 2012
Goat Mechanic
At the last minute I decided to participate in Ludum Dare 25 (Twitter #LD48 for 48 hour entries). If you are unfamiliar, it is a world-wide game jam - a contiguous chunk of time allocated to developers to create a game given a particular theme. In this case, it was "You are the Villain" and sub-themed with "Goat". Errhh.. probably my least favorite pick from the voting pool.
That's right.. 48 hours.. two days from start to finish. This was my second game jam and just as exhausting as my first experience. It's like if you allocate eight hours to sleep, and five hours for eating and relaxing, you are down to 35 actual hours for development. Let's see.. 35 hours.. In other words, it's equivalent to a full 40 hour work week with one hour lunch breaks on each day, all condensed down into a weekend.
..Ouch is right.
Currently over a thousand entries were submitted, so here is the strange contraption I managed to come up with called Goat Mechanic:
When presented with the theme of "You are the Villain". The kid from the movie The Good Son popped in my head. As we know, that character is almost as villainous as it gets. There was a scene of him throwing something off a bridge into traffic, so that's pretty much the idea I went with. The twist is you work for a mechanic who earns money by accidents that you cause on the roadways.
Friday was spent on the art and getting cars to move around. I resorted to Box2D and it worked out really well. I tried all this complicated math to get the cars to swerve around, but after several iterations the best solution turned out to be the easiest.. Every frame just readjust velocity to be about 90% of the car's facing direction to restrict sideways motion, and get cars to swerve by adjusting angular velocity.
On Saturday I worked on the results and shop clipboards. At this point everything was coming together, so I spent time finishing the art and functionality of the shop items. Oil spills cause cars to lose traction, beach balls bounce around, anvils are very heavy so they stop cars instantly. Basically everything can cause an accident.
On Sunday I realized there was a goat sub-theme, so I shoehorned it in with some narrative, along with an ending and preloader screen. It was submitted with a couple hours on the clock remaining.
Overall, a grand experience and I definitely forward to the next game jam!
Monday, December 10, 2012
Back to multiplayer
Thanks to Player.IO, I have been able to get a basic prototype of my next project underway. Player.IO is a multiplayer API for Flash and other engines like Unity. I dabbled with some of the tutorials back in June of this year, fascinated, but I did not go very far with it until now.
It can be a bit cumbersome to get started, and understanding the theory of server and client communication is not immediately obvious, as I have come to learn, but some articles greatly help. In a nutshell, I write all the server code in C# that receives and broadcasts packets of information, while the clients receive and send updates back to the server within the Flash application.
The server code can be compiled into a DLL, so it can be uploaded online to test on multiple computers. Otherwise, the server can be run locally for testing on the same machine.
It can be a bit cumbersome to get started, and understanding the theory of server and client communication is not immediately obvious, as I have come to learn, but some articles greatly help. In a nutshell, I write all the server code in C# that receives and broadcasts packets of information, while the clients receive and send updates back to the server within the Flash application.
The server code can be compiled into a DLL, so it can be uploaded online to test on multiple computers. Otherwise, the server can be run locally for testing on the same machine.
In this prototype I borrowed art assets from Zombie Situation, and hooked up basic WASD movement with mouse controlled shooting. This screenshot was taken with me connected to the game on three computers simultaneously. It basically has the framework I want, where players send and receive updates at 10hz while interpolating frames in between. Best of all, it works!!
Sunday, December 2, 2012
Jamming
The auction for the primary/exclusive license of Defend Your Nuts 2 will begin in the near future! In the meantime I have been doing a lot of prototyping with my new "game jam" Flash project that contains all the bare minimum systems, and utility functions that can be sprinkled here and there.
Here are some of the prototypes that I came up with...
In Stage Crew you manage the sound effects and spotlights of a live play. The audience can react depending on your timing and accuracy! For example, randomly playing a gunshot sound effect will confuse the audience and reduces their reviews of the show.
Here are some of the prototypes that I came up with...
Stage Crew |
I have moderate experiences working on sound and light back in high-school for plays. The real thrill was manipulating what hundreds of people were looking at, so of course it is hard to capture in a virtual setting.
I did not go too far with this one. It involved building a robot with different materials, including green and blue circles that rotate with the arrow keys. The gray circle represents a circular saw.
Back to the drawing board...
On a related note, I have decided to participate in Global Game Jam 2013 at NYU, located in Manhattan!
The closest site from me would be Baltimore, but that would be too much commuting for three days back to back. Actually I visit NYC many times a year, so this time I am making an "extended vacation" out of it by getting a nearby hotel room. Depending on how it goes, I may participate every year in a different city. I live way out in farm country, in a small town in Pennsylvania so it is easy to get restless at times.
Epic Gymnastics
At first I wanted to control a ragdoll-physics character on a balance beam, but it was too difficult to get him to balance and do tricks of any kind. Normally games simplify something from the real world. Here I took something that already is hard for the average person, and made it impossible!
The high-bar showed a bit more promise, because the hands are attached which removes the need to maintain any kind of balance. I played around with a lot of different controls that manipulate torque or applied force on different parts of the body. The keyboard as a primary controller does not suffice, so fake analog sticks on an iPad would have been better.
Unnamed Robot Prototype
I did not go too far with this one. It involved building a robot with different materials, including green and blue circles that rotate with the arrow keys. The gray circle represents a circular saw.
Back to the drawing board...
On a related note, I have decided to participate in Global Game Jam 2013 at NYU, located in Manhattan!
The closest site from me would be Baltimore, but that would be too much commuting for three days back to back. Actually I visit NYC many times a year, so this time I am making an "extended vacation" out of it by getting a nearby hotel room. Depending on how it goes, I may participate every year in a different city. I live way out in farm country, in a small town in Pennsylvania so it is easy to get restless at times.
Wednesday, October 31, 2012
Defend Your Nuts 2 is in beta!
No matter how big or small a project is, the last 10% always is the most grueling. Everything breaks down into bug-fixing, and tiny tasks marked up on some never ending list. Fortunately, everything really is coming together; Defend Your Nuts 2 has reached beta status! This moment comes at a convenient time, because I am taking some time off to travel.
This sequel actually has taken the same amount of time to develop, but I would say there is at least twice as much content and art. Conservatively, it follows a very similar design and blends some of the features from Zombie Situation. For example, you can find allies along the way, to help defend your nuts...
This sequel actually has taken the same amount of time to develop, but I would say there is at least twice as much content and art. Conservatively, it follows a very similar design and blends some of the features from Zombie Situation. For example, you can find allies along the way, to help defend your nuts...
Additionally, there is a boss fight on the last day of story-mode...
As I write this blog entry, I begin to notice how little sense the game makes. Well, when you have to do all the programming, art, and design, while taking advantage of assets left-over from previous projects, things can turn out a bit randomly at times. In fact, this project was not even supposed to be a sequel in the first place! Despite all this, the game is more fun than its predecessor, and could very well be my most successful Flash game to date.
Wednesday, October 10, 2012
Defend Your Nuts 2!
I am making Defend Your Nuts 2!
Okay, so it was not my initial intention to develop this sequel - things pretty much led up to this moment. Back in the middle of September, I started on a Flash game heavily inspired by a mix of games on iOS...
It was basically functional with special abilities and specific weapons all planned out. But I felt as though I was borrowing too much (environment art style and design) while only delivering a small fraction of what could otherwise be offered. With that said, I decided to scale back a bit, and develop a sequel for Defend Your Nuts.
This time you can hire bunny allies of five unique classes (healer, warrior, rogue, wizard, archer). I have removed the option of purchasing ammunition in the shop, instead replacing it with a shovel to dig up money and ammo each round. The ability to upgrade the wall will remain. Also I chose to remove the blend of modern weaponry and support a purely fantasy theme, so land mines will no longer be an option either.
Tuesday, September 18, 2012
Scratch Tickets for iOS and Android!
I am happy to announce that my latest projects, Scratch Tickets, has been released for iOS and Android devices! It is a simple scratch-off ticket app with many tickets to unlock.
Sunday, September 2, 2012
Scratch Off Tickets
Recently I received an email that my Corona membership will soon expire. Corona is the technology I used to develop my mobile games: The King's Path and Pigs Will Fly, for iOS and Android. Earlier this year, I chose not to develop mobile apps anymore, but I did have one idea that I have always wanted to try out. Better now than later!
It is a scratch off ticket app! The final touches are being made for iPhone, iPad, and Android devices. Then, it's back to Flash games, probably from now until the end of 2013. I change my mind so frequently, so no promises on that notion :)
To be honest, I really did come up with this idea while playing Slotomania, so I was disheartened upon discovering that it that it has already been done before. However, an important difference compared to the other apps is that the prize areas are revealed uniformly and there is no "Redeem" button. It is obvious when a prize is won, because the scratched area reveals a simple icon while yellow star tokens pop out and fly to the top left corner. Consequently, this feels much more interactive.
There are also instant-scratch tokens that do as the name suggests. Simply click the button to use one, and the current ticket instantly gets scratched to reveal any prizes.
The star tokens to buy tickets are redeemed for free every few hours, or can be purchased immediately through micro transactions. There are 10 tickets, where 8 need to be unlocked by scratching tickets to fill the "New Ticket" progress bar repeatedly.
The game will be released within a couple weeks.
Friday, July 27, 2012
Hotel management
It is moments like this, I wonder why I did not pursue games in the simulation and tycoon genre earlier. Perhaps seeing the success of Zombie Situation has given me the audacity to try something new and interesting. Or maybe I just got burnt out of action oriented defense games, where I noticed myself going into autopilot mode during development of Bunny Tactics. Either way, I have taken a very strong liking to this kind of design...
There is definitely a lot of temporary placeholder art being used (some borrowed from the Internet), so try to see through all that. The hotel guests can path-find to a room, or simply wander around for something interesting to buy. I am using the A* algorithm for path-finding and amazingly it works without any problems.
The overall objective is build a hotel and satisfy guests to reach a five star rating. Stars unlock additional shops and services, but also attracts guests with picky tastes and high expectations. There will be plenty of surprises along the way to break up the repetition.
Each room can be upgraded to support up to four amenities, purchased with the secondary heart currency. The quality of a room gives a greater chance to receive a heart, while popularity increases the chance that a guest will enter the room to spend money. Rooms are more pleasant if they have a good cleanliness ratio, so maids and janitors need to be hired. Also, building rooms beside one another can create beneficial combos, such as a vending machine room beside a lost-cost bedroom, or a hot tub room beside an expensive suite.
Saturday, July 14, 2012
Isometric vector art
Lately I have had a burning desire to seek out new technology and art styles. Bunny Tactics hit alpha, and I really cannot see myself making another defense game for a long time.
It all started with a quick dip into multiplayer land using Player.IO for Flash..
The API comes with many examples and I was amazed at how easy it is to work with! Basically you write the server side code in C#, save it as a DLL, and then upload it to the server. Meanwhile, the Flash version (the client) sends and receives messages to the server. Despite how easy the API is to work with, I began to see how complicated a simple action oriented game could be, due to sync issues that can riddle a game with bugs.
The API comes with many examples and I was amazed at how easy it is to work with! Basically you write the server side code in C#, save it as a DLL, and then upload it to the server. Meanwhile, the Flash version (the client) sends and receives messages to the server. Despite how easy the API is to work with, I began to see how complicated a simple action oriented game could be, due to sync issues that can riddle a game with bugs.
I also realized of course that throwing more technology at my work is not necessarily going to improve the end experience. My real focus is now on the simulation genre that can easily support tremendous depth, without necessarily adding complexity if executed correctly.
I started with prototyping a SimTower inspired game that focuses on micromanagement. In the prototype you can build condos, where the owners buy goods from nearby shops to furnish their rooms. For example, you can see two televisions in the apartment that were purchased elsewhere in the tower. Something about it just did not click; it all felt a bit gimmicky without any clear focus. With that said, I was not sold on this idea.
Afterwards I tried out isometric art using some online tutorials. I actually am amazed at how easy it is to create simple shapes and buildings in a program like Paint, but scaling is difficult at the pixel level so I returned to vector art in Flash. I created some basic furniture using reference pictures and figured out an optimal way to draw rooms similar to The Sims.
The programming is fairly straight forward. I am using the "diamond method", which intuitively allows me to work in a grid coordinate system and then transform everything into isometric space later. Moving people around in the world is a cinch.
It is likely I will create some hotel management game featuring many types of rooms and amenities, like arcades, laundry rooms, swimming pools, etc. The guest rooms can be visually upgraded with things like TVs, desks, framed pictures, refrigerators, and so on. The real challenge will be in programming decent AI and balancing the never-ending list of game variables. If I continue with this idea, it will be a fresh new experience on all aspects of development.
Saturday, June 30, 2012
Bunny tactics
Progress on the unnamed bunny tactics game has been going very well. At this rate, things may be wrapped up within the next couple weeks. It features melee weapons used by clicking the mouse, and range weapons used by charging up a small meter. Typical WASD is for movement. The hats give some kind of perk or attribute bonus.
This defense game is not progressive - there are no days or rounds that get incrementally more difficult. Instead, there is one long battle that requires multiple retries. Money and gear (seen above) is randomly obtained over time. The player's score in general is determined by how few retries it took to defeat all 100 enemies. This whole setup makes it so much easier to balance on my end.
Unfortunately the game does not make a whole lot of sense. For starters, why are orcs and the undead attacking this bunny? And what is with the goofy hats? I admire good story lines and strong character development, but it was just not my focus this time. Actually, I am attempting to make use of a lot of art that got shelved last year, so the overall theme of this game was not very selective.
As usual, I am always excited about future plans and ideas. Basically, I am feeling confident to pursue multiplayer Flash games next on my agenda. It may sound outrageous, but apparently is very feasible with modern APIs and tools, like Player.IO and SmartFoxServer. It does cost money, but seems very affordable.
Additionally, I want to find a simple way to host player-made content on a server, and have the core feature of the game be some kind of level editor. One of my own dot com domains offers unlimited hosting and bandwidth. A naively insecure approach to host player-made content is to send the data to a PHP page with parameters that save data entries into some SQL database.
This defense game is not progressive - there are no days or rounds that get incrementally more difficult. Instead, there is one long battle that requires multiple retries. Money and gear (seen above) is randomly obtained over time. The player's score in general is determined by how few retries it took to defeat all 100 enemies. This whole setup makes it so much easier to balance on my end.
Unfortunately the game does not make a whole lot of sense. For starters, why are orcs and the undead attacking this bunny? And what is with the goofy hats? I admire good story lines and strong character development, but it was just not my focus this time. Actually, I am attempting to make use of a lot of art that got shelved last year, so the overall theme of this game was not very selective.
As usual, I am always excited about future plans and ideas. Basically, I am feeling confident to pursue multiplayer Flash games next on my agenda. It may sound outrageous, but apparently is very feasible with modern APIs and tools, like Player.IO and SmartFoxServer. It does cost money, but seems very affordable.
Additionally, I want to find a simple way to host player-made content on a server, and have the core feature of the game be some kind of level editor. One of my own dot com domains offers unlimited hosting and bandwidth. A naively insecure approach to host player-made content is to send the data to a PHP page with parameters that save data entries into some SQL database.
Thursday, June 28, 2012
Zombie Situation released!
I am happy to announce that Zombie Situation has been sponsored and released by Mad.com (also known as MoFunZone.com). The viral version for the hundreds of other portals will be released within a week.
Resource credits:
Monday, June 11, 2012
Orcs! Oh my!
What is the best thing of being self-employed? Is it the ability to take time off spontaneously without suffering consequences of even subtle office politics? What about the creative freedom to pursue any idea basically for any platform? How about taking a laptop and working anywhere at any given time? To me, it is all those things, but at what cost?
Well, it's not the financial trade-off anymore, because I am now earning more than my old Firaxis salary. I have carefully calculated this based on the average statistics of all my Flash games - time invested, overall vacation time, and the income received from all sponsorship deals. The auction for Zombie Situation is basically over and the primary license is going for almost exactly what I predicted.
It seems to me that Flash has become a stable path for me to pursue as an indie game developer. There are so few technical problems, and play-testing has less overhead compared to mobile development. Perhaps in six months to a year I'll feel the need to gamble in the mobile space again, but for now I am satisfied.
Anyways, I have been working on my current unnamed project. I took the mechanics from the tooth prototype shown earlier, and changed the theme to make use of the art assets I already have. This is turning out to be the best option for me.
Actually, I have more than half a dozen prototypes of other genres before I came complete circle back to the run and jump shooter idea. One was a gold grabber that was inspired by many sources...
Sunday, May 6, 2012
Flash tips!
Over the past year and a half, I have picked up several tips when it comes to making Flash games. Some of these I use so frequently, that they have become essential to my development process. Here is the first batch...
I use the free editor FlashDevelop as my primary text editor and debugger. In the latest versions, you can create a "Flash IDE Project" which will link to whichever FLA file you have open in Adobe Flash. This setup is advantageous because the text editor in Flash otherwise is very slow, and FlashDevelop comes with many neat features like a profiler (discussed as the next tip).
Prior to this, working with the two software packages was cumbersome. You would have to export art assets as SWC or SWF files, and then embed or import them into FlashDevelop. In some cases, FlashDevelop would have to be closed before you can overwrite one of the files.
To make matters worse, an embedded SWF that is instantiated as a MovieClip is very misleading because actually it gives just a container that stores the real clip you want, as a child object. To gain access safely, you have to use some obscure stream-related event listener. The only time I needed to do this (prior to the Flash IDE project feature) was when a sponsor handed me a compiled SWF to use in my preloader class.
FlashDevelop has many useful features; the profiler definitely is somewhere on the top of the list. Open it by going to "View", and then "SWF Profiler". Click the red flag to green, and then hit F5 to publish and launch the game. The profiler only works in debug mode, so be sure you are not running in release mode.
I like to view the live object count. I've managed to find certain objects that accidentally got left around without being garbage collected due to some reference hidden somewhere.
This is flexible because it is possible to change the outline to a gradient, or even move the layer top around to give a more three dimensional look.
If you do all your painting in Flash using just the brush tool (or if you are planning to do so), then I cannot stress the "Paint Inside" option enough. Basically I never turn this option off, unless I am sketching on a bottom layer.
This tool forces your brush to paint only in the shape that began the stroke. It makes it super easy to add shadows and highlights because you don't have to "keep inside the lines."
1. Flash IDE Project
I use the free editor FlashDevelop as my primary text editor and debugger. In the latest versions, you can create a "Flash IDE Project" which will link to whichever FLA file you have open in Adobe Flash. This setup is advantageous because the text editor in Flash otherwise is very slow, and FlashDevelop comes with many neat features like a profiler (discussed as the next tip).
Prior to this, working with the two software packages was cumbersome. You would have to export art assets as SWC or SWF files, and then embed or import them into FlashDevelop. In some cases, FlashDevelop would have to be closed before you can overwrite one of the files.
To make matters worse, an embedded SWF that is instantiated as a MovieClip is very misleading because actually it gives just a container that stores the real clip you want, as a child object. To gain access safely, you have to use some obscure stream-related event listener. The only time I needed to do this (prior to the Flash IDE project feature) was when a sponsor handed me a compiled SWF to use in my preloader class.
2. FlashDevelop's amazing profiler
I like to view the live object count. I've managed to find certain objects that accidentally got left around without being garbage collected due to some reference hidden somewhere.
3. Invisible box for buttons
How many times have you played a Flash game and had trouble clicking on a button? Often times these buttons are text based so you have to click on them in just the right place. Well, as a simple fix, all you have to do is overlay your button with an invisible shape with alpha set to zero.
The invisible rectangle above is on a separate layer on top of this text:
3. Text with outlines
Often times I like to outline my text with a dark color. To do this, first type the text in any font you want, and then break it down to a shape by hitting Ctrl-B twice. Copy this and use Ctrl-Shift-V to paste it in place on a different layer.
Then hide the top layer, and use the "Ink Bottle Tool" to create an outline around each character.
Then show the top layer and this is what you get:This is flexible because it is possible to change the outline to a gradient, or even move the layer top around to give a more three dimensional look.
4. Paint inside
If you do all your painting in Flash using just the brush tool (or if you are planning to do so), then I cannot stress the "Paint Inside" option enough. Basically I never turn this option off, unless I am sketching on a bottom layer.
4. Drop shadow
Have some boring buttons? Give them some depth by using the "Drop Shadow" filter. This makes just about anything pop out. Here are three blank placeholder buttons with a black shadow behind them. I like to use drop shadows on sponsorship logos, because it makes them easier to see on any background.
(Ignore the tooth and its painted shadow)
4. Ambient light
For background art, there is an option to "cacheAsBitmap". As long as it does not get scaled, rotated, or otherwise transformed (translation is okay), then it will be cached for ready use under the hood. This does improve performance if objects constantly get redrawn on top.
With that said, you can throw in a constant color effect for free...
I painted this background using very simple colors, and then turned it into nighttime using a blue color effect.
Wednesday, May 2, 2012
Tooth quest
Zombie Situation currently is being reviewed highly by testers on FGL! The game will get another week of full-time development, because it could use some more features and perhaps a story.
In the meantime, I have pretty much figured out what my next game will be. It will be a jumping tooth armed with weapons to fight against evil candies and sweets. Would you believe me if I told you that it will feature a story? Yes, it is incredibly weird, but I'm tired of the usual themes of orcs, skeletons, soldiers, zombies, mages, knights, etc.
It started with me creating this playable prototype of jumping around shooting black lines with the keyboard and mouse. My roommate said the lines look like toothpicks. Initially, I wanted to correct him and say they represent arrows or something typical like that. But then I thought why not toothpicks? The rest of this story will be history.
This is some art I drew to help visualize the theme. None of this is final of course (not even the title). This just gives me something to work with.
Just like Zombie Situation, this is going to be another 4-6 week development cycle, and will be sponsored once things are final. As an indie developer, I have experimented with different ways to monetize my work (especially on the mobile platform), and my experience has shown that Flash with sponsorship works the best for me.
Friday, April 20, 2012
"Zombie Situation"
I would like to announce that my latest game, "Zombie Situation" is now in beta! This means all the features are done so it just needs fixes and tweaks here and there. It is a Flash game where you must defend against an onslaught of crazy zombies using nine different weapons!
I will upload it to FlashGameLicense.com next week for play-testing, and then open it for sponsorship bidding once the game is in its best shape.
I decided to go for a darker atmosphere so the royalty-free music I licensed from Pond5.com helps establish a mood early in the game. Most of the audio was collected from freesound.org that I modified in Audacity (open source!). I like to overlay some of the art with free textures from Mayang.com to avoid making things look too cartoony.
The game itself is very simple and easy to play. You only need the keyboard during battles, and only the mouse for menu navigation during breaks. You can expect to utilize most of the nine weapons because ammunition is limited.
I will upload it to FlashGameLicense.com next week for play-testing, and then open it for sponsorship bidding once the game is in its best shape.
I decided to go for a darker atmosphere so the royalty-free music I licensed from Pond5.com helps establish a mood early in the game. Most of the audio was collected from freesound.org that I modified in Audacity (open source!). I like to overlay some of the art with free textures from Mayang.com to avoid making things look too cartoony.
The game itself is very simple and easy to play. You only need the keyboard during battles, and only the mouse for menu navigation during breaks. You can expect to utilize most of the nine weapons because ammunition is limited.
Subscribe to:
Posts (Atom)