[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Игры серии GTA » Ваши проекты » Switch()
Switch()
DK22Pac
Друзья
TOP Скриптер
10.09.13 12:58
Offline
Вот такой вот код получился.
Код
{$CLEO}
{$I switch}

while true
      wait 0
      0209: 0@ = random_int_in_ranges 0 4
      {$I switch(0@)}
          {$I case 1}
              0ACD: show_text_highpriority "First!" time 100
              break
          {$I case 2}
              0ACD: show_text_highpriority "Second!" time 100
              break
          {$I case 3}
              0ACD: show_text_highpriority "Third!" time 100
              break
          {$I default}
              0209: 1@ = random_int_in_ranges 0 3
              {$I switch(1@)}
                  {$I case 1}   
                      0ACD: show_text_highpriority "Zero - First!" time 100
                      break
                  {$I case 2}   
                      0ACD: show_text_highpriority "Zero - Second!" time 100
                      break
                  {$I default}
                      0ACD: show_text_highpriority "Zero - Zero!" time 100
              {$I switch_end}
      {$I switch_end}
end

Что получается на выходе:
Код
{$CLEO .cs}

goto @script_begin  

:SCMFUNC_switch_test_value
0AC6: 1@ = label @HEXDATA_switch_data offset  
0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0  
2@ *= 4  
2@ += 4  
005A: 1@ += 2@ // (int)  
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0  
if  
003B:   0@ == 1@ // (int)  
else_jump @switch_test_value_return_false

:SCMFUNC_switch_return_true
0485:   return_true  
0AB2: ret 0  

:switch_test_value_return_false
059A:   return_false  
0AB2: ret 0  

:SCMFUNC_switch_set_compare_value
0AC6: 1@ = label @HEXDATA_switch_data offset  
0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0  
2@ += 1  
if  
   2@ > 7  
else_jump @switch_set_compare_value_set_value
2@ = 0  

:switch_set_compare_value_set_value
0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0  
2@ *= 4  
2@ += 4  
005A: 1@ += 2@ // (int)  
0A8C: write_memory 1@ size 4 value 0@ virtual_protect 0  
0AB2: ret 0  

:SCMFUNC_switch_decrease_level
0AC6: 1@ = label @HEXDATA_switch_data offset  
0A8D: 0@ = read_memory 1@ size 4 virtual_protect 0  
0@ -= 1  
if  
    not 0@ >= 0  
else_jump @switch_decrease_level_set_level
0@ = 7  

:switch_decrease_level_set_level
0A8C: write_memory 1@ size 4 value 0@ virtual_protect 0  
0AB2: ret 0  

:HEXDATA_switch_data
hex
  07 00 00 00  
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
end

:script_begin
wait 0  
0099: 0@ = random_int_in_ranges_0_to_32767  
0B10: 0@ = 0@ AND 3  
0099: 1@ = random_int_in_ranges_0_to_32767  
0B10: 1@ = 1@ AND 2  
0AB1: call_scm_func @SCMFUNC_switch_set_compare_value 1 0@  
if  
0AB1: call_scm_func @SCMFUNC_switch_return_true 0  
else_jump @switch_1_case_1

:switch_1_case_1
if  
0AB1: call_scm_func @SCMFUNC_switch_test_value 1 _value 1  
else_jump @switch_1_case_2  
0ACD: show_text_highpriority "First!" time 100  
goto @switch_end_2  

:switch_1_case_2
if  
0AB1: call_scm_func @SCMFUNC_switch_test_value 1 _value 2  
else_jump @switch_1_case_3
0ACD: show_text_highpriority "Second!" time 100  
goto @switch_end_2  

:switch_1_case_3
if  
0AB1: call_scm_func @SCMFUNC_switch_test_value 1 _value 3  
else_jump @switch_1_default
0ACD: show_text_highpriority "Third!" time 100  
goto @switch_end_2  

:switch_1_default
if  
0AB1: call_scm_func @SCMFUNC_switch_return_true 0  
else_jump @switch_end_2  
0AB1: call_scm_func @SCMFUNC_switch_set_compare_value 1 _value 1@  
if  
0AB1: call_scm_func @SCMFUNC_switch_return_true 0  
else_jump @switch_2_case_1  

:switch_2_case_1
if  
0AB1: call_scm_func @SCMFUNC_switch_test_value 1 1  
else_jump @switch_2_case_2  
0ACD: show_text_highpriority "Zero - First!" time 100  
goto @switch_end_1  

:switch_2_case_2
if  
0AB1: call_scm_func @SCMFUNC_switch_test_value 1 _value 2  
else_jump @switch_2_default  
0ACD: show_text_highpriority "Zero - Second!" time 100  
goto @switch_end_2  

:switch_2_default
if  
0AB1: call_scm_func @SCMFUNC_switch_return_true 0  
else_jump @switch_end_2  
0ACD: show_text_highpriority "Zero - Zero!" time 100  

:switch_end_2
0AB1: call_scm_func @SCMFUNC_switch_decrease_level 0  

:switch_end_1
0AB1: call_scm_func @SCMFUNC_switch_decrease_level 0  
goto @script_begin
Отредактировал DK22Pac - Вторник, 10.09.13, 14:31

wmysterio
Администраторы
Скриптер
10.09.13 15:00
Offline
Вот чего не хватает в саннике - конструкции switch smile Думаю, для меня, этот код будет очень полезен.

Werewolf
Проверенные
10.09.13 20:53
Offline
И че он делает?

wmysterio
Администраторы
Скриптер
11.09.13 02:00
Offline
Werewolf, Действует как таблица переходов, только в удобной конструкции.

SanKing
Друзья
11.09.13 12:29
Offline
Хорошая вещь этот switch. В Pawno тоже есть.  Да и сам Pawno построен на принципе языка C, а значит, в семействе ЯП C тоже есть этот оператор.

Slivkin-Sergey
Модераторы
11.09.13 18:18
Offline
Я один тут белая ворона никогда не работал на С, поэтому. если можно, объясните - что за код?

Vital
Друзья
Скриптер
11.09.13 19:29
Offline
Slivkin-Sergey, switch - это конструкция, которая переводится как "переключатель", отсюда и сходство с таблицей переходов. Она проверяет значение переменной, и для каждого значения можно задать действие. Схематично можно показать так:
switch переменная :
1 (значение переменной) : действия ;
2 : действия другие ;
3 : действия третьи ;
И так далее. Это самая незамысловатая схемка, но этот switch очень удобен, особенно если сравнить с jump_table.
2109: create_special_actor $VITAL in_front_of_computer

Slivkin-Sergey
Модераторы
26.09.13 20:18
Offline
Я, наверное, дураком покажусь, но не легче ли сделать так?
Код

:SWITCHER_INJT
0871: init_jump_table $CASE total_jumps 8 default_jump 0 @END_CASE_VIDEO_GAME jumps 0 @MS_GAME_THEYCRAWLEDFROMURANUS 1 @MS_GAME_DUALITY 2 @MS_GAME_GOGOSPACEMONKEY 3 @MS_GAME_LETSGETREADYTOBUMBLE 4 @MS_GAME_TRACKBETTING 5 @MS_GAME_POOL 6 @MS_GAME_LOWRIDER

...

:SWITCHER
wait 0
*присваивание значения переменной-свитчеру, например*
if
Actor.Dead($YUSUF)
then
$SWITHCER = 1
else
$SWITCHER = 0
end
$CASE = $SWITHCER
gosub @SWITHCHER_INJT

?

wmysterio
Администраторы
Скриптер
26.09.13 20:45
Offline
Slivkin-Sergey, для меня конструкция switch намного удобнее и привычнее, нежели таблицы переходов

DK22Pac
Друзья
TOP Скриптер
28.09.13 14:08
Offline
Slivkin-Sergey, может хотя бы попробуешь сравнить свой код и мой? А если надо будет сделать 50 случаев?

Slivkin-Sergey
Модераторы
29.09.13 11:43
Offline
DK22Pac, для этого есть другой опкод для таблицы переходов, который позволяет создавать ещё дофига случаев.

К тому же на практике 50 переходов нужны очень редко.

Добавлено (29.09.13, 10:43)
---------------------------------------------
DK22Pac, для этого есть другой опкод для таблицы переходов, который позволяет создавать ещё дофига случаев.

К тому же на практике 50 переходов нужны очень редко.


wmysterio
Администраторы
Скриптер
29.09.13 13:24
Offline
Slivkin-Sergey, суть не в том, сколько переходов исполнить можно. Суть в удобности использования.

Slivkin-Sergey
Модераторы
30.09.13 06:42
Offline
wmysterio, ну, это да. Мне, как никогда не делавшему ничего на С, удобней таблицы прыжков. Хотя синтаксис свитча здесь всё равно довольно отличается от цэшного, почему нельзя подключить одну библиотеку и использовать свитч в его стандартном синтаксисе?

wmysterio
Администраторы
Скриптер
30.09.13 15:21
Offline
Slivkin-Sergey, я об этом говорил Seeman'у. Он сказал, что по-возможности сделает эту конструкцию.

Форум » Игры серии GTA » Ваши проекты » Switch()
Страница 1 из 11
Поиск: