Category Archives: Development Update

Upcoming Beta in Humble Store

Beta (phase 1) is finally in sight. We hope to have it released in about a week. As we mentioned in our earlier roadmap post, Phase 1 will include Windows/Mac/Linux support, multiplayer, leveling, skills, combat, crafting, randomly generated worlds with several biomes, character customization and our beautiful day/night cycle. Note that this phase of the beta is private. Crea will become publicly available starting with phase 2.

So far we have had only a handful of people regularly testing the alpha. Meanwhile, there are about 70 early beta testers eagerly waiting. Going from 5 to 70 testers could be a bit overwhelming for us, so we are planning to incrementally add beta testers. This will help us keep up with bug reports, so there isn’t a huge deluge of reports all at once. Also by doing it this way, we can fix any big game-breaking bugs without exposing everyone to them. We are planning to invite a group of early beta backers ($50+ Kickstarter Backers), if you are an early beta backer and want to be subjected to the earliest beta stage then send Jasson a message on the forums.

Starting with the beta, Crea will be distributed through the Humble Store! This does not mean we are going to be in a Humble Bundle. What it does mean is that you will be able to download the game through your Humble Store account. Steam keys can be easily claimed through the Humble Store if/when Crea is published on Steam. Also we will be selling Crea through the Humble Store via a widget on our site, siegegames.com. The widget will look something like this.

Crea Humble Store Widget

We know that you guys have been patiently waiting for a chance to play Crea, and we are super excited to be able to finally start sharing it with you. Thanks for your continued support and encouragement!

Update Time!

It has been far too long since I posted an update. I don’t have too much exciting news to share at the moment; however, I figured I could mention what I have been working on at least.

For the last month I have been slowly figuring out how to make multiplayer better. It has been a long road involving switching from TCP to UDP and all the insanity that contains. Things are finally starting to shape up though. I have it mostly stable while testing with myself and will start stress testing it soon.

Shared access to Treasure Chest

All other features are in place for the first beta phase and we are working on adding in more content (biomes, monsters, items, and so on). In fact, this is exactly what our new developer is working on now. We will introduce him properly on the blog once we are past the trial period.

Some much more exciting updates are just around the corner. Stay tuned!

Updated Roadmap

It has been awhile since I posted an update regarding our release schedule. I want to thank everyone for their patience. Here is what we have planned.

Beta Phase 1 (Early Beta)

  • Time Frame: Early April
  • Duration: 4-6 weeks
  • Availability: Only $50+ Kickstarter Backers
  • Features: Windows/Mac/Linux support, Multiplayer, Leveling, Skills, Combat, Crafting, Generated Worlds, Character Customization, Day/Night Cycle

Beta Phase 2

  • Time Frame: Mid May
  • Duration: 4-6 weeks
  • Availability: $25 Kickstarter Backers. Publicly available for $25. (contains game, digital soundtrack, and digital artbook.)
  • Additions: NPCs, Researching, Grafting and additional Biomes, Monsters, Equipment, Items, Skills, etc.

Beta Phase 3

  • Time Frame: Late June
  • Duration: 4-8 weeks
  • Availability: $10+ Kickstarter Backers. Publicly available for $10. (game only)
  • Additions: Official Mod Support, Bosses and more content.

Release

  • Time Frame: August
  • Availability: Can be purchased by anyone for $15.
  • Additions: Quests, Mounts, Second Playable Race and more.

Some things to note

  • Any of this is subject to change but I have waited to post it until I was reasonably certain on the time frames.
  • Updates between releases will be posted on a weekly basis
  • Beta Phase 3 marks the official mod support. At this point I will do my best to provide all details regarding mod changes, provide mod API documentation and additional features such as in-game mod management. Before this it is still very possible to mod Crea.

EDIT: I have updated the original estimates to better reflect our current status.

Functional Is Not Finished

Has anyone noticed how long Crea is taking? I know I have! Just a few months ago I was certain I would have Crea more or less finished by now and yet here we are still months away from a reasonable release date. “Why is this?” is something I have been asking myself recently. What is making things take so long?

