Ocean got alive finaly. After much thinking and researching about right technique for sea rendering (and there are many), I opted and delivered two overlapping and semi-transparent textures, (cloud and lava tiles generated in GIMP), moving over each other on 3:1 Lissajous curves. Sweet! Trails got remade, to be more smooth and pretty. I spend more time in Blender, working on towns, trees, chests, barrels and animated birds. Meanwhile I introduced myself to Python as well as Blender API, and played some with Blender to Marmalade exporter. I decided that *ALL* visual art will be done by yours truly, and will be using stock or cc by-sa 3.0 music and sound effects. Found some gamedev blog entry reminding me that it is easer to fake 2d/3d art than faking a working c++ code. On that conjecture, I listened to some creative commons music while ordering easypen i405! :)
Yes, it has been a year since I started this. The most demotivating fact ever. But. Didn’t quit. How many actual hours? I don’t really know. :) If I was 8 hours a day on this, my guestimate is that it would be one month instead. But I don’t have deadlines so I pretend that I don’t care. Do I see the light at the end of the tunnel? No. Another year at least then. I guess all, ahem, great, things take time. Just ask James Cameron. I find it hard to check “completed” on anything. Everything can be done better. Faster, more pretty, more play worthy. I have a feeling that each fancy feature I add on top, it doubles the total game value. And that never ends. Each new idea I renounce with excuse of keeping focus, seems such a shame. It’s such a shame you can’t change terrain, pinch and zoom in and out, build and own new cities, walk on land, post on facebook, play on Windows/Mac, choose a soundtrack, have guilds, drink rum, meet girls, drink more rum, marry, upload pictures and logos, have treasure fleets and silver trains. “It’s such a shame, it would be so cool and it’s not that hard to implement”. As if each feature would double the number of players. I need to have end in sight. I need to focus on slowly wrapping things up. I would really like finalized and polished package before Christmas… some year.
Having enough of candy, I’m moving back to regular diet. Quests. Generation, purchase and completion of each. Along with trading and ship plundering / looting, this is one of the cornestones of gameplay and gold income. I have made up up to nine different types, differing in purchasing price, capacity and reward. Destination cities are dynamically randomly selected within distances related to your ship type, while distance is proportional to reward. Menus as splash images are now implemented on town docking, so one can now at least quit game in decent fashion. ZLIBed JSON is again involved for transfer, seems to be working fine. For testing I did deploy game on Kindle Fire and it worked great. Proverbialy, time does work for me since hardware is gaining on me!Also, I decided that to use towns as purchasable realestate, making it the real goal of the game. Each transaction will increase it’s price by 10% percent. Total net worth will be used as global hall of fame.
Felt like some makeup should be added. Textures were easily added to landscape, and it is looking good. Figuring at least couple of different should be used (snow/ice, desert, grass, earth, stones). Also, fancy semi-transparent clouds have been now generated, dropping a lovely dynamic shadow on both land and sea. But. I found my game moving too much to realistic look and feel and away from cartoonish like, which I think I want. Not sure “wat do”. Found a great article on cartoon like GL rendering and thinking about maybe using it. Also, sea and cannon trails are now implemented, using 10 last server points. It looks good, but animation is kinda jumpy. Either way still wondering about pure sea effects, should it be random waves animated textured polys just scattered around, or should I use one large pseudo shading animated caustic map….
Upon receiving enough hits from cannon or land, you die. Conceptually not so simple in MMO, IMHO. So dead player should be punished, but not to much in order to avoid anger and blasphemy and other negative emotions. But not too little either, to avoid indifference. Same goes for killing rewards which have to be motivating enough, but still leave a dead player in good mood. Not an easy task, as every online game seems to be dealing with it differently. In order to avoid hyperinflation, literally, reward and punishment should be about the same. Don’t have magic number yet, but I recon about 25% of everything onboard should do it. But you magically keep your sinken ship, yay! When dead/sunk, you will shortly respawn in last docked city with penalties applied. Docking taxes included and game saved. :)
Nothing wrong about retroactive blogging… I guess. So what’s new? Canon fire. Left and right, with reloading time, collisions and damages. Looks good, even without sounds or FX yet. Currently farmost left and right tap trigger it, but UI is also TBD. A-ha moment: cannon speed vector is to be added to ships, duh! Also, inital speed and position vectors for newly created objects is calculated to fit weighing function. Cannonballs are modeled as simple spheres with shadows embedded, so no real ballistics, just flat linear motion. After a while they, ahem, disappear. Playability wise, still not sure if range or cannon size should be used. Number of canons and reloading times should be enough to differentiate ships. Meh, we’ll see.
Game pricing model will probably be a, all too much popular, freemium. Free for all with in-app purchases of proper ships, upgrades and city governing positions. In free mode you will not have firepower, and a small short-ranged ship. Concept seems to be working great and well within “let your game be your marketing” mantra. Still a lot of time to change minds. I did some projections on time-frame, and it does not look too good. At this rate I am in for at least another 8 months, almost half of it going to 2D and 3D artwork, sounds and fancy visual effects and another half to features and gameplay.
For the first time I think i might have a feeling what actual gameplay might look like. To get gold, players will need to complete quests and missions, which can be contracted in towns. Those will mainly require sailing to increasingly distant locations. Sailing takes time, which takes food, which takes cargo space, which is defined by the type of ship owned. Ergo, ships have range, but also strength, speed, turning, wind usage and of course firepower. Ships can be bought at towns and can multiplayer battle, damage and sink, leaving some gold and food for looting. Ships can be sank by enviroment as well (storm, reefs and if unlucky giant octopus!). Each city docking costs a small gold fee, but allows savegame, food refill, damage repair and upgrades. You can be titled gouverner of any town for public name display and earning docking interest. It will be facebook integrated for login, achievments post and getting drunk on rum with your friends, if docked in same city. :)
Again, a lot of work was done as well as
wasted spent on learning, but with no new fancy screenshots to show for it. Client now communicates with server only – Redis is now exclusively available to Node server, implementing cornerstone of multiplayer security. Network performance was also improved by eliminating some unnecessary blocking requests and moving all messages in single round-trip message. Dead reckoning is reintroduced to work along weighing, giving much more fluent and responsive feel to the game. Some management of suspend/resume was implemented. Persistence is functional, so users will continue wherever they logged off. World map was rebuilt, with some rescaling. New city import was made to include more smaller towns totaling over 5000 – only criteria was not to have larger town nearby. After some downtime in Joyent, server was moved to Amazon EC2 – they give great machines for free for a year, you should really check it out.
A lot of sun, sea, beaches, seafood and wine, and very little development, as predicted. Still, terrain and player collision are implemented and some communications issues solved. Internet connectivity was somewhere in between extremely poor and none whatsoever, which came in quite handy to improve network behavior. Weighted positions on camera and players turned out to look better than plain dead reckoning, and also package size reduced along with it. Simple user control is introduced, swipes left and right set the ships rudder, and it seems to work fine. Some time was spent browsing for interesting sounds, music, and 2D art. I can’t wait to start making things prettier and more fancy. Currently all effort is going to completely moving all Redis operations to server-side, due a) security, b) performance and c) elegance. Up next would be cannon fire action and city docking, which then would be a good time to implement persistence.
To be honest, still no clue of actual game play and game goals, if any specific… I suppose something to do with gold plundered, reputation earned, ships owned, towns visited, achievements unlocked, national pride boosted, guilds formed and teaming up with friends from OpenFeint. No clue. Towns could also be owned I guess, maybe king-of-the-hill style. Technically, also created and destroyed, as well as terrain itself. Probably a bit too much. I could still use a small army of developers, 2d and 3d artists, and at least one marketing drone. :)
Phew. A lot of effort went in, but it seems to be worth it. Server side script does the authentication, login, region subscription, physics, and general world simulation and network updates. Plus a bunch of nonhuman players. It works! Started really slow at 1 tick per second just to be able to keep track of all logs and networking. As a greatest feature ever, dead reckoning was implemented and things look so smooth! Both for translations and rotations. Already at 2Hz you just can’t really tell anymore what refresh rate is. That should leave a lot of bandwidth and CPU time for a lot of players! About packet sizes, I started at 22, and ended up with 28 bytes per visible player, which seems satisfyingly little to me. As much as I would love to start benchmarking, optimizing and yakking about numbers as soon as possible, I will probably leave that for last. Plenty of things to do next: collisions, controls, player cam. Sounds. I wonder what iPad version will be out by the time all this actually gets done….Either way, I’m off to earned summer break! I might do some work, but again I might not. I will probably just do some envisioning of possible features that would make this game epic!
After some time off from myself and some meditation during holidays, I have decided to stick with
Airplay Marmalade. They actually listened and did some repricing, while I came to to the terms that there is no such thing as free lunch, for the billionth time in my life now. Influenced or not by it, I remembered that there is whole other half of the game to be built on server side for our MMORPG, and started looking for best course of action. I found out that there is not really all that much quality reading material on subject floating around, and had to settle for short research papers and case studies. Also looked into existing multiplayer server frameworks but came to conclusion that I don’t really appreciate Windows servers. Even more importantly, I don’t really like to be vendor-locked-in and 3rd party dependent, more times than necessary that is. Besides, their Marmalade integration is not quite complete yet. Each type of online game seems to have it’s own vision of usable network implementation.
So, it is definitely going to be Node. All pre-benchmarks are impressive, syntax known, and coding simple. Also, I like to think that one day I will be able to build in-browser client which would be a nice match. Biggest realization for me was to put all world simulation to server side, and never ever trust the client for anything. I was hoping to avoid this. You see, all server-side resources will be paid by me, while client side will not. As much as I wanted to secure a smart client, it just can’t be done. Clients really need to be just dumb rendering terminals with UI and networking. Luckily, physics will be fairly simple while server centric architecture should reduce bandwidth. Also, I won’t be bothering too much with scaling, since odds are I won’t be needing it, lol! Here are some ad-hoc guesstimates, just so I can be quoted later on, proved dead wrong and fiercely ridiculed:
Around 4-10 Hz server side simulation tick.
Around 1-5 kb total player definition size.
Around 25 bytes per avatar player update packet.
Around 1:10 online/total user ratio.
Around 1000 online users support per server.
Actually I am really curious about last one and naturally I will be pushing this one as high as possible. Now I’m off to specifying messages and protocol and I won’t be back until I see the damn thing move on my screem in jerky and laggy fashion while trying to obey almighty server-side laws of physics! See you all in 10 years or so!
In a surprise dick move today, Airplay SDK decided to revoke all free licenses, and suggested we should all just pay up or just drop dead. We have 30 days. To make up for it, they changed their name to Marmalade and put some flashy new icons on their website. Now, I really didn’t mind purchasing the license for Android before publishing (iOS was free), but now price went from $99 to $499. Annually. Or you can get it for $149 if you will have their in app splash screen during loading time. Now still, those are not completely unacceptable terms, but it made a lot of people, including myself, wonder what the terms will change to in next quarter? Luckily I don’t have 10 licensees or 10 years of code written for the damn thing, but this really served as a nice warning as for all “we love indies” packages. They can essentially void any code any company has for their SDK at any point in time! I guess it’s time for some agonizing reappraisal of the whole dev scene. Not sure what will come next. Another porting? Going native? Or paying up and shutting up. It’s a sad day for indies. And for the Ideaworks. I understand that they are just profit driven company, like any other, but they had so much more going for them. They have big players and large clients, as well as numerous indie user base. Don’t understand why they really needed to do this. We trusted them with time and effort and they used it to gain publicity and popularity. Well played. We should’ve known better, really. It is definitely not a “free as in speech” software. O WebGL, where art thou?
Well, they are all just standing there. I need them to move. No problem, speed vector along orientation and on tick position update. But hell, ships are going through the islands, dolphins swimming into walls. Nightmare. I need AI. Possibly with retarded IQ, but still. If you are below the terrain height you should really turn around. Please. That did it. Still far from pretty, but at least you get some illusion of intelligence . What I really want is look ahead vector, rotating animation, and large random angle for them to turn. Will do. Most of the wildlife will be for cosmetic purposes only anyway, and each player will see it’s own “decorations”. No need to keep them synced from game server, and hence AI / physics are done on client side. For player ships, we can’t never trust the client to do such delicate, game critical calculations. We need more wildlife, at least a whale and seagulls. Clouds. Clouds will be essential for gameplay, leave you to it to guess why as well as the names of these islands.
We are making progress. Finally we can add some life into our world. I searched and found some free and “low” poly models. They all needed quite a lot of remastering but eventually found their way into Airplay. I lost much of time to animating the freaking dolphin. No matter what I do to it, it always ended up looking like it has suffered from some serious genetic disorder disease, and looked like a lump of meat twitching into itself. It was not a pretty sight, actually quite emotionally disturbing even. Finally, I made sure all transformations were applied in Blender, and all bones in skeleton connected and named properly, and then more of some manual Collada editing I made it to work. I’m not looking forward to doing it again. Using similar technique as for trees, for time being, I just thrown them around randomly at see. Ships on surface, dolphins at random depth. Once again, world looks like a better place.
Let there be light. Directional. Rotating. Slowly. From East to West. And we’ll take some ambient light as well, specially some blueish at night. There, I fixed it. Objects from Blender come with normals calculated for each triangle, but our terrain is still flat all day long. So we calculate and normalize all normals for each terrain part dynamically and feed the monster. Now you can actually tell what time of day it is by looking at the shades. Beautiful. While dynamically working on each terrain cut, we might just as well randomly add trees over certain height. We use region related seed for pseudo-random (no such thing as random or is there) function so we always get same random tree pattern. Unfortunately, now I already started to push humble mobile GPU capabilities. Apparently, it is very expensive to call rendering for each object, even more expensive if you are changing materials. So we only use one material, with vertex coloring. Also, I merged all trees into one renderable object. GPU liked that very much, and took me back to 100s fps. You are welcome.
And export from Blender and import to Airplay was a bit painful. Needed to change my laptop regional settings, since apparently 1,2 , 3,4 , 5,6 is best exporter could come up with to represent a vector. Genius. Also colors turned floats instead of bytes, but at the end, that’s what open standard is all about. You can open it and you can fix it. Some time I spent on fixing the terrain generation (should the triangles have / or \ hypotenuses), some was spent on making town names appear on screen, and some was spent watching TV. Miraculously, again, I had something to show for it. Coming up next: lighting, animations, trees, ships and dolphins. Also, I need to change that font really bad.
You may have noticed I have a thing for free “as in speech” software. Yes, it is “free as in beer”, but more importantly, I think that once mastering a GPL tool, you are better off later on. You see, with free software, no one needs to increase the sales of it every year by forcing new and retarded features, flashy and undesirable UI changes, cutting the support for old versions and bloating the size and complexity for no apparent reason. So, Blender. It’s even completely portable! After a while I felt right at home, even though I have never used it before. I plan to build simple low-poly objects of trees, houses, ships, seagulls, dolphins, whales, starfish and maybe we can throw an octopus in it. So there. After a couple of hours I had a tree and few low-poly houses. Enough to get us started.
So simple it has got to be powerful! “Redis is an open source, advanced key-value store.” It likes Node and C++. It’s fast. How fast? 100k+ sets or gets per second fast. We’ll take it. So far all our data was in binary and text files, which are slow and pain to access, modify and share. So, we chunk the data, compress it, hash it, store it. As it turns out, half gig binary map was reduced to 40MB compressed memory data. Great. Now we need to get that data to Airplay somehow. Hiredis was up to the task of being portable. Replacing couple of network system calls and few string format characters, our game started happily reading data directly from db. This is just temporary, of course. Since Redis knows no fear, so it knows no security concepts either. We will have proper server application layer in Node later on, but right now we are just too eager to see our world again. We need 3d meshes.
Towns. I need a good town list, with proper names, GPS coordinates, population. Since those were not available in 1600′s I will use current. US military had some, but they were way too… errr.. messy. I ended up finding very nice list on http://www.world-gazetteer.com which was far more usable. Much alike NASA maps, it is amazingly beautiful set of raw data. Mapping those to world map gave me city height and access and orientation to the sea. I had to filter out continentals and towns below 10k people not to have too much of them. As it turns out, some areas are still too crowded with towns, while some extremely empty. I will re-filter the list so only towns with no larger neighbors are in.That way it will always be that some town close enough, but not too much of them too close. After some miscalculations I finally got them to land perfectly on our map. Data is getting big. We need database.
Got alpha to work. So sea is actually just transparent blue plane, cutting through terrain at right height. A lot of temptation to introduce tides, floods, global warming changes…must resist…keep focus… year is around 1600 and it’s about Pirates! Terrain is all dirt. As it turns out, green does note blend well apparently, I will add trees as objects later on. Right now time to enjoy the view of dreamy island of Crete on my Ipad!
I wanted it big. Insanely big. Kind of 9 galaxies Elite style big. But I need people to orientate and relate. I remember I was so happy when I found out Pirates! actually used real Caribbean map for their game. My world geography was not very good, me being 8 and all. So I need a map of the real world. A big map. And NASA delivered. Now just to cut it, distort it, stretch it, scale it. Get it to Airplay. Somehow. Build a 3d terrain object with it. Easy. Right.
I know something about, vectors, matrices, view frustum, culling, vertices, triangles, normals, and transform and lighting. Not much, but enough to make my way around Airplay’s IwGx and make it work. It was not smooth going, as it never really is, but I got it to show. First glimpse of visual stimuli and now I can breathe again. Really, I can’t work with something I don’t see. I know that is bad way to start a game design, but I can’t help it. So childish, I know. Now just add water and here we go, the new world is born:
Naturally, I want it everywhere. Hardly. I really wanted to keep the client in the browser. HTML5 and canvas tag really look promising! But I don’t think we are there just yet. Tried some demos on some mobile devices, and they all went awfully slow. I know some games got ported just fine, but still I feel more are porting the other way around. I am really looking forward to HTMl5 gaming, but for now, it will have to wait. So ….I found Airplay. It’s C++. It likes Visual Studio Express. It works almost everywhere. It has impressive showcase. It’s cheap and even free for small indies. It has good documentation, impressive examples and helpful community. It likes 3D and Collada. I liked it from day one.
In other news, Subversion for source control, Blender for 3D sketches and GIMP for image manipulation. Ready, Set, GO!
So what kind of game do I want to build? I wanted a classic remake. I think many are unjustly long forgotten. In technology-limited times, almost any game had different genre and game play style. Today I see many remakes being incredibly popular, just as they never have existed. I had many candidates. I still have and will probably do them sometime. But I always wanted one in particular. And that on is ….cough cough…Pirates! But in MMORPG style. I want huge worlds to sail, places to go, people to see, things to plunder, pirates to rob, ranks to achieve, treasures to find, goods to trade, and ships to own. It just has to be done. Sid Meier did it three times, each time spectacularly. But sadly, never ever in multiplayer.
No, you will not have to dance to impress governors daughter. And you will not have to take care of your dog’s hairstyle, nor have a talking parrot giving you retarded help. You will have to know the seas, winds, ships, cannons and cities. So that’s it. Hence, the Seacraft. And -online. I don’t have it completely worked out and I don’t need to have it yet. Just a general direction. Hopefully this blog will provide some good ideas as well. So far I am alone in it, which does not have to stay that way. There is a ton of work ahead, but it should be a lot of fun. Up next I will write about platforms, technologies, tools used and grand scale design I am hoping to achieve.
Wife, kids, mortgage, 8-16 office job. Obviously in IT as developer for far less exciting software. In early 30s. All of this should be enough for you to understand why the game progress will go so glacially slow. On average I expect and hope of about 4-8h of work per week into this, at best. Few hours a day, few days a week. It’s a hobby, not my living. Not yet anyway. So, that’s about 2-4 developer days a month! Sigh. No, I don’t have a deadline. Yes, I wish I had an army of developers, designers, admins, marketing drones and at least one MBA manager to brings us all coffee. Unfortunately, I will be doing it all by myself. For the time being at least.
Many reasons. Here are some of them, sorted by some kind of relevance, mostly:
1. FUN! I love coding. I love computer games. Sometimes even playing them. But building brave new world out of thin air just gives me kicks.
2. Because I can. At least because I think I can. I don’t think everybody can.
3. I want to see if I can. I could always use some self affirmation. Sort of I-want-to-do-it-so-I-can-say-I-did-it thing.
4. Get to know publishing process. I might be a couple of years late, but it is still a growing market. I think that concept of app stores are wonderful gift to indie developers.
5. Get to know new technologies and tools.
6. Create something of some value.
7. Utilize available resources. knowledge, hardware, software, internet…(free time deliberately left out)
8. Express. Artistically. 2D and 3D art. Music and sounds. I wont be doing them from scratch of course, but still.
9. Get insight of earning potentials. I really want to know how much would market value something like that.
10. Make people enjoy it! Maybe.
11. World peace. Think about it! If people are playing my game, they are not killing each other.
I have never had a blog. And I have never developed a proper game. So it kinda makes sense. Hopefully, this blog will keep anyone interested up to progress, and possibly get some useful feedback. Or some kind of IP lawsuit. Either way, It is also very likely that all my game development will ever amount to will be these posts to my future self. Also, since developing is going so incredibly slowly, I figured extra time spent on blog wont make much of a difference. So now when you know why I am writing a blog, you can ask yourself, why oh why am I developing a game?