About HuvaaKoodia

Entries

 
MiniLD #72
 
Ludum Dare 37
 
Ludum Dare 36
 
Ludum Dare 35
 
Ludum Dare 34
 
October Challenge 2015
 
Ludum Dare 33
 
Ludum Dare 32
 
Ludum Dare 30
 
Ludum Dare 29
 
Ludum Dare 28
 
Ludum Dare 26

HuvaaKoodia's Trophies

W.R.L.D. Champion! (LD38)
Awarded by TerraCottaFrog
on June 1, 2017

HuvaaKoodia's Archive

Desert Strife Post-Mortem

Posted by
Friday, September 2nd, 2016 12:28 am

One more jam, one more post-mortem. Such is the way of life (for me at least!)

GIFFIG

Design

Checked out the theme as it was announced (4.00 am around here). I knew what was coming based on the previous voting rounds, but no idea sprang up immediately (which is usually the case to be honest).

The brainstorming began officially in the next morning. Ranquil joined the storm later at which point all I had was a vague strategy game concept about scavenging and stealing technology. Movement of armies would have taken place on a world map and the action on a separate battle map. In the next few hours I managed to simplify the idea down to a single map close to the style of Advance Wars. Nine hours had already passed since the start of the jam so we set out to work with minimal fuss.

Programming

Light turn-based strategy isn’t the most demanding of genres and I had in fact created a similar prototype some 4 years ago. Unfortunately, the half-life of a codebase is way less than that and after 5 minutes of perusing I decided to rewrite the whole thing from scratch. That was a good call. The only system I reused was an A* pathfinding system, which I’ve been using for years in other projects including the last few jams.

No severe problems on this front, just a lot of work.

Graphics

All the problems piled on the graphics artist this time. First off, Ranquil had been working for the whole summer on other projects, didn’t really like the genre and lastly the drawing table broke when only one asset, the character sprite and walking animation, had been finished.

Due to this calamity all non-essential assets were cut, among these battle animations (and any possibility of a separate battle screen). Ranquil shifted focus to other tasks, like audio research (and found a great song right away!). Luckily the drawing board issue was resolved by Monday and the last essential assets, like the desert ground tile and the main menu background image, were made and implemented. Despite the last day push some programmer art slipped in. (I take what I can get!)

Polish

With the game itself feature complete and playable only minor tasks remained: Audio implementation, main menu and tutorial. Once again, nothing I hadn’t done before, although for a jam tutorial this one takes the cake! The whole thing was completed with 2 hours to spare, a new record that. The building and uploading process took about an hour more for the tired mind.

Conclusions

Never have had this grave a production setback before, yet thanks to the small asset requirements of the genre the end product didn’t suffer significantly. The 72-hour jam is much more relaxed than the 48 hour counterpart with time for sleeping and breaks. I like that.

Had a good time and, once again, felt genuinely happy about the accomplishment. Now that is a feeling like no other.

 

Play it here!

And have a nice, relaxing post-jam life!

Desert Strife Desktop Builds

Posted by
Wednesday, August 31st, 2016 2:20 am

Windows, Mac and Linux builds are in.

Here’s a GIF for good measure:
SAME OLD

Play it here!

Desert Strife in motion

Posted by
Tuesday, August 30th, 2016 4:56 am

As promised here’s a new GIF from the release version!

NEW STUFF!

One of my programmer art assets slipped in, can you spot it?

Play it here!

Progress Report (67 hours in) – Desert Strife is done!

Posted by
Monday, August 29th, 2016 7:07 pm

The title says it all. Time for celebrations! Play it here!

Title

Too tired to make a new GIF, this one is current enough…

"OLD RECORD!

Time to get some Z’s. Gotta catch a train tomorrow!

Have fun!

Progress Report (60 hours in)

Posted by
Monday, August 29th, 2016 1:03 pm

Feature complete! After trials and tribulations we managed to create and implement all required visuals and even audio. What a craft!

