Deltarune (Chapter 3) script viewer

← back to main script listing

gml_GlobalScript_scr_rhythmgame_lyrics

(view raw script w/o annotations or w/e)
1
function scr_rhythmgame_add_lyric(arg0, arg1, arg2 = "")
2
{
3
    with (obj_rhythmgame)
4
    {
5
        if (arg2 == "")
6
        {
7
            arg2 = arg1;
8
            arg1 = string_replace_all(arg1, "-", "");
9
            arg1 = string_replace_all(arg1, "<", "");
10
            arg1 = string_replace_all(arg1, ">", "");
11
            arg1 = string_replace_all(arg1, "<", "");
12
            arg1 = string_replace_all(arg1, ">", "");
13
            arg1 = string_replace_all(arg1, "+", "");
14
            arg1 = string_replace_all(arg1, "+", "");
15
        }
16
        lyric_time[lyric_count] = arg0;
17
        lyrics[lyric_count] = arg1;
18
        censored_lyrics[lyric_count] = arg2;
19
        lyric_count++;
20
    }
21
}
22
23
function scr_rhythmgame_clear_lyric(arg0)
24
{
25
    with (obj_rhythmgame)
26
    {
27
        lyric_time[lyric_count] = arg0;
28
        lyrics[lyric_count] = "";
29
        censored_lyrics[lyric_count] = "";
30
        lyric_count++;
31
    }
32
}
33
34
function scr_rhythmgame_clear_all_lyrics()
35
{
36
    with (obj_rhythmgame)
37
    {
38
        lyric_time = [];
39
        lyrics = [];
40
        censored_lyrics = [];
41
        lyric_start = [];
42
        lyric_start[0] = 0;
43
        lyric_end = [];
44
        lyric_end[0] = 0;
45
        lyric_count = 0;
46
        current_lyric = "";
47
        censored_lyric = "";
48
    }
49
}
50
51
function scr_rhythmgame_parse_lyrics(arg0)
52
{
53
    with (obj_rhythmgame)
54
    {
55
        array_resize(string_index, 0);
56
        string_index[0] = 0;
57
        var _char_count = 0;
58
        var _space = true;
59
        for (i = 0; i < string_length(_mainstring); i++)
60
        {
61
            var _letter = string_char_at(_mainstring, i);
62
            if (_space && _letter != " " && _letter != " ")
63
            {
64
                string_index[_char_count] = i;
65
                _space = false;
66
                _char_count++;
67
            }
68
            else if ((_letter == " " || _letter == " ") && !_space)
69
            {
70
                string_index[_char_count] = i;
71
                _space = true;
72
                _char_count++;
73
            }
74
        }
75
        if (!_space)
76
        {
77
            string_index[_char_count] = string_length(_mainstring) - 1;
78
            char_count++;
79
        }
80
    }
81
}
82
83
function scr_rhythmgame_draw_lyrics(arg0, arg1, arg2)
84
{
85
    if (is_undefined(lyrics_base_surface) || !surface_exists(lyrics_base_surface))
86
        lyrics_base_surface = surface_create(400, 100);
87
    if (is_undefined(lyrics_main_surface) || !surface_exists(lyrics_main_surface))
88
        lyrics_main_surface = surface_create(400, 100);
89
    var _xx = 200;
90
    var _yy = 50;
91
    surface_set_target(lyrics_main_surface);
92
    draw_clear_alpha(c_black, 0);
93
    draw_set_halign(fa_center);
94
    draw_set_valign(fa_middle);
95
    draw_set_color(c_black);
96
    var _scale = arg2;
97
    scr_draw_text_monospace(_xx - _scale, _yy, arg0);
98
    scr_draw_text_monospace(_xx + _scale, _yy, arg0);
99
    scr_draw_text_monospace(_xx, _yy - _scale, arg0);
100
    scr_draw_text_monospace(_xx, _yy + _scale, arg0);
101
    draw_set_color(c_white);
102
    scr_draw_text_monospace(200, _yy, arg0);
103
    surface_reset_target();
104
    if (is_undefined(lyrics_sung_surface) || !surface_exists(lyrics_sung_surface))
105
        lyrics_sung_surface = surface_create(400, 100);
106
    surface_set_target(lyrics_sung_surface);
107
    var _len = string_length(arg0);
108
    scr_draw_text_monospace(_xx - _scale, _yy, arg1, 8, 18, _len);
109
    scr_draw_text_monospace(_xx + _scale, _yy, arg1, 8, 18, _len);
110
    scr_draw_text_monospace(_xx, _yy - _scale, arg1, 8, 18, _len);
111
    scr_draw_text_monospace(_xx, _yy + _scale, arg1, 8, 18, _len);
112
    draw_set_color(c_blue);
113
    scr_draw_text_monospace(_xx, _yy, arg1, 8, 18, _len, true);
114
    draw_set_color(c_white);
115
    surface_reset_target();
116
}
117
118
function scr_draw_text_monospace(arg0, arg1, arg2, arg3 = 8, arg4 = 18, arg5 = -1, arg6 = false, arg7 = 2, arg8 = 2, arg9 = -1)
119
{
120
    arg3 *= arg7;
121
    arg4 *= arg8;
122
    var _length = (arg5 > 0) ? arg5 : string_length(arg2);
123
    var _width = _length * arg3;
124
    var _writex = arg0;
125
    var _writey = arg1;
126
    var _hspace = arg3;
127
    var _vspace = arg4;
128
    var _linebreak = string_pos("#", arg2);
129
    var _chiisai = "ゃょゅャュョぁぃぅぇぉァィゥェォゎヮ";
130
    var _timesyntax = "-<>+~<>+~";
131
    var _ja = global.lang == "ja";
132
    var _syllables = 0;
133
    var _single = false;
134
    var _kanji_substring = false;
135
    var _chiisai_count = 0;
136
    if (_linebreak > 0)
137
    {
138
        _writey -= ((_vspace / 2) - 6);
139
        if (arg5 == 0)
140
            _length--;
141
        if (arg9 == 0)
142
            _width = (_linebreak - 1) * arg3;
143
    }
144
    var _timing = arg6;
145
    if (_timing)
146
    {
147
        array_resize(lyric_start, 0);
148
        array_resize(lyric_end, 0);
149
        line_switch = 0;
150
    }
151
    var _index = 0;
152
    var _midword = false;
153
    if (draw_get_halign() == 1)
154
        _writex += ((-_width / 2) + (arg3 / 2));
155
    else if (draw_get_halign() == 2)
156
        _writex += (-_width + arg3);
157
    var _scale = 1;
158
    var _prealign = true;
159
    for (i = 1; i <= string_length(arg2); i++)
160
    {
161
        var _letter = string_char_at(arg2, i);
162
        if (_prealign)
163
        {
164
            if (_letter == " " || _letter == " ")
165
            {
166
                _length--;
167
                _writex -= arg3;
168
                continue;
169
            }
170
            else
171
            {
172
                _prealign = false;
173
            }
174
        }
175
        if (_letter == "[")
176
        {
177
            i++;
178
            var _subscale = real(string_digits(string_char_at(arg2, i)));
179
            i += 2;
180
            var _subcount = 0;
181
            for (i2 = i; i2 <= string_length(arg2); i2++)
182
            {
183
                var _subletter = string_char_at(arg2, i2);
184
                if (_subletter == "]")
185
                    break;
186
                else if (string_pos(_subletter, _timesyntax) <= 0)
187
                    _subcount++;
188
            }
189
            _scale = _subscale / _subcount;
190
            _hspace = arg3 * _scale;
191
            _writex += ((-arg3 / 2) + (_hspace / 2));
192
            _letter = string_char_at(arg2, i);
193
        }
194
        else if (_letter == "]")
195
        {
196
            _scale = 1;
197
            _writex += ((-_hspace / 2) + (arg3 / 2));
198
            _hspace = arg3;
199
            continue;
200
        }
201
        if (_letter == " " || _letter == " ")
202
        {
203
            if (_midword && _timing)
204
            {
205
                if (_ja && _syllables > 0 && !_kanji_substring)
206
                {
207
                    _index = scr_rhythmgame_kanji_timing(_index, _syllables, _writex, _hspace);
208
                    _syllables = 0;
209
                }
210
                else
211
                {
212
                    lyric_end[_index] = (_writex - (_hspace / 2)) + 2;
213
                    _index++;
214
                }
215
                _midword = false;
216
            }
217
        }
218
        else if (_ja && (_letter == "<" || _letter == "<"))
219
        {
220
            if (_timing)
221
            {
222
                _single = true;
223
                if (_midword)
224
                {
225
                    lyric_end[_index] = (_writex - (_hspace / 2)) + 2;
226
                    _index++;
227
                    _midword = false;
228
                }
229
                _kanji_substring = true;
230
            }
231
            continue;
232
        }
233
        else if (_ja && (_letter == "+" || _letter == "+" || _letter == "~" || _letter == "~"))
234
        {
235
            if (_timing)
236
            {
237
                if (_kanji_substring)
238
                    _single = false;
239
                if (!_kanji_substring && _syllables == 0)
240
                    _syllables += 2;
241
                else
242
                    _syllables++;
243
            }
244
            continue;
245
        }
246
        else if (_ja && (_letter == ">" || _letter == ">"))
247
        {
248
            if (_timing)
249
            {
250
                if (_single)
251
                {
252
                    _syllables = 1;
253
                    _single = false;
254
                }
255
                if (_syllables > 0)
256
                {
257
                    _index = scr_rhythmgame_kanji_timing(_index, _syllables, _writex, _hspace);
258
                    _syllables = 0;
259
                }
260
                _kanji_substring = false;
261
                _midword = false;
262
            }
263
            continue;
264
        }
265
        else if (_letter == "-")
266
        {
267
            if (_timing)
268
            {
269
                lyric_end[_index] = (_writex - (_hspace / 2)) + 2;
270
                _index++;
271
                lyric_start[_index] = (_writex - (_hspace / 2)) + 2;
272
            }
273
            continue;
274
        }
275
        else if (_letter == "#")
276
        {
277
            if (_timing)
278
            {
279
                if (_midword)
280
                {
281
                    _midword = false;
282
                    lyric_end[_index] = (_writex - (_hspace / 2)) + 2;
283
                    _index++;
284
                }
285
                line_switch = _index;
286
            }
287
            _writey = arg1 + ((_vspace / 2) - 6);
288
            if (arg9 > 0)
289
                _length = arg9;
290
            else
291
                _length = ((arg5 > 0) ? arg5 : string_length(arg2)) - _linebreak;
292
            _width = _length * arg3;
293
            _writex = (arg0 - (_width / 2)) + (arg3 / 2);
294
            continue;
295
        }
296
        else
297
        {
298
            if (_ja)
299
            {
300
                if (_timing)
301
                {
302
                    var _is_chiisai = string_pos(_letter, _chiisai) > 0;
303
                    if (_is_chiisai)
304
                        _chiisai_count++;
305
                    if (!_midword && _is_chiisai)
306
                        debug_print("WARNING! chiisai STARTED A STRING");
307
                    if (_kanji_substring)
308
                    {
309
                        _syllables++;
310
                    }
311
                    else if (_midword && _syllables > 0 && !_kanji_substring)
312
                    {
313
                        _index = scr_rhythmgame_kanji_timing(_index, _syllables, _writex, _hspace);
314
                        _syllables = 0;
315
                        _midword = false;
316
                    }
317
                    else if (_midword && !_is_chiisai)
318
                    {
319
                        lyric_end[_index] = _writex - (_hspace / 2) - 2;
320
                        _index++;
321
                        _midword = false;
322
                    }
323
                    if (!_midword)
324
                    {
325
                        lyric_start[_index] = _writex - (_hspace / 2) - 2;
326
                        _midword = true;
327
                    }
328
                }
329
            }
330
            else if (!_midword && _timing)
331
            {
332
                lyric_start[_index] = _writex - (_hspace / 2) - 2;
333
                _midword = true;
334
            }
335
            if (!_timing)
336
                draw_text_transformed(_writex, _writey, _letter, _scale * arg7, arg8, 0);
337
        }
338
        _writex += _hspace;
339
    }
340
    if (_midword && _timing)
341
    {
342
        if (_ja && _syllables > 0)
343
        {
344
            _index = scr_rhythmgame_kanji_timing(_index, _syllables, _writex, _hspace);
345
            _syllables = 0;
346
        }
347
        else
348
        {
349
            lyric_end[_index] = (_writex - (arg3 / 2)) + 2;
350
        }
351
    }
352
    if (array_length(lyric_start) != array_length(lyric_end))
353
        debug_print("WARNING!!! Lyric start/end array mismatch!!");
354
}
355
356
function scr_rhythmgame_kanji_timing(arg0, arg1, arg2, arg3)
357
{
358
    var _substart = lyric_start[arg0];
359
    var _subend = (arg2 - (arg3 / 2)) + 2;
360
    var _subpos = 0;
361
    for (var _sylb = 1; _sylb <= arg1; _sylb++)
362
    {
363
        _subpos = round_to_multiple(lerp(_substart, _subend, _sylb / arg1), 2);
364
        lyric_end[arg0] = _subpos;
365
        arg0++;
366
        if (_sylb < arg1)
367
            lyric_start[arg0] = round(_subpos);
368
    }
369
    return arg0;
370
}