Таблицы переходов

В скриптах MAIN.SCM для GTA San Andreas есть возможность использовать таблицы переходов. Конструкция имеет громадный размер! Постоянно редактировать метки, добавление или удаление блоков было очень нудным и клопотным делом.

Генератор скриптов существенно упрощает написание подобного рода код. Для каждого блока используется отдельная анонимная функция. Индексация происходит автоматически и начинается с нуля. Вот так можно написать код таблицы переходов:

[Thread]
public void TEST() {

    var anyInt = Int.local( 0 ).random( 0, 10 ); // 0@

    jump_table( anyInt
        ,  delegate { // 0
            comment = "case #0";
        }, delegate { // 1
            comment = "case #1";
        }, delegate { // 2
            comment = "case #2";
        }, delegate { // 3
            comment = "case #3";
        }, delegate { // 4
            comment = "case #4";
        }, delegate { // 5
            comment = "case #5";
        }, delegate { // 6
            comment = "case #6";
        }, delegate { // 7
            comment = "case #7";
        }, delegate { // 8
            comment = "case #8";
        }, delegate { // 9
            comment = "case #9";
        }, delegate { // 10
            comment = "case #10";
        }
    );

    comment = "after jump table...";

    end_thread();
}

Если количество блоков превысит максимальный размер, то автоматически будет создано продолжение таблицы переходов, как это показано ниже, в результате:

//------------- TEST ---------------

:TEST
03A4: name_thread 'TEST'
0209: 0@ = random_int_in_ranges 0 10
0871: init_jump_table 0@ total_jumps 11 default_jump 0 @TEST_SWITCH_0_CASE_END jumps 0 @TEST_SWITCH_0_CASE_0 1 @TEST_SWITCH_0_CASE_1 2 @TEST_SWITCH_0_CASE_2 3 @TEST_SWITCH_0_CASE_3 4 @TEST_SWITCH_0_CASE_4 5 @TEST_SWITCH_0_CASE_5 6 @TEST_SWITCH_0_CASE_6
0872: jump_table_jumps 7 @TEST_SWITCH_0_CASE_7 8 @TEST_SWITCH_0_CASE_8 9 @TEST_SWITCH_0_CASE_9 10 @TEST_SWITCH_0_CASE_10 -1 @TEST_SWITCH_0_CASE_END -1 @TEST_SWITCH_0_CASE_END -1 @TEST_SWITCH_0_CASE_END -1 @TEST_SWITCH_0_CASE_END -1 @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_0
/* case #0 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_1
/* case #1 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_2
/* case #2 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_3
/* case #3 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_4
/* case #4 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_5
/* case #5 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_6
/* case #6 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_7
/* case #7 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_8
/* case #8 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_9
/* case #9 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_10
/* case #10 */
0002: jump @TEST_SWITCH_0_CASE_END

:TEST_SWITCH_0_CASE_END
/* after jump table... */
004E: end_thread

Генератор полностью избавил нас от слежения за метками!