В скриптах 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
Генератор полностью избавил нас от слежения за метками!