Development Update 44 to celebrate the 5th release. New features:
The first iteration of spell casting. Player can find and cast spells, the following spells are currently in the game: Fireball, Chicken and Skeleton spells.
Here's a GIF of the skeleton spell in action:
Giant Spider has been added to the game:
3 different damage feedback animations for the player character, the following animation is used for the strongest impacts:
Improved save and load functionality.
Player gets a notification of what reward items they received from quests.
The land is now shaped like an island shape instead of a square.
Health, armor, stamina, food and experience bars added to the bottom of the screen:
Mouse and controller sensitivity options and separate inverse Y switch for mouse and controller.
Back button works in the inventory and map screen.
Menus work better with multi-display systems.
Several optimizations.
Sampo started modeling more villagers so we can get some variety to the towns:
Some pics from the upcoming terrain generation overhaul. We're experimenting with thermal and hydraulic erosion. It's looking extremely promising and wasn't as slow as we feared:
Fly-through GIF:
Demonstration of what the erosion does to a quick Photoshop heightmap sketch:
This is the type of "gameplay map" we plan to feed for it:
We're now in the process of integrating this stuff with the node-based world generator and that should allow us to test different terrain generation setups faster and answer some more questions: In what order do we need to run the erosion to get the fastest results etc.
Quarry, ephoete, SolarLune, Storsorgen: We'll probably end up doing all kinds of combinations each broken in their unique way
one leg, one hand, stub hands, no hands, stub legs etc. to get maximum variety.
pikkukatti & Nilanjan: We're using deferred lighting and physically based rendering. Sampo wrote an informative breakdown of the material setup:
http://samporask.tumblr.com/post/102629920044/hardland-early-access-release-4-brings-a-new-groupThe foliage is a combination of meshes and two-sided alpha textured objects. There's a component called WaveAnimationComponent which is responsible for waving them around when wind blows, when characters walk through the grass or if the object takes damage. It's a good system for anything bigger than small grass and works even for wooden fences and street lamps (you can setup the bending parameters so it feels right for each material).
WaveAnimationComponent for a bush:
WaveAnimationComponent { amplitude = 10 frequency = 0.06 maxWave = 4 maxBend = 20 maxDisplace = 1 stiffness = 0.4}WaveAnimationComponent for a wooden fence:
WaveAnimationComponent { amplitude = 0 frequency = 0.0 maxWave = 0 maxBend = 7 maxDisplace = 8 stiffness = 0.8}WaveAnimationComponent for a street lamp:
WaveAnimationComponent { amplitude = 0 frequency = 0.0 maxWave = 0 maxBend = 1 maxDisplace = 1 stiffness = 0.8} We haven't yet figured out what's the best way to add large grass fields so we don't blow our entity numbers through the roof. It would require close to 200 000 entities to fill an entire field with grass, the poly count isn't the problem but the entity count is. Though I'm sure we'll figure something out.
Animation system works in sync with a component called ActionComponent and that's where things get interesting. For example in order to get the spell casting to work in the latest update these were the key steps:
1. Created the spell casting animation in 3d software (Blender)
2. Added a chicken spell to Objects.txt. (The templates can refer to other templates):
SpellChicken
{
AttachmentSpawnerComponent
{
spawns =
[
{ templateName = "SpellChickenSparkParticles" attachToOriginator = true collideWithFamily = false }
]
}
TransformComponent { }
InstanceComponent { asset = "PuppetRooster" }
LabelComponent { labelOffset = 0.4 showOnlyInFocus = true }
InteractionComponent { examineType = Examine }
NameComponent { name = "Spell (Chicken)" }
QuestComponent { message = "Spawns chickens." }
ItemComponent
{
usableSlots = [ "Weapon_R" ]
damage = 100
useSpawns =
[
{ templateName = "SpellChickenProjectile" positionOffset = (0.2, 0.0, 0.0) orientationOffset = (0, 90, 0) scaleFactor = 1.0 startImpulseMagnitude = 60 collideWithFamily = false }
{ templateName = "SpellChickenSound" attachToOriginator = true }
]
useEffects = [ ]
useOwnerActionAnimationSequenceOverrides = { "UseRightHand" : "CastSpell" }
sensor = { type = Capsule radius = 0.08 height = 0.58 offset = (-0.06, 0.0, 0.4) orientation = (-0.0, 0.0, -90.0) }
}
PhysicsComponent
{
isDynamic = true
mass = 10
bounciness = 0.5
friction = 1.8
shapes =
{
"SpellChickenSphere" : { type = Sphere radius = 0.25 offset = (0, 0, 0.2) }
}
}
PointLightComponent { color = (150, 0, 200, 0) intensity = 5.0 offset = (-0.1, 0, -0.1) }
ParticleComponent
{
params =
{
colorTextures = [ "Flame-02" "Flame-04" "SmokeRing-01" ]
renderMode = Billboard
acceleration = (0.0, 0.0, 0.2)
velocityDamping = 0.85
mass = 1.0
lifeTimeBase = 0.8
lifeTimeRange = 0.1
fadeInTime = 0.05
fadeOutTime = 1.0
initialSizeBase = 0.5
initialSizeRange = 0.2
scaleInTime = 0.0
scaleOutTime = 0.0
initialAngleRange = (0.0, 0.0, 1.0)
initialAngleVelocityRange = (1.5, 1.5, 1.5)
initialColor = (0.9, 0.1, 0.85, 0.9)
endColor = (0.4, 0.1, 0.35, 0.85)
preSimulateTime = 0.0
hideMinRange = 0.6
hideMaxRange = 0.75
}
emitters =
[
ParticleEmitterBox
{
params =
{
initialParticleCount = 0
duration = -1
particlesPerSecond = 140
initialPositionBase = (0.0, 0.0, 0.0)
initialPositionRange = (0.1, 0.1, 0.1)
initialVelocityBase = (0.0, 0.0, 0.0)
initialVelocityRange = (0.8, 0.8, 0.7)
}
}
]
}
}3. The following went into the AnimationComponent of the soldier:
"CastSpell" : [{ startFrame = 1610 endFrame = 1625 fps = 30 blendInFrameCount = 3 blendOutFrameCount = 3 }] 4. This went into the ActionComponent of the soldier:
"CastSpell" :
[
{ animationName = "CastSpell" useStartFrame = 5 orientation = LookDirection2D maxMoveSpeed = 0 allowHeadTracking = false }
]So now each time the player is holding the spell and hits the attack button it will cast a chicken spawning spell. The code itself doesn't have any mentions of the word "spell".