Get the full commented source code of

HTML5 Suika Watermelon Game

Talking about Flash and Reviews.

Ok… you made it… you made the Flash game that will kick asses and you are sure nobody knows Actionscript like you. Nobody will clone your game because you know ActionScript better than the rest.

If you really know ActionScript, you should now that even if SWF files are compiled, they can be easily decompiled with a lot of softwares available on the net. Just Google for Flash Decompiler to see the most famous ones.

This means that once you published your file, everybody can do reverse engineering on your file and know how did you coded it.

And even if bigger projects are hard to understand, someone may decompile your game, change your logo with another one and submit it in all portals before you do it.

If you think people won’t waste their time decompiling your game, you are wrong. They will do it… maybe to hack your highscores, or maybe to put their name in the credits and show their friends what a cool game they made… for a reason or for another, they will do it.

That’s when Amayeta comes in our help with its SWF Encrypt. Available both for Windos and Mac OSX encrypts your Adobe Flash SWF files, protecting them from the most popular Flash Decompiler Tools on the market.

Sounds good… here I am for a test drive…

Amayeta’s SWF Encrypt (ASWFE from now on) takes less than 5MB on your hard drive, and once you lauch it you will see this screen:

Amayeta SWF Encrypt

ASWFE shows your unprotected SWF files with a red background and the protected ones with a green background.

In the bottom window you can preview the movie you currently selected. As you can see, I am trying to protect my prototype of Metro Siberia Underground game.

Now just press Encrypt File(s) and you will find a SWF file with the _secure suffix. In my case, the original file was 1butt3.swf, and the new one is 1butt3_secure.swf. Please notice that I did not change any option, and I don’t play with strange setups. ASWFE works very well with default options, and all you have to do is pressing a button.

But the final question is: will it work? I tried to decompile 1butt3.swf, the unprotected file, and that’s what I got:

// Action script...

// [Action in Frame 1]
var ship_filter = new flash.filters.GlowFilter(65280, 8.000000E-001, 4, 4, 2, 3, false, false);
var smoke_filter = new flash.filters.GlowFilter(16711680, 8.000000E-001, 4, 4, 2, 3, false, false);
var tunnel_filter = new flash.filters.GlowFilter(16776960, 8.000000E-001, 4, 4, 2, 3, false, false);
var fuel_filter = new flash.filters.GlowFilter(65535, 8.000000E-001, 4, 4, 2, 3, false, false);
var rock_filter = new flash.filters.GlowFilter(16777215, 8.000000E-001, 4, 4, 2, 3, false, false);
var score_filter = new flash.filters.GlowFilter(16711935, 8.000000E-001, 2, 4, 2, 3, false, false);
gravity = 1.000000E-001;
thrust = 2.500000E-001;
yspeed = 0;
xspeed = 5;
distance = 0;
smoke_interval = 10000;
frames_passed = 0;
tunnel_height = 150;
fuel_freq = 10;
gasoline = 500;
rock_freq = 50;
engines = false;
_root.attachMovie("ship", "ship", _root.getNextHighestDepth(), {_x: 150, _y: 200});
_root.createEmptyMovieClip("fuel_movie", _root.getNextHighestDepth());
_root.createEmptyMovieClip("deadly_movie", _root.getNextHighestDepth());
_root.attachMovie("score", "score", _root.getNextHighestDepth());
ship.filters = new Array(ship_filter);
score.filters = new Array(score_filter);
ship.onEnterFrame = function ()
{
    score.sc.text = "Distance: " + distance + " - " + "Fuel: " + gasoline;
    if (gasoline > 0 && engines)
    {
        yspeed = yspeed - thrust;
        smoke_interval = smoke_interval - 2.500000E-001;
        gasoline = gasoline - 1;
    } // end if
    if (Math.random() * 1000 < fuel_freq)
    {
        fuel = fuel_movie.attachMovie("fuel", "fuel" + fuel_movie.getNextHighestDepth(), fuel_movie.getNextHighestDepth(), {_x: 510, _y: Math.random() * 400 + 50});
        fuel.filters = new Array(fuel_filter);
        fuel.onEnterFrame = function ()
        {
            this._x = this._x - xspeed * 1.200000E+000;
            dist_x = ship._x + 28 * Math.cos(angle) - this._x;
            dist_y = ship._y + 28 * Math.sin(angle) - this._y;
            dist = Math.sqrt(dist_x * dist_x + dist_y * dist_y);
            if (dist < 10)
            {
                gasoline = gasoline + 100;
                this.removeMovieClip();
            } // end if
            if (this._x < -10)
            {
                this.removeMovieClip();
            } // end if
        };
    } // end if
    if (Math.random() * 1000 < rock_freq)
    {
        rock = deadly_movie.attachMovie("rock", "rock" + deadly_movie.getNextHighestDepth(), deadly_movie.getNextHighestDepth(), {_x: 510, _y: Math.random() * 400 + 50, _rotation: Math.random() * 360});
        rock.filters = new Array(rock_filter);
        rock.onEnterFrame = function ()
        {
            this._x = this._x - xspeed;
            if (this._x < -10)
            {
                this.removeMovieClip();
            } // end if
        };
    } // end if
    yspeed = yspeed + gravity;
    this._y = this._y + yspeed;
    angle = Math.atan2(yspeed, xspeed);
    this._rotation = angle * 180 / 3.141593E+000;
    ++frames_passed;
    distance = distance + xspeed;
    if (frames_passed >= smoke_interval)
    {
        sm = _root.attachMovie("smoke", "smoke" + _root.getNextHighestDepth(), _root.getNextHighestDepth(), {_x: this._x - 2, _y: this._y});
        sm.filters = new Array(smoke_filter);
        sm.onEnterFrame = function ()
        {
            this._x = this._x - xspeed;
            this._width = this._width + 2.000000E-001;
            this._height = this._height + 2.000000E-001;
            this._alpha = this._alpha - 2;
            if (this._alpha <= 0)
            {
                this.removeMovieClip();
            } // end if
        };
        frames_passed = 0;
    } // end if
    if (this._y > 400 || this._y < 0 || deadly_movie.hitTest(this._x + 28 * Math.cos(angle), this._y + 28 * Math.sin(angle), true) || deadly_movie.hitTest(this._x + 8 * Math.cos(angle + 1.570796E+000), this._y + 8 * Math.sin(angle + 1.570796E+000), true) || deadly_movie.hitTest(this._x + 8 * Math.cos(angle - 1.570796E+000), this._y + 8 * Math.sin(angle - 1.570796E+000), true))
    {
        yspeed = 0;
        this._y = 200;
        gasoline = 500;
        distance = 0;
        deadly_movie.removeMovieClip();
        fuel_movie.removeMovieClip();
        _root.createEmptyMovieClip("fuel_movie", _root.getNextHighestDepth());
        _root.createEmptyMovieClip("deadly_movie", _root.getNextHighestDepth());
    } // end if
};
_root.onMouseDown = function ()
{
    engines = true;
    smoke_interval = 10;
};
_root.onMouseUp = function ()
{
    engines = false;
    smoke_interval = 100000;
};