Take a gander. It is a long one this.
"156 seconds. NEW RECORD!

Stay tuned for the real deal. Only main menu and tutorial to go. Never had time for a tutorial before; exciting, right!

PSA: Sneak peak [SIC]

Posted by
Monday, August 29th, 2016 4:21 am

Sorry, sorry I snapped…

Progress Report (39 hours in)

Posted by
Sunday, August 28th, 2016 4:33 pm

Crunching tasks. Small GUI tweaks this time, with bug fixes and gameplay balancing.

110s GIF. PATIENT ENOUGH?

Playtesting, audio-visuals and main menu left for tomorrow. Should be doable.

Progress Report (35 hours in)

Posted by
Sunday, August 28th, 2016 12:49 pm

Loads of progress in the programming space. Improved AI, initial GUI, and, most importantly, ancient technology are all in. The gameplay will take a lot of tweaking to get right though. At the moment the difference between winning and losing comes mostly down to luck. That is not by design, believe me.

a GIF a Plenty

The graphics are still temp, partly due to our graphics artist running into dire technical difficulties (drawing tablet broke!). That issue should be resolved by tomorrow. We’ll see if there’s enough time to go by!

Progress Report (23 hours in)

Posted by
Sunday, August 28th, 2016 1:25 am

Where did those 8 hours go? Oh right… This human body requires respite and restoration.

Well yesterday’s AI problems are no more. Took less than half an hour to sort it out (shuffled the hacks around). Not that it is any smart yet, but at least it provides a proper fight.

GIF-JIF-JAIF

Next up the titular ancient technologies!

Progress Report (15 hours in)

Posted by
Saturday, August 27th, 2016 4:21 pm

Some proper graphics are in. Unfortunately the AI pathfinding gave me some issues so that will have to wait for the next GIF.

GIF-COHOLIC

More on them problems tomorrow. Staying up for the last two hours was a mistake…

Progress Report (9 hours in)

Posted by
Saturday, August 27th, 2016 10:11 am

Anyone recognize the inspiration yet?

GIF-TASTIC

The graphics are very much temp at the moment. Luckily I’m not in charge of the final visuals.

Transformagician – Overview and Recommendations

Posted by
Monday, May 9th, 2016 2:50 am

GIF THE REBOOT!

Usually I’m not one for shameless self promotion, but with only 17 hours left I might as well compose a little overview. I’ll throw in some of my favorite titles as well.

Overview

Play Transformagician here

Read the postmortem here

Watch the developer commentary here

Read about the artist’s perspective here

 

Recommendations

Maelstrom Mayhem

Lot’s of fun this one.

 

OGLA

A neat little simulation.

 

I Have Brig Plans

A solid puzzle.

 

Revamp

Tough but fair.

 

Have fun and may the ratings reflect your efforts (for better or worse!)

 

Transformagician Level Generation and Design

Posted by
Tuesday, May 3rd, 2016 12:42 am

"ANOTHER

I already touched upon the level generation in the Developer commentary video,
but that’s not enough info now is it! Here’s some more…

Tiles

One of the easiest ways to construct a virtual environment is to use tiles.
For me the decision to go with the technique was made even easier by already having an old tilemapping system laying around.
It was a bit rusty, but a few hours of mangling put it straight.

Sets

WallAndFloors

The tile graphics are as simple as possible. There’s a wall and there’s a floor.

I of course only implemented these assets as they were made by Ranquil. Pay special attention to the bump mapping!

Reading

The level is generated from an xml file. Here’s a little example:

<Ship type="TestMap">
 , , , , , , , , ,
 , . w . h . w . ,
 , . . . . . . . ,
 , . w . p . w . ,
 , . w w w w w . ,
 , . . . . . . . ,
 , . . . e . . . ,
 , . . . . . . . ,
 , , , , , , , , ,
 </Ship>

TestLevel

There are a few oddities right off the bat. The XML element is called a ship as that’s what the original project had, spaceships. The map is also flipped around as unity XYZ coordinates don’t quite match with the XY coordinates of the map file.