I looked behind me to what I have been working on over the last few months and then ahead of me to what I will be working on and the answer became clear. There has been multiple factors that are causing these delays such as a feature taking longer to implement than expected or completely overlooking a feature when I made the release date estimates. However, without a doubt, the largest contributor is the mistake of confusing functional as finished.

When we launched Crea’s Kickstarter I truly tried to make pessimistic estimates on the release dates. I was secretly hopeful that the stars would align and Crea would come out even sooner. After all, I had the basic exploration working along with world generation, character creation, crafting, user interface, and many other things. That means I was done with these and only have to look forward to the remaining features, right? Note quite.

As it turns out, function is not finished. Many of these features only had the bare necessities implemented and were by no means ready for prime time. Take the world generation for example. Back in June it did create a randomly generated world but, as it turned out, it was very hard to build onto these generated worlds. Even more pressing, the generation would take 45 seconds for a small world and I was too scared to try a large world that is 8 times larger than the small. For some time I closed my eyes and marched on as if the problem would magically go away. It didn’t.

There are several other examples. The user interface was difficult to build onto and hardly moddable. The crafting was missing the concept of recipes the player would learn. The networking is too slow and probably needs to be moved from TCP to UDP, a major rewrite of the networking code. Add all of these up and you have a few months of added development.

This is not all bad news though. With every upgrade, Crea gets that much better. I want to ensure that Crea is representative of my best work. I do plan to release Crea before some minor features have been finished, but the features I do release with I want to be polished and ready to be built onto.

…So when is Crea coming out?

Tooltips and Japanese

Decided to work on tooltips and while I was at it I decided I would once again verify that Crea was indeed localization friendly.

Styling will likely change (such as font size). Also note that this was just a test. Crea has not been translated to Japanese.

Needless to say, I am quite excited about both of these. I was unsure of how to implement tooltips for a while now and decided to finally tackle it. Also I had not tested a foreign language on the new UI and so it was a pleasant surprise to just see everything work as expected.

And here is the English version for your viewing pleasures.

Mac Port Progress

Figured this was noteworthy – I got Crea running on mac now! It does have some graphical issues that I need to iron out but besides that things are running smoothly! And no, the toolbar is not having graphical issues – it looks bad (particularly the bag area) because I made it.

Anyways, this is huge news, mostly because it proves that what I have been developing is in fact portable. This also means that the linux port is not too far away, but it will still be awhile before I do get to the Linux port. Don’t worry though – Early Beta will have all 3 platforms!

From Good to Awesom-ium

This has been quite a week! We FINALLY released alpha to a handful of people and it has been well received. Just over the course of a few days over two dozen bugs were uncovered (some already known) and half of them fixed. Between the bug fixes I began looking into moving the UI (User Interface) over into python. Why? I wanted to make all of the UI completely moddable and make it easy to add in new UI through mods. I had attempted this before and had problems getting the library I was using to be exposed. That was when I found something very shiny – Awesomium.

Awesomium is a full fledged “web UI bridge for native applications.” In other words, it is Google Chrome inside Crea. This was not the first time I had looked at Awesomium. I had considered it before for a previous project but had foolishly decided against it.This time I was no fool.

I have made the jump and I’m not looking back. I have been making great progress over this last week. This has been one of my most focused weeks – ever. I completely tore out the previous UI which I fortunately had the foresight to decouple from the rest of my engine as much as possible. Then I implemented Awesomium and got a prototype working surprisingly quickly. From then on I have been working on re-implementing Crea’s UI such as the menus, inventory, crafting and so on.

What does this all mean?

  • Crea UI will be 100% moddable
  • UI visuals and interaction is implemented in HTML5/CSS3/Javascript
  • UI interfacing with game logic is implemented in Python
  • Crea’s UI will be Awesome

For those web devs reading this, we have decided to use JQuery, Ember and Handlebars for templating and data binding the UI. You can also point your browser to a port on your localhost and you get full access to Google Chrome Developer Tools for the UI in the game. How awesome is that?

Screenshots coming soon!

Oh! I almost forgot I am doing regular livestreams now! Click for more details.

Feature – Character Customization

Overview

