Using Scaleform

Scaleform GFx is the native GUI for GTA V, based on Flash technology using ActionScript 2, which is a superset of ECMAScript (JavaScript) - read more on Wikipedia.

Development environment

In order to develop custom .gfx assets (optimized SWF) you need to have Adobe Flash Pro CS6, use ActionScript 2 (version 3 has a different virtual machine which is not supported by the version GFx GTA uses) and target Flash Player 8.0.

To convert a .swf file produced by Adobe Flash into .gfx, you need the gfxexport.exe tool from the Scaleform GFx SDK (version 4.0 is fine).


Scaleform doesn’t implement some features from Flash:


You can interface with scaleforms by performing native calls from the GRAPHICS namespace with scaleform in their name.

This variable serves as a kind of public API of the .gfx.


It’d be pretty time consuming to explain in details how to bootstrap your first gfx thing, so instead please use the boilerplate:

  • (5 kB)
  • Loading

    1. Use REQUEST_SCALEFORM_MOVIE) with the name of the desired gfx (without file extension), for example mp_car_stats.
    2. Use HAS_SCALEFORM_MOVIE_LOADED) in a loop, to prevent using a non-loaded Scaleform asset.

    Invoking functions in GFx

    Please note that this is a low-level api, the C# runtime has an easy-to-use high-level abstraction; and even if you don’t know C# you can use it as a reference usage of function calling natives.

    > Call _PUSH_SCALEFORM_MOVIE_FUNCTION to initialize the function call, pass it the handle of the GFx, and a function name string, which should be a member of the global TIMELINE variable in ActionScript.

    > Define arguments, using one of the following functions depending on what type of argument you want to pass:

    > Call _POP_SCALEFORM_MOVIE_FUNCTION_VOID to finish function call.


    You can draw scaleform using one of these comamnds, red, green, blue, alpha and unk parameters can be omitted as they don’t affect anything:


    Can be faked using the function DRAW_SCALEFORM_MOVIE_FULLSCREEN_MASKED, where the first gfx is what you want to render, and the second gfx is a mask for it.

    This masking has no antialising, it doesn’t perform “smooth” masking, if a particular pixel of masking gfx is not fully transparent, then the underlying pixel will be fully shown.

    Using textures

    In normal Flash you can simply load an image into MovieClip (see MovieClipLoader class in AS2 docs) using its (http[s]) url, however in-game you need the img protocol.

    Example of correct image url: img://mpcarhud/albany, where mpcarhud is the name of a texture dictionary, and albany is the texture name in said TXD.