One nifty feature in the generator is spawning random rooms to specific positions on the map. The rooms themselves are defined in the same way as the maps.

<Room name="roomD" loot_a="0,1" enemy_a="2,6">
 w w w w . w w w w
 w . . . . . . . w
 w . w . w . w . .
 w . . . . . . . w
 . . w . o . w . .
 w . . . . . . . w
 w . w . w . w . .
 w . . . . . . . w
 w w w w . w w w w
 </Room>

And rooms areas are outlined with the characters R (room start position) and r (room limits).

 c c w c c c c c , , , , ,
 c c c w c R r r r r r r ,
 o c c c c r r r r r r r ,
 c c w c c r r r r r r r ,
 c c c w c r r r r r r r c
 c w c c c r r r r r r r c
 c c w c c r r r r r r r c
 c c c c c r r r r r r r c
 o c w c c r r r r r r r c
 c c c w c r r r r r r r c
 c c c c c c c c c c c c c
 , , , , , , c c c c c c c

(excerpt from a bigger map)

You can see the room randomization featured in the GIF.

Writing

Designing maps in black and white is kind of like programming in vanilla notepad, no syntax highlighting, no nothing. In other words clumsy and crude.

This issue can be resolved with conditional formatting in a spreadsheet (in this case Libre Office). Compare and contrast, the text file version:

, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
 , W w w w w w w , , , , , , , , , , , , , , , , , , , , , w c c c c c , , , ,
 , w p p . . . w , , , , , , , , , , , , , , , , , , , , , w c o c o c , , , ,
 , w p p w w . . c c c c c c c c c c c c c c c c c c c c c c c c c c c , , , ,
 , w . w R r r r r c c c c c c R r r r r r r r r c R r r r c w w , , c , , , ,
 , w . w r r r r r c , w c , c r r r r r r r r r c r r r r c , , , , c , , , ,
 , w . . r r r r r c , w c , c r r r r r r r r r c r r r r c , , , w c w , , ,
 , w w . r r r r r c , w c , c r r r r r r r r r c r r r r c , , , w c w , c ,
 , , , c r r r r r c c c c c c r r r r r r r r r c r r r r c , , , w c c c c ,
 , , , c r r r r r c c , w c c r r r r r r r r r c r r r r c , , , w c w , c ,
 , , , c r r r r r c o , w o c r r r r r r r r r c r r r r c , , , w c w , , ,
 , , , c r r r r r c c , w c c r r r r r r r r r c r r r r c , , , , c , , , ,
 w c c c c c c c c c c c c c c r r r r r r r r r c r r r r c , , , , c , , , ,
 , c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c , , , ,
 w c R r r r r r r r r r c c c c c R r r r r r r w c c R r r r r r c , , , , ,
 , c r r r r r r r r r r c c c c c r r r r r r r w c c r r r r r r c , , , , ,
 w c r r r r r r r r r r c c c c c r r r r r r r c c w r r r r r r c , , , , ,
 , c r r r r r r r r r r c c c c c r r r r r r r c c w r r r r r r c , , , , ,
 w c r r r r r r r r r r c c c c c r r r r r r r c c c r r r r r r c , , , , ,
 , c r r c c c c c c c c c c c w c r r r r r r r c w c r r r r r r c , , , , ,
 w c r r c w c w c w c w c c c w c c c c c c c c c w c r r r r r r c , , , , ,
 , , r r c c c c c c c c c c c w c R r r r r r r c w c r r r r r r c , , , , ,
 , , r r c w c w c w c w c c c c c r r r r r r r c c c r r r r r r c , , , , ,
 , , r r c o c o c o c o c w c c c r r r r r r r w c c r r r r r r c w w , , ,
 , , , , c c c c c c c c c c w c c r r r r r r r c c w r r r r r r c , w , , ,
 , , w w c c c c c c c c c c c c c r r r r r r r w c c r r r r r r c , w , , ,
 , , w w c w , , , , c c c w c c c c c c c c c c c c c c c c c c c c , w , , ,
 , , w w c w w , , , c c o w o c c R r r r r r r r c , , c c , , , c , w , , ,
 , , w w c w w w , , c w w o w w c r r r r r r r r c , , c c , , , c , w , , ,
 , , , , c , w w w , c c o w o c c r r r r r r r r c w c c c c w w c w w w w w
 , , , , c , , w w c c c c w c c c r r r r r r r r c w c o c c , , c , w , , w
 , , , , c , , , c c c c c c c c c r r r r r r r r c c c w o c c c c , w , , w
 , , , , c , , , c c R r r r r c c r r r r r r r r c c c o w c c c c , w , , w
 , , , , c , , , c c r r r r r c c r r r r r r r r c w c c o c , , c , w , , w
 , , , , c c c c c c r r r r r c c r r r r r r r r c w c c c c w w o w w w w w
 , , , , c w w w w c r r r r r c c c c c c c c c c c , , c c , , , w , w , , ,
 , , , , c c c c c c r r r r r c w c , w , , , w , c , , c c , , , , , w , , ,
 , , , , , , c w c c r r r r r c o c , , w , w , , c c c c c c c c c , w , , ,
 , , , , , , c w c c r r r r r c c c , , , w , , , c R r r r r r r c , w , , ,
 , , , , , , c w c c r r r r r c w c , , w , w , , c r r r r r r r c , w , , ,
 , , , , , , c w c c r r r r r c o c , w , , , w , c r r r r r r r c , w , , ,
 , , , , , , c w c c c c c c c c c c c c c c c c c c r r r r r r r c , w , , ,
 , , , , , , c c c c c c w c c c c c , , , , , c , c r r r r r r r c , w , , ,
 , , , , , , , , , , c c c w c R r r r r r r , c w c r r r r r r r c c c c c ,
 , , , , , , , , , w o c c c c r r r r r r r , c w c r r r r r r r c w w w c ,
 , , , , , , , , , , c c w c c r r r r r r r , c , c r r r r r r r c c c c c ,
 , , , , , , , , , , c c c w c r r r r r r r c c c c c c c c c c c c c c o w ,
 , , , , , , , , , w c w c c c r r r r r r r c c c c c c c c c c c c c c c c ,
 , , , , , , , , , , c c w c c r r r r r r r c w , , w c o c c w , c w w w c ,
 , , , , , , , , , , c c c c c r r r r r r r c w , , w c c c c w , c c c c c ,
 , , , , , , , , , w o c w c c r r r r r r r c c c c c c c o c w , , w c w , ,
 , , , , , , , , , , c c c w c r r r r r r r c w , , w c c c c w , , w c w , ,
 , , , , , , , , , , c c c c c c c c c c c c c w , , w c o c c w , , , c , , ,
 , , , , , , , , , , , , , , , c c c c c c c c w , , w c c c c w , , , c , , ,
 , , , , , , , , , , , , , , , c o c o c o c , , , , , c , , c , , w w c w w ,
 , , , , , , , , , , , , , , , , w , w , w , , , , , , c , , c , , w c c c w ,
 , , , , , , , , , , , , , , , , , , , , , , , , , , , c c c c c c c c h c , ,
 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , w c c c w ,
 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , w w , w w ,

With the conditionally formatted spreadsheet:

Spreadsheet

A thing a beauty! And here’s the map rendered in engine (flipped around this time, also no lighting)

Level2Full

Yet again there are a few issues. You need to jump though some hoops to get from the ODS spreadsheet file to the XML file. First the file is converted to the comma separated values format (CSV) and then the data is manually copied to the XML. Yeah, that last bit especially is not so great.

It is trivial to read the CSV file directly from Unity (something I didn’t know about way back then), so that’s what I’m going to do in the next project.

Conclusions