It changed some logical operators (or with ||) and made some minor changes, but the code is perfectly readable.

Now, let's decompile the protected file:

// Action script...

// [Action in Frame 1]
function ()
{
    \x03 = 2568 % 511 * 5;
    return (eval("\x03"));
} // End of the function
var \x01 = 439 + \x04\x05();
for (\x01 = eval("\x01") - 372; eval("\x01") == 590; \x01 = eval("\x01") + 140)
{
} // end of for
if (eval("\x01") == 933)
{
    \x01 = eval("\x01") - 21;
    
}
else
{
    \x01 = eval("\x01") - 51;
    var null = true;
    if (eval("\x01") == 810)
    {
        \x01 = eval("\x01") + 123;
        
    } // end if
    if (eval("\x01") == 636)
    {
        \x01 = eval("\x01") - 46;
        
        
    } // end if
    if (eval("\x01") == 132)
    {
        \x01 = eval("\x01") + 504;
        if (!null)
        {
        }
        else
        {
            \x01 = eval("\x01") - 46;
        } // end else if
        
    } // end if
    if (eval("\x01") == 594)
    {
        \x01 = eval("\x01") - 8;
        
    } // end if
    if (eval("\x01") == 872)
    {
        \x01 = eval("\x01") - 142;
        
    } // end if
    if (eval("\x01") == 96)
    {
        \x01 = eval("\x01") + 714;
        if (!null)
        {
        }
        else
        {
            \x01 = eval("\x01") + 123;
        } // end else if
        
    } // end if
    \x01 = eval("\x01") + 223;
    if (eval("\x01") == 116)
    {
        \x01 = eval("\x01") - 20;
        
    } // end if
    if (eval("\x01") == 687)
    {
        \x01 = eval("\x01") - 571;
        
    } // end if
    if (eval("\x01") == 953)
    {
        \x01 = eval("\x01") - 574;
        if (true)
        {
        }
        else
        {
            \x01 = eval("\x01") + 319;
        } // end else if
        
    } // end if
    if (eval("\x01") == 912)
    {
        \x01 = eval("\x01") - 912;
        
    } // end if
    \x01 = eval("\x01") - 199;
    if (eval("\x01") == 379)
    {
        \x01 = eval("\x01") + 319;
        
        
    } // end if
    if (eval("\x01") == 698)
    {
        \x01 = eval("\x01") - 112;
        
    } // end if
    \x01 = eval("\x01") + 351;
    
} // end else if

What a mess! The script s full of strange variables and if you try to execute it in Flash, it will produce tons of errors.

The script is definitively unreadable.

Try before buy

You can download a trial version limited to 15 encryptions and displaying a watermark on your file (useless if you publish your work in the web, useful if you submit a game to Flash Game License) or buy it at $125. If you want to get serious in ActionScript development, you need to protect your work, and at the moment ASWFE is the perfect solution.

Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.