The character creation provides a great amount of customization. The first and most important choice the player has is choosing the type of body to use. The body type defines the majority of the aspects for the character – appearance, customizations, equipment, stats, and so on. A body type can be “human male”, “human female” or even some completely different race such as a Robot. Body customizations are a part of the rendered body that can be changed such as hair, shirt, pants, shoes, and accessories.

Aside from customizations, a body type also defines which equipment slots the character will have, the base stats for the character, and the proficiencies. Each of these will be expanded upon in their own respective feature posts. With these character aspects being associated to the body type means that entire unique characters can be created. Such as a Robot race that has its own unique pieces of equipment, customizations, stats, and proficiencies.

Modding

Every aspect of character customization is moddable: body types, customizations, equipment slots, stats, and proficiencies. I will cover all of this by going over the human male body script, which is quite lengthy. Some explanation is embedded in the code – Look for lines starting with ‘#’.

name = "Human Male"
body = Body('hm')

body.render = ModularRender('mods/base/body/hm/human.scml')

#Character's are rendered with a ModularRender.
#This means that the character is broken up into small sprites
#such as head, arms, hands, torso, legs, clothing, hair and so on.
#Each of these sprites can be replaced with another sprite.
#These mappings below associate a name with a sprite or group of sprites.
#This makes it possible to do things like recolor all body sprites or hide them.

body.render.addMapping('body', 'arm/arm_lower_0.png')
body.render.addMapping('body', 'arm/arm_upper_0.png')
body.render.addMapping('body', 'arm/hand_0.png')
body.render.addMapping('body', 'leg/leg_lower_0.png')
body.render.addMapping('body', 'leg/leg_upper_0.png')
body.render.addMapping('body', 'leg/foot.png')
body.render.addMapping('body', 'head/head.png')

#Lots more mapping removed for brevity...

#Sets the animation render ordering.
body.render.setOrder(['arm_back', '', 'arm_front'])

#Set up the body animations
body.animation = Animation("idle")
body.animation.bind('arm_back', 'run_arm_back', 'run')
body.animation.bind('arm_back', 'walk_arm_back', 'walk')
body.animation.bind('arm_back', 'idle_arm_back', 'idle')
body.animation.bind('arm_back', 'jump_arm_back', 'jump')
body.animation.bind('arm_back', 'fall_arm_back', 'fall')
body.animation.bind('arm_back', 'use_arm_back', 'use')
body.animation.bind('arm_front', 'run_arm_front', 'run')
body.animation.bind('arm_front', 'walk_arm_front', 'walk')
body.animation.bind('arm_front', 'idle_arm_front', 'idle')
body.animation.bind('arm_front', 'jump_arm_front', 'jump')
body.animation.bind('arm_front', 'fall_arm_front', 'fall')
body.animation.bind('arm_front', 'use_arm_front', 'use')
body.animation.setLooping('idle_arm_front', False)
body.animation.setLooping('jump_arm_front', False)
body.animation.setLooping('fall_arm_front', False)
body.animation.setLooping('use_arm_front', False)
body.animation.setLooping('use', False)
body.animation.setLooping("death", False)

#Here we add the customizations this body supports
#These show up in the Character Creation UI when this body is selected
hair = Customization('Hair', True)
hair.isOptional = True
body.addCustom(hair)

accessory1 = Customization('Accessory 1', True)
accessory1.isOptional = True
body.addCustom(accessory1)

accessory2 = Customization('Accessory 2', True)
accessory2.isOptional = True
body.addCustom(accessory2)

body.addCustom(Customization('Shirt', True))
body.addCustom(Customization('Pants', True))
body.addCustom(Customization('Shoes', True))

#Import this file and make substitions to body
#body.addSub('torso/torso.png', 'mods/base/body/hf/torso/torso.png')

body.hide('customizations/gloves.png')
body.hide('customizations/helmet.png')

#Define which gear slots this body supports
#These show up in the character equipment UI in game
body.gear = Gear()
body.gear.slots.append(GearSlot("head", "mods/base/body/hm/gear/head.png"))
body.gear.slots.append(GearSlot("chest", "mods/base/body/hm/gear/chest.png"))
body.gear.slots.append(GearSlot("hand", "mods/base/body/hm/gear/hand.png"))
body.gear.slots.append(GearSlot("leg", "mods/base/body/hm/gear/leg.png"))
body.gear.slots.append(GearSlot("feet", "mods/base/body/hm/gear/feet.png"))