Tiles are a simple and powerful way to represent a level. Reading letter based map files is easy to code and fluid to create (with conditional formatting at least). Reusing systems that you’ve made before is a great boon to productivity. Take advantage of previous work as often as possible.

And, of course, you can play Transformagician right here.

Transformagician Developer Commentary / Walkthrough

Posted by
Saturday, April 30th, 2016 1:18 pm

Never made one of these before.

Highlights include:

  • Questionable pronunciation of Ludum Dare
  • Fumbling around at my own game
  • Deep insights into the development process (fall for the hype, pretty please?)

And/or you can just

play it here

Transformagician – Performance Optimization

Posted by
Saturday, April 23rd, 2016 3:16 am

The jam is over, the entry turned out great and the WebGL build (which most people are going to play) runs quite badly. What to do? Optimize!

Identifying the problem

When trying to improve performance you should always go for the elephant in the room. In most cases (including this one) taming the alpha male is enough. Run the profiler on the target build and see what is up (milliseconds) and what is down (framerate!). Let’s look at the rendering performance of the following scene.

Image 1: Benchmark scene

Figure 1: Rendering performance in Unity editor

Not bad! The deferred renderer does a pretty good job at batching drawcalls.

Figure 2: Rendering performance in WebGL build

Very bad! The WebGL build seems to fall back to forward rendering before a deferred lighting pass. Maybe this is why the batching is botched, I’m not quite sure, but there most certainly is a drawcall problem.

Solving the problem

One solution immediately springs to mind: Mesh.CombineMeshes. After some modifications the script works like a dream.

The walls in the scene are combined into a single mesh and the floors into another. As long as all the meshes share the same material there will be no trouble and the combined mesh looks just like a bunch of individual objects.

The only difference being a drastic reduction in draw calls. Let’s see just how drastic we’re talking about here:

Figure 3: Rendering performance in editor (with MeshCombine)

Mere three times faster… I think we can do better.

Figure 4: Rendering performance in WebGL build (with MeshCombine)

Fifteen times faster! I rest my case.

Conclusion

Use the profiler, identify the worst offender, smite it and rejoice. There are further optimization I could do, but why bother. At this point it’s already an effort in diminishing returns.

Getting less than 60 frames per second? Time to look in the mirror and get to work!

Transformagician – Postmortem

Posted by
Thursday, April 21st, 2016 11:32 pm

JUST A GIF! A small one this, tiny!

Play it here!

or read on.

Many earth shattering revelations await you.
(Hyperbole is the best medicine after a long jam)

Team

LD is usually my solo jam, but this time I didn’t work alone. Ranquil created the graphics (you can read more about that here) and I, of course, programmed the lot. My last team LD was a disaster (my bad on many levels!) so I’m glad this one turned out well, really well in fact.

Design

A few Ludums back I had an idea about shapeshifting. Stealing a top secret prototype from a well guarded research lab, avoiding detection by masquerading as objects in the level. The AI would react believably to anomalies in the world, including walking furniture. A bit too ambitious you could say.

We went though a few other ideas, but settled on cutting the above design down to manageable size: non-human enemies, a set amount of items and clear AI behavior rules.

Development

As a programmer I’m a fan of not reinventing the wheel, i.e reusing code (i.e. being lazy!). The level generation system is from this past LD gem (look who’s saying) and it was originally created for this project. In essence, twice recycled code. What can I say, it works.

Everything else is custom though. Nothing too difficult or out or the ordinary so in the end we even managed to pump out a build at the 48 hour mark. The final 78 hour version includes improved graphics, a fancy ending cinematic and some gameplay balancing.

Audio

The lax jam rules allowed us to utilize royalty free sound effects and music. Fortunately Ranquil knew a few (rather interesting) web-zones full of the stuff. Links in the description.

Music really does elevate the mood to new heights, doesn’t it.

Issues?

None! I don’t believe it myself, but it’s true. Working in a team for 72 hours does help, I guess.

 

Intrigued?

Try it now!

[cache: storing page]