Deltarune (Chapter 4) script viewer

← back to main script listing

gml_GlobalScript_scr_retro_pal_swapper

(view raw script w/o annotations or w/e)
1
function pal_swap_init_system(arg0, arg1, arg2)
2
{
3
    var _swapper = 
4
    {
5
        shader: -4,
6
        html5: false,
7
        html5_sprite: -4,
8
        html5_surface: -4,
9
        texel_size: [0],
10
        uvs: [0],
11
        index: [0],
12
        texture: [0],
13
        layer_priority: 0,
14
        layer_temp_priority: 0,
15
        layer_map: 0,
16
        
17
        cleanup: function()
18
        {
19
            ds_priority_destroy(layer_priority);
20
            ds_priority_destroy(layer_temp_priority);
21
            ds_map_destroy(layer_map);
22
        }
23
    };
24
    _swapper.html5 = false;
25
    if (!_swapper.html5)
26
    {
27
        _swapper.shader = arg0;
28
        _swapper.texel_size[0] = shader_get_uniform(arg0, "u_pixelSize");
29
        _swapper.uvs[0] = shader_get_uniform(arg0, "u_Uvs");
30
        _swapper.index[0] = shader_get_uniform(arg0, "u_paletteId");
31
        _swapper.texture[0] = shader_get_sampler_index(arg0, "u_palTexture");
32
    }
33
    else
34
    {
35
        if (arg1 == undefined || arg2 == undefined)
36
        {
37
            show_message("Must provide pal_swap_init_system() with 2 additional arguments for HTML5 Compatible Sprite and Surface Shaders");
38
            game_end();
39
        }
40
        _swapper.html5_sprite = arg1;
41
        _swapper.html5_surface = arg2;
42
        _swapper.texel_size[1] = shader_get_uniform(arg1, "u_pixelSize");
43
        _swapper.uvs[1] = shader_get_uniform(arg1, "u_Uvs");
44
        _swapper.index[1] = shader_get_uniform(arg1, "u_paletteId");
45
        _swapper.texture[1] = shader_get_sampler_index(arg1, "u_palTexture");
46
        _swapper.texel_size[2] = shader_get_uniform(arg2, "u_pixelSize");
47
        _swapper.uvs[2] = shader_get_uniform(arg2, "u_Uvs");
48
        _swapper.index[2] = shader_get_uniform(arg2, "u_paletteId");
49
        _swapper.texture[2] = shader_get_sampler_index(arg2, "u_palTexture");
50
    }
51
    _swapper.layer_priority = ds_priority_create();
52
    _swapper.layer_temp_priority = ds_priority_create();
53
    _swapper.layer_map = ds_map_create();
54
    global.retro_pal_swapper = _swapper;
55
}
56
57
function pal_swap_set(arg0, arg1, arg2)
58
{
59
    var _swapper = global.retro_pal_swapper;
60
    if (arg1 == 0)
61
        exit;
62
    var _mode = 0;
63
    if (!arg2)
64
    {
65
        if (_swapper.html5)
66
        {
67
            shader_set(_swapper.html5_sprite);
68
            _mode = 1;
69
        }
70
        else
71
        {
72
            shader_set(_swapper.shader);
73
        }
74
        var _tex = sprite_get_texture(arg0, 0);
75
        var _UVs = sprite_get_uvs(arg0, 0);
76
        texture_set_stage(_swapper.texture[_mode], _tex);
77
        var _texel_x = texture_get_texel_width(_tex);
78
        var _texel_y = texture_get_texel_height(_tex);
79
        var _texel_hx = _texel_x * 0.5;
80
        var _texel_hy = _texel_y * 0.5;
81
        shader_set_uniform_f(_swapper.texel_size[_mode], _texel_x, _texel_y);
82
        shader_set_uniform_f(_swapper.uvs[_mode], _UVs[0] + _texel_hx, _UVs[1] + _texel_hy, _UVs[2], _UVs[3]);
83
        shader_set_uniform_f(_swapper.index[_mode], arg1);
84
    }
85
    else
86
    {
87
        if (_swapper.html5)
88
        {
89
            shader_set(_swapper.html5_surface);
90
            _mode = 2;
91
        }
92
        else
93
        {
94
            shader_set(_swapper.shader);
95
        }
96
        var _tex = surface_get_texture(arg0);
97
        texture_set_stage(_swapper.texture[_mode], _tex);
98
        var _texel_x = texture_get_texel_width(_tex);
99
        var _texel_y = texture_get_texel_height(_tex);
100
        var _texel_hx = _texel_x * 0.5;
101
        var _texel_hy = _texel_y * 0.5;
102
        shader_set_uniform_f(_swapper.texel_size[_mode], _texel_x, _texel_y);
103
        shader_set_uniform_f(_swapper.uvs[_mode], _texel_hx, _texel_hy, 1 + _texel_hx, 1 + _texel_hy);
104
        shader_set_uniform_f(_swapper.index[_mode], arg1);
105
    }
106
}
107
108
function pal_swap_reset()
109
{
110
    if (shader_current() != -1)
111
        shader_reset();
112
}
113
114
function pal_swap_layer_init()
115
{
116
    ds_map_clear(global.retro_pal_swapper.layer_map);
117
    ds_priority_clear(global.retro_pal_swapper.layer_priority);
118
    ds_priority_clear(global.retro_pal_swapper.layer_temp_priority);
119
}
120
121
function pal_swap_set_layer(arg0, arg1, arg2, arg3)
122
{
123
    var _data = ds_map_find_value(global.retro_pal_swapper.layer_map, arg2);
124
    if (_data == undefined)
125
        exit;
126
    ds_map_set(global.retro_pal_swapper.layer_map, arg2, 
127
    {
128
        sprite: arg0,
129
        index: arg1,
130
        is_surf: arg3
131
    });
132
}
133
134
function pal_swap_enable_layer(arg0)
135
{
136
    if (!layer_exists(arg0))
137
        exit;
138
    var _data = 
139
    {
140
        sprite: undefined,
141
        index: undefined,
142
        is_surf: undefined
143
    };
144
    layer_script_begin(arg0, function()
145
    {
146
        if (event_type == ev_draw)
147
        {
148
            var _id = ds_priority_delete_min(global.retro_pal_swapper.layer_priority);
149
            var _data = ds_map_find_value(global.retro_pal_swapper.layer_map, _id);
150
            if (_data == "")
151
                exit;
152
            pal_swap_set(_data.sprite, _data.index, _data.is_surf);
153
            ds_priority_add(global.retro_pal_swapper.layer_temp_priority, _id, layer_get_depth(_id));
154
        }
155
    });
156
    layer_script_end(arg0, function()
157
    {
158
        if (event_type == ev_draw)
159
        {
160
            pal_swap_reset();
161
            if (ds_priority_empty(global.retro_pal_swapper.layer_priority))
162
            {
163
                ds_priority_copy(global.retro_pal_swapper.layer_priority, global.retro_pal_swapper.layer_temp_priority);
164
                ds_priority_clear(global.retro_pal_swapper.layer_temp_priority);
165
            }
166
        }
167
    });
168
    ds_map_set(global.retro_pal_swapper.layer_map, arg0, _data);
169
    ds_priority_add(global.retro_pal_swapper.layer_priority, arg0, layer_get_depth(arg0));
170
}