Sep 6, 2010

Building Starcraft 2 Maps

This time the subject matter is of a, to me, rather different nature. I recently started to dabble in the art of making competetive Starcraft 2 maps and wanted to share some of my failures with you.
My first map was of a horribly wrong scale and contained an unbalanced amount of resources.


Here are the rules for resources:
  • The fixed amount of starting resources are 8 minerals and 2 vespene geysers.
  • A normal expansion contains 6-8 minerals and 2 vespene geysers.
  • A golden expansion contains 6 rich minerals and 2 vespene geysers.
  • Rich vespene is never used
Map sizes (effective):

1v1 : ~120x120
2v2 : ~150x150
3v3 : ~170x170
4v4 : ~190x190

Map expansion count:

1v1 : 3~4 / player
2v2 : 2~3 / player
3v3 : 2~3 / player
4v4 : 2 / player

The grid system uses 8 units for a big grid square (G) and 4 for a small (g).

Building rules:
  • Start locations should be contained on a at least 14 G² (/ player) big plateu.
  • Expansions should have ~6 G² empty space around it.
  • A number of Xel'Naga towers (1-4) can be placed around central positions.
  • LOS (Line Of Sight) blockers should be placed around key locations (e.g. so that micro unit controls can be used more effectively.
  • A fun level has one/several central point(s) to battle over.

Sep 1, 2010

Cross version compiling in AS3

Ever wanted to make a flash application behave differently depending on the plugin version of the user? That type of behaviour requires some planning beforehand and is totally doable.


Method availability could be done like this.

package
{
 public class PluginCapable
 {
  public static function methodAvailable(object:*, methodName:String):Boolean
  {
   try { object[methodName]; return true; }
   catch (error:Error) { }
   
   return false;
  }
 }
}

Say you wanted to check if the user could save locally...

var file:FileReference = new FileReference();
if (PluginCapable.methodAvailable(file, "save")) file["save"](data, "file.txt");
or simply hide the save button or something.

Jun 12, 2010

XML Serializer 1.1.0


Added some useful functionality and removed some showstoppers on certain xml-files.

Added Features
  • Specify entry level of parsing.
Download

XML Serializer 1.0.3


Decided to simplify yet another step in my work process and make an app that automatically maps xml-data to a class in AS3, this was the result of that.


Features
  • Drag & Drop XML files directly onto application.
  • Analyzes data and suggests variable types.
  • Exclude unwanted nodes from serialization.
  • Generates .as class file for use in ActionScript 3 projects.
Coming feature
  • Specify entry level of parsing.
Download

Jun 9, 2010

UTF Compressor 1.2.2


Released a minor updated version.
  • Better window resize performance.
  • Added application icon.
Coming features
  • Auto-update interface
  • Export swf files directly from application
  • Drag & drop fonts on application
http://apps.jonsson.be/UTFCompressor.air

May 9, 2010

Building classes with MXMLC

Since the recent post of the UTFCompressor, you might wonder what the hell it´s good for or, just how this will speed up the workprocess when exporting optimized fonts.

Ideally I would write an app that exports a flash font based on a font file directly. Bam you're done.

But then you would have no control over which glyphs are included, some Unicode fonts are extremely large (> 10 MB). This would then wreak havoc online if say you're doing an Asian website in flash, going about it coding in AS3. Every visitor has to load > 10 MB just to see the site.

You could just make shapes of all the texts on the website, but hey. Where's the fun in that?

Right now the AIR platform doesn't support execution of native processes, but that will soon change. For now you will have to make do with this short second phase of font generation.

The Flex SDK uses a binary to compile Actionscript 3. Senocular has a great tutorial on using this to compile your own swf:s.

http://www.senocular.com/flash/tutorials/as3withmxmlc/

1. Add your flexSDK/bin folder in the system path variable.

2. Make a .bat-file with contents similar to:

mxmlc %1 -output %1.swf -as3


3. In UTF Compressor there is this option

Use that to save a class and drop it onto your .bat-file. Now you should have a Flash font lying around somewhere.


If you don't have the Flex SDK, go ahead and download it here.

Go ahead and grab the UTF Compressor while you're at it.

May 8, 2010

UTF Compressor update

Added the "coming features" since I'm at home, bored.

UTF Compressor 1.2.1



Features:
Analyses and optimizes UTF-ranges from entered text, resourceful whilst working with large fonts such as Asian language.
Creates a prewritten class with all font information.
Ability to bake already set ranges such as european letters or numerals.

Download (462K)

Simplify Flex-font embedding

Wrote this little application to make exporting fonts to swf-files through Flex SDK simpler.

UTF Compressor 1.1



Features:
Analyses and optimizes UTF-ranges from entered text, resourceful whilst working with large fonts such as Asian language.
Creates a prewritten class with all font information.

Coming features:
Ability to bake already set ranges such as european letters or numerals.

Download (461K)

Apr 14, 2010

Nice Url in AS3

Feeling generous today, here you go.
(Made to include nordic names)

public static function niceUrl(s:String):String
{
 s = s.toLowerCase();
 s = s.replace(/^\s+|\s+$/g, "");
 s = s.replace(/[_|\s]+/g, "-");
 s = s.replace(/[øöõóò]+/g, "o");
 s = s.replace(/[åäáàãâ]+/g, "a");
 s = s.replace(/[ëéèê]+/g, "e")
 s = s.replace(/[^a-z0-9-\/]+/g, "");
 s = s.replace(/[-]+/g, "-");
 s = s.replace(/^-+|-+$/g, "");

 return s;
}

Mar 17, 2010

Key.isDown(), where did you go?

Got a bit stumped when I realized that multi-keystroke handling was totally removed from AS3. The rabid game programmer in me worked up a little steam while it scurried about the internet looking for a solution. The alternative isn't acceptable, you can't make games without multiple buttons pressed at the same time.

Found a bunch of solutions to this problem, all of them over 100 lines in length. How hard can this problem be?

package Extrude.Utils 
{
 import flash.events.KeyboardEvent; 

 public class Keyhandler
 {
  protected static var _keys:Array = new Array(126);

  public static function onKeyDown(e:KeyboardEvent):void
  { _keys[e.keyCode] = true; }

  public static function onKeyUp(e:KeyboardEvent):void
  { _keys[e.keyCode] = false; }

  public static function isDown(key:uint):Boolean
  { return (_keys[key]); }
 }
}

Feb 20, 2010

Beautiful girls and nice furniture

Just woke, fiddling about with a cup of coffe and feeling good about myself. Had a great time working the last crazy hours of a project that is launching next week.

This is somewhat of a sneak peak, I hope that no one gets their panties in a bunch about it.



Skaargarden.com

It was a really long time since i saw some quality material put in the pipe. Hope that they fare well in todays competitive market.

Jan 24, 2010

Announcing: DropEnc


The last couple of days I've researched the possibility to encode video based on feedback from FFMPEG in AIR. The upcoming desktop application improvements in the AIR 2.0 Beta makes this a possibility.

For once, something that started out as me fooling around in Flex Builder that actually worked. My goal with this encoder is to remove all the technical aspects of video conversion and make it profile based, or just: "Make it simple stupid."

Jan 18, 2010

Leaping headfirst into ExtendScript 2.0

Today we ran into somewhat of a problem at my job. One of our clients had stuffed a server chuck-full with uncompressed TIFF-images. The payload weighed in at the modest amount of 10GB.

Our ability to deliver a somewhat stable way for our customers to deliver content to us vanished, as the veritable meat-pile of images just sat there, customer-satisfaction-blocking us all afternoon.

So i whipped up a quick way for me and my co-workers to quick batch those images into leaner shape.

What we needed for web availability was no more than 1280px-sized images and RGB (sRGB) images.


/////////////////////////////////////////////////////////
// Extrude Weightcutter, v1.1, Extrude Interactive, 2010
// Author: Sven-Erik Jonsson, svenerik@extrude.se
/////////////////////////////////////////////////////////
bringToFront();

var oldUnits = preferences.rulerUnits;
var startDisplayDialogs = displayDialogs;

preferences.rulerUnits = Units.PIXELS;
displayDialogs = DialogModes.NO;

var files = File.openDialog('Choose files to resize', '*.*', true);

if (files)
{
var userImageSize = prompt('Target image size','Enter image size');
var targetImageSize = (!isNaN(parseInt(userImageSize))) ? parseInt(userImageSize) : 1280;

jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.embedColorProfile = true;
jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
jpgSaveOptions.matte = MatteType.NONE;
jpgSaveOptions.quality = 8;

for (var i = 0; i < files.length; i++)
{
var currFile = files[i];
if (currFile.exists)
{
open(currFile);

try
{
if (activeDocument.mode != DocumentMode.RGB) activeDocument.changeMode(ChangeMode.RGB);
if (activeDocument.bitsPerChannel != BitsPerChannelType.EIGHT) activeDocument.bitsPerChannel = BitsPerChannelType.EIGHT;

activeDocument.flatten();

try { activeDocument.convertProfile("sRGB IEC61966-2.1", Intent.PERCEPTUAL, true, true); }
catch(e) {}

var portrait = (activeDocument.height > activeDocument.width);

if (!portrait) activeDocument.resizeImage( targetImageSize, null, 300, ResampleMethod.BICUBIC );
else activeDocument.resizeImage( null, targetImageSize, 300, ResampleMethod.BICUBIC );

var asCopy = (activeDocument.name.toString().indexOf(".jpg") > -1);

activeDocument.saveAs(activeDocument.path, jpgSaveOptions, asCopy);
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
catch(e)
{
alert(e);
}
}
}
}

// Leave no crap behind
displayDialogs = startDisplayDialogs;
preferences.rulerUnits = oldUnits;
purge(PurgeTarget.ALLCACHES);

Download Script

Installation

Put the script in:
Program Files > Adobe > Adobe Photoshop (CS-version) > Presets > Scripts

Restart Photoshop if needed

Activate from:
File > Scripts > ex_weightcutter

Use with caution around jpeg files.