#Define which stats characters with this body get
body.stats = Stats()
body.stats.stats.append(Stat('HP', 'HP', 300, 9999, True, True))
body.stats.stats.append(Stat('AP', 'AP', 100, 9999, True, True))
body.stats.stats.append(Stat('ATK', 'Attack', 100, 999, False, True))
body.stats.stats.append(Stat('DEF', 'Defense', 100, 999, False, True))
body.stats.stats.append(Stat('MATK', 'M Attack', 100, 999, False, True))
body.stats.stats.append(Stat('MDEF', 'M Defense', 100, 999, False, True))
body.stats.stats.append(Stat('AGI', 'Agility', 100, 999, False, True))
body.stats.stats.append(Stat('DEX', 'Dexterity', 100, 999, False, True))

#Define which proficiencies characters with this body get
execfile('mods/base/proficiency/craft/craft.py')
execfile('mods/base/proficiency/explore/explore.py')
execfile('mods/base/proficiency/fight/fight.py')
execfile('mods/base/proficiency/gather/gather.py')
body.proficiencies = Proficiencies()
body.proficiencies.proficiencies.append(craftProficiency)
body.proficiencies.proficiencies.append(exploreProficiency)
body.proficiencies.proficiencies.append(fightProficiency)
body.proficiencies.proficiencies.append(gatherProficiency)

add(body)

We are using Spriter for our character animations. Consequently, in order to create new animations or an entirely new body type then you must use Spriter. You can easily setup new sprite mappings, mentioned above at the top of the code.

A body script, such as the one above, defines the supported customizations; however, the actual customizations are defined elsewhere in their own scripts. Creating new customizations is reasonably straightforward. A customization is a very simple entity. It contains a “Custom” component which takes two parameters. The first is the name of the customization this is for and the second is if it supports recoloring or not. After that a Custom component can define any number of sprite substitutions that take place if this customization is used. Here we change what the top hair looks like and hide the bottom hair since it is unused.

name = "Guy Hair"
custom = Custom("Hair", True)
custom.addSub('head/hair_top.png', 'mods/base/custom/hair/hm_hair.png')
custom.hide('head/hair_bottom.png')
add(custom)

As you can see, creating new hair styles, clothing and any other customizations is very easy!

Links

World Looping

The last week I have been working on several different features: optimized world loading, horizontal world looping, and a secret feature I’m working on that I will announce in detail before too long. Aside from that I’ve been doing some other things such as getting the forums up and running!

The world loading optimizations I made are really going to make a huge difference with the game’s performance. Before the entire world would be loaded and stay loaded. Every single entity would be updated every frame. This all could be quite taxing on both the cpu and memory. Now the world is broken up into regions and a region is only loaded if it is needed. If a region is unused for awhile then it is unloaded. For a large world only 1/8 of it will typically be loaded at one time. That’s a huge difference!

While I was breaking up the world into regions I decided it was a good time to finally implement world looping. This means that if a player runs in the same direction then he will eventually loop back around to the same place he started. Another way to think of it is take a piece of paper and curl it up so that two opposite ends are touching. This is what the world looks like now. This world looping was actually quite a bit of work. I faced two major challenges with it.

The first one was getting the rending to work. If standing next to the world seam (where the two ends meet), then I needed to have the entities, tiles and whatever else render from two sides of the world.

The other challenge, the more difficult one, was that all of the systems relied on the assumption that the world started at (0,0) and ended at the world’s end. If something went past either of these points, across the seam, then it would be ignored. For example light would suddenly stop at the seam and cause some odd lighting as shown below. The light needed to jump across the world seam and affect the other end of the world. I had to worry about this for all of the other systems as well such as the automata (water) and physics. There are still a few issues with it that I need to cleanup but I’d say it is 90% of the way there.

Expect updates from me to come a little more frequently starting now.

Notice the line in the middle of the blocks. That’s the world seam and shouldn’t be